|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Как равномерно разместить точки внутри контура
Регистрация: 22.01.2010
Сообщений: 311
|
||
Просмотров: 6832
|
|
||||
Цитата:
![]() Варьируете отсупом между линиями и расстоянием между точками, думаю должно получиться.
__________________
«Артиллерия не токмо грохот, но и наука!» Пётр I |
||||
![]() |
|
||||
интересная задачка
![]() я бы решал так: Алгоритм 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. Причина: разделил алгоритмы более очивидно. |
||||
![]() |
|
||||
Регистрация: 22.01.2010
Сообщений: 311
|
Да, очень заманчиво переложить задачу размещения на плечи штриховки, но потом неизбежно вылезет задача удаления "лишних" точек, особенно в узких каналах. Еще хотелось бы, чтобы в этих самых каналах точки располагались по оси (по центру), поэтому пока еще думаю над созданием собственного алгоритма.
|
|||
![]() |
|
||||
Цитата:
Если пересортировать все точки, как в предыдущем алгоритме, то можно проверять только первые и последние точки в столбцах...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Регистрация: 22.01.2010
Сообщений: 311
|
Так я и не спорю, алгоритм вполне рабочий и пока просто единственный
![]() Но ведь есть и принципиально другой подход: разбить контур на прямоугольники и размещать точки в каждом из них (пока для простоты можно считать, что все сегменты контура прямолинейны и ортогональны). Алгоритм размещения в этом случае простой и результат получится идеальный. Только вот способ разбиения контура на прямоугольники пока что-то в голову не приходит(( |
|||
![]() |
|
||||
почему единственный? Второй алгоритм у меня реализован в двух коммерческих проектах и работает уже восемь лет очень стабильно! Первый был опробован, но отброшен как довольно медленный - разговор о тысячах контуров...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
в 6 посте, я описал один алгоритм использующий чистую математику, без построений и второй с построениями - используются дополнительные штриховки
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
А я предлагал штриховать не квадратами, а густо-густо покрытыми точками. Гораздо больше, чем надо.
Взрываем штриховку и получаем набор всех точек, из которых образовалось облако. Берем первую в наборе и по заданному радиусу удаляем из набора все точки попавшие в круг. Берем следующую, первую попавшуюся и вытираем по радиусу вокруг нее. И так далее, пока не дойдем до конца набора. В теории, когда круг замкнется, останется некое расстояние больше радиуса, но меньше двух радиусов, что соответствует заданным условиям. Ни о какой упорядоченности внутри контура речи не шло, значит получим равномерное хаотичное поле. Правда если точки были распределены по клеточкам, то и результат вроде должон получится ровненький. Надо смотреть. Последний раз редактировалось Supermax, 04.12.2010 в 22:42. |
||||
![]() |
|
||||
Регистрация: 22.01.2010
Сообщений: 311
|
zamtmn,
вообще-то нет, но решение для контуров с прямоугольными сегментами накроет 90% потребностей и вполне может считаться законченной задачей. Supermax, я помню твоё предложение. Но пока нужно определиться, работать с различными вариантами (в т.ч. с твоим) со штриховкой или попытаться разбить контур на прямоугольники. У штриховок большой плюс - годится для любых контуров, у 2-го способа - идеальное размещение. Хмурый, у меня нет Express Tools. Нужно обойтись стандартным набором инструментов. Последний раз редактировалось swkx, 04.12.2010 в 12:31. |
|||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Для начала можно попробовать для начала вырезать малые приямоугольники:
перебираем вершины по 4 рядом стоящие если они образуют прямоугольник с серидиной диагонали лежащей внутри контура - запоминаем прямоугольник и выкидываем 2, 3 вершины из набора, оптимизируем набор (одаляем вершины лежащие на 1 прямой) В сложнвх случаях предется перебирать по 3 вершины, четвертую достраивать и смотреть чтобы она лежала на нужной грани, если получится прямоугольник с диагональю внутри фигуры - удалять 2 вершину, третью менять на достроеную и оптимизировать. так пока в итоге не останется прямоугольник, или ниче не возможно отрезать. edit: проверки нахождения середины диагонали предпологаемого прямоугольника внутри контура не достаточно. нужно еще проверять чтоб внутрь прямоугольника не попадали другие точки из контура Последний раз редактировалось zamtmn, 04.12.2010 в 16:39. |
|||
![]() |
|
||||
геологоразведка, строительство Регистрация: 14.10.2003
Магадан
Сообщений: 311
|
Цитата:
1. а. Вычисляем мин. и макс. координаты точек контура. б. Определяем начальные координаты массива (в зависимости от расстояния между точками), так чтобы координаты массива были заведомо больше контура (на расстояние между точками). А также количество строк и столбцов массива. в. По команде -Array заполняем массив (предварительно отрисовав точку в нижнем левом углу массива). Следует не забывать об ограничении количества блоков массива. г. По ssget находим эти блоки внутри контура и удаляем из набора блоки, созданные командой Array за пределами этого контура. 2. А вот в этом случае задача значительно усложняется: а, б, в - можно оставить те же. г. Делаем offset (отступ) контура внутрь, находим перечень его точек (правда тут надо не забывать, что команда Offset может создать несколько контуров отступа). Желательно проверять предварительно также самопересечение исходного контура и сдвоенность его точек. д. И далее по пункту г. режима 1. (но уже по контуру отступа).
__________________
Лень - великий двигатель прогресса! |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как определить, лежит ли точка внутри контура | 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 |