Как равномерно разместить точки внутри контура
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как равномерно разместить точки внутри контура

Как равномерно разместить точки внутри контура

Ответ
Поиск в этой теме
Непрочитано 02.12.2010, 21:46 #1
Как равномерно разместить точки внутри контура
swkx
 
Регистрация: 22.01.2010
Сообщений: 311

Контур - замкнутая 2D-полилиния неправильной формы.
Условия размещения: макс. и мин. расстояния между точками и макс. и мин. расстояния от точек до границ контура.
Подскажите алгоритм.
Просмотров: 6830
 
Непрочитано 02.12.2010, 22:16
#2
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Заштриховать густой штриховкой с точками, взорвать, а затем применительно к каждй точке набора очистить пространство вокруг нее на заданный радиус. Набор будет редеть до определенного уровня.
Supermax вне форума  
 
Автор темы   Непрочитано 02.12.2010, 22:24
#3
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Мне это тоже пришло в голову))
Вернее, не именно это, но тоже использовать взорванную штриховку.

Хочу другие варианты!
swkx вне форума  
 
Непрочитано 02.12.2010, 22:56
#4
T-Yoke

Артиллерист - вертолётчик. Дипломированный инженер-механик. Technologist
 
Регистрация: 29.11.2004
Где-то около Москвы
Сообщений: 16,753
Отправить сообщение для T-Yoke с помощью Skype™


Цитата:
Сообщение от swkx Посмотреть сообщение
Контур - замкнутая 2D-полилиния неправильной формы.
Условия размещения: макс. и мин. расстояния между точками и макс. и мин. расстояния от точек до границ контура.
Подскажите алгоритм.
Если Контур - замкнутая 2D-полилиния, то возможен вариант использовать эквидистант с типом линии "точки"
Варьируете отсупом между линиями и расстоянием между точками, думаю должно получиться.
__________________
«Артиллерия не токмо грохот, но и наука!» Пётр I
T-Yoke вне форума  
 
Автор темы   Непрочитано 02.12.2010, 23:16
#5
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Тоже вариант. Затем полученный меньший контур считать исходным и т.д.
Но, может, есть что попроще...

Последний раз редактировалось swkx, 03.12.2010 в 08:37.
swkx вне форума  
 
Непрочитано 03.12.2010, 13:10
#6
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


интересная задачка
я бы решал так:
Алгоритм 1
1. делаем аппроксимацию контура с небольшим шагом (достаточно в два раза меньше расстояния между точками)
2. округляем вершины и удаляем повторы
3. сортируем полученные вершины, чтоб получить подсписки с одинаковой Х
на этом этапе имеем точки примерного пересечения вертикальных линий с контуром, находящиеся на расстоянии шага искомых точек.
4. начинаем заполнять внутренние диапазоны в списках недостающими данными, например подсписок: '(0 18 20 50 55) где первый элемент это координата по Х, тогда получим:
'((0 19)(0 51)(0 52)(0 53)(0 54))
аналогично обработать все подсписки...

Алгоритм 2
Если не хочется много вычислять математически, можно все сделать объектно: создаем две штриховки - горизонтальную и вертикальную с шагом равным шагу искомых точек и ищем все пересечения объектов штриховок.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/

Последний раз редактировалось Елпанов Евгений, 03.12.2010 в 14:51. Причина: разделил алгоритмы более очивидно.
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 03.12.2010, 13:48
#7
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Да, очень заманчиво переложить задачу размещения на плечи штриховки, но потом неизбежно вылезет задача удаления "лишних" точек, особенно в узких каналах. Еще хотелось бы, чтобы в этих самых каналах точки располагались по оси (по центру), поэтому пока еще думаю над созданием собственного алгоритма.
Миниатюры
Нажмите на изображение для увеличения
Название: Контур.jpg
Просмотров: 105
Размер:	31.2 Кб
ID:	49372  
swkx вне форума  
 
Непрочитано 03.12.2010, 13:52
#8
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от swkx Посмотреть сообщение
но потом неизбежно вылезет задача удаления "лишних" точек, особенно в узких каналах.
находим ближайшую точку на контуре, потом расстояние и принимаем решение удалять или нет...
Если пересортировать все точки, как в предыдущем алгоритме, то можно проверять только первые и последние точки в столбцах...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 03.12.2010, 14:04
#9
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Так я и не спорю, алгоритм вполне рабочий и пока просто единственный
Но ведь есть и принципиально другой подход: разбить контур на прямоугольники и размещать точки в каждом из них (пока для простоты можно считать, что все сегменты контура прямолинейны и ортогональны). Алгоритм размещения в этом случае простой и результат получится идеальный.
Только вот способ разбиения контура на прямоугольники пока что-то в голову не приходит((
swkx вне форума  
 
Непрочитано 03.12.2010, 14:11
#10
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


почему единственный? Второй алгоритм у меня реализован в двух коммерческих проектах и работает уже восемь лет очень стабильно! Первый был опробован, но отброшен как довольно медленный - разговор о тысячах контуров...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 03.12.2010, 14:47
#11
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Евгений,
я имел в виду не единственный из существующих в природе, а из рассматриваемых мной))
А о каком 2-м вы говорите ?
swkx вне форума  
 
Непрочитано 03.12.2010, 14:50
#12
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от swkx Посмотреть сообщение
Евгений,
я имел в виду не единственный из существующих в природе, а из рассматриваемых мной))
А о каком 2-м вы говорите ?
в 6 посте, я описал один алгоритм использующий чистую математику, без построений и второй с построениями - используются дополнительные штриховки
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 03.12.2010, 14:59
#13
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Так я его и рассматриваю пока как главного кандидата на реализацию
Кандидат #2: разбить контур на прямоугольники.
swkx вне форума  
 
Непрочитано 03.12.2010, 23:59
#14
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Если все контура подобны #7 надо придумывать как разбивать на прямоугольники. ИМХО.
zamtmn вне форума  
 
Автор темы   Непрочитано 04.12.2010, 08:58
#15
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Нахожусь в процессе придумывания.
Результат нулевой
swkx вне форума  
 
Непрочитано 04.12.2010, 11:59
#16
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


А я предлагал штриховать не квадратами, а густо-густо покрытыми точками. Гораздо больше, чем надо.
Взрываем штриховку и получаем набор всех точек, из которых образовалось облако.

Берем первую в наборе и по заданному радиусу удаляем из набора все точки попавшие в круг.
Берем следующую, первую попавшуюся и вытираем по радиусу вокруг нее. И так далее, пока не дойдем до конца набора.

В теории, когда круг замкнется, останется некое расстояние больше радиуса, но меньше двух радиусов, что соответствует заданным условиям.
Ни о какой упорядоченности внутри контура речи не шло, значит получим равномерное хаотичное поле. Правда если точки были распределены по клеточкам, то и результат вроде должон получится ровненький. Надо смотреть.

Последний раз редактировалось Supermax, 04.12.2010 в 22:42.
Supermax вне форума  
 
Непрочитано 04.12.2010, 12:11
#17
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,379


рассмотрите, в качестве примера, _superhatch из комплекта Express Tools
Хмурый вне форума  
 
Непрочитано 04.12.2010, 12:12
#18
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


swkx
Контура всегда состоят из стыкованых прямоугольников?
zamtmn вне форума  
 
Автор темы   Непрочитано 04.12.2010, 12:16
#19
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


zamtmn,

вообще-то нет, но решение для контуров с прямоугольными сегментами накроет 90% потребностей и вполне может считаться законченной задачей.

Supermax,

я помню твоё предложение. Но пока нужно определиться, работать с различными вариантами (в т.ч. с твоим) со штриховкой или попытаться разбить контур на прямоугольники.
У штриховок большой плюс - годится для любых контуров, у 2-го способа - идеальное размещение.

Хмурый,

у меня нет Express Tools. Нужно обойтись стандартным набором инструментов.

Последний раз редактировалось swkx, 04.12.2010 в 12:31.
swkx вне форума  
 
Непрочитано 04.12.2010, 13:20
#20
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Для начала можно попробовать для начала вырезать малые приямоугольники:
перебираем вершины по 4 рядом стоящие
если они образуют прямоугольник с серидиной диагонали лежащей внутри контура - запоминаем прямоугольник и выкидываем 2, 3 вершины из набора, оптимизируем набор (одаляем вершины лежащие на 1 прямой)

В сложнвх случаях предется перебирать по 3 вершины, четвертую достраивать и смотреть чтобы она лежала на нужной грани, если получится прямоугольник с диагональю внутри фигуры - удалять 2 вершину, третью менять на достроеную и оптимизировать.

так пока в итоге не останется прямоугольник, или ниче не возможно отрезать.

edit:
проверки нахождения середины диагонали предпологаемого прямоугольника внутри контура не достаточно. нужно еще проверять чтоб внутрь прямоугольника не попадали другие точки из контура

Последний раз редактировалось zamtmn, 04.12.2010 в 16:39.
zamtmn вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как равномерно разместить точки внутри контура



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить, лежит ли точка внутри контура swkx Программирование 71 10.11.2023 12:47
Справка по форуму Admin FAQ: Часто задаваемые вопросы 13 04.03.2014 11:12
Проектирование человека. FOXAL Разное 283 25.05.2010 09:52
Вопрос: Интерактивное построение полилинии внутри lisp-программы Tonic LISP 5 26.04.2010 15:50
Как узнать номер ячейк табл Atable по коорд точки внутри нее kp+ Программирование 6 02.03.2007 11:10