![]() |
Равномерная расстановка точек в произвольной фигуре
Всем привет, с наступающим!
В общем, задумал я одну демку сделать. Смысл такой — есть последовательность кадров, черно-белых. В каждом кадре нарисовано пятно. При воспроизведении видно, как форма пятна "трансформируется". Далее я хочу расставить поверх пятна в каждом кадре некоторое фиксированное количество точек (предположим сто) таким образом, чтобы они равномерно заполнили площадь фигуры (пятна). На следующем кадре мне необходимо сделать то же самое, но с учетом того, чтобы соответствующие точки переместились в соответствующее место нового пятна. Грубо говоря, чтобы точка номер 45 не прыгала с одного угла пятна на другое при небольшом изменении формы пятна. Пока что я вижу решение задачи таким: смотрим габариты пятна в текущем кадре, получаем прямоугольную область. Рассчитав размер точки исходя из площади пятна (делим площадь габаритной области на количество точек — получаем площадь габаритов для точки), мы располагаем точки во всегда одинаковом порядке — слева направо, сверху вниз. На этом момента получаются уже не точки даже, а полноценные окружности. Далее включаем механизм столкновения точек между собой и ограничения по форме пятна. То есть для столкновения между собой довольно тривиальный механизм будет использован, а вот для constrain по форме пятна уже придется шаманить с битмапдатами. И прогоняем такой код раз 200, например. По-идее, через некоторое количество итераций точки займут наиболее удобное положение с минимальными конфликтами столкновения между собой. Но это только теоретически. Для следующих кадров делая то же самое, наверное, соответствующие точки займут схожее положение, чего мне и нужно добиться. Альтернативный вариант — любым образом расставлять равномерно точки поверх пятна, а уже потом прогонять все кадры и находить оптимальные соответствия точек в разных кадрах. Есть у кого-нибудь идеи по этому поводу? Я больше чем уверен, что такая задача не нова и наверняка есть какие-нибудь более лаконичные и разумные решения. Да, кстати. В итоге я хочу получить просто равномерный фиксированный по количеству набор точек на экране, которые перемещаются "сохраняя" форму оригинального пятна. Этакая интерполяция кадров, в общем. |
Сделать, что точки отталкиваются друг от друга + ограничение на "не вылазят за фигуру" (если при смене форме какие-то вылезли, то вернуть в ближайшую точку фигуры). Отталкивание сделать пропорционально расстоянию. И по-моему самое сложное это именно возврат точки в фигуру, я бы попробовал написать остальную "физику", если была бы функция "вернуть вылезшую точку в фигуру".
|
|
Цитата:
|
Вложений: 1
если есть мат.форма "пятна" то отталкивать точки от рёбер можно проецируя каждую точку на каждое ребро ( DOT ), и уже от ближайшей точки на ребре до нашей точки отталкивать обратнО пропорционально расстоянию. если нет границ пятна, то можно попытаться поиграться с притяжением точек в центр в зависимости от угла( относительно центра), например -
Код AS3:
|
Вложений: 1
|
Ты не поверишь, но это решение является чуть ли не единственным для произвольной фигуры. Даже на уровне высшей математики. Читал где-то, что именно так вычисляют координаты произвольного множества равноудаленных друг от друга точек на сфере. Просто ждут подольше, чтобы точность была повыше )
|
Hauts,
Сколько примерно итераций? |
Я не задаю итерации. У меня по энтерфрэйму идет рассчет: завожу максимальный радиус исходя из площади габаритов фигуры, потом расталкиваю шарики, при этом уменьшая их радиус.
|
Вложений: 1
|
Разместить горстку точек в центр фигуры и решать их в каждой итерации как частицы с одинаковым зарядом.
|
Zebestov, можно подробнее?
Как я понимаю, я примерно так и тестирую, размещаю все точки по небольшой окружности (чтобы расталкивать их можно было dx!=0 && dy!=0) в центре габаритной области, потом распихиваю их. Как только первая картинка отработала, я ее немного поворачиваю и скалирую, отрисовываю в бд заново и заново размещаю точки у центра, но уже, соответственно, у центра новой габаритной области. На втором тесте (второй картинке) пробовал и заново размещать их по центру и оставлять на позициях после первого теста (как в моем последнем примере), результат примерно один и тот же. Некоторые хорошо "съезжают" в нужном направлении, некоторые много "путешествуют". |
Подробнее нужно углубиться, я этим не занимался вплотную.
|
Цитата:
|
Хм. Вариант, да.
Так же попробую пронумеровать от центра. Alatar, если у меня нет у точки какого-либо свойства, отвечающего за индекс (да и по-сути, мне его и не нужно), имеет ли смысл два раза сортировать массив сначала по y точек, потом по x? Получится ли правильная нумерация? Или я туплю?:) |
Зачем два раза сортировать? Все сортируется за один раз.
|
Можно намёк? Ато я не гуру как бы, мне сложно так сходу сориентироваться, к сожалению :(
|
Код AS3:
Или еще проще: Код AS3:
|
Понял, спасибо большое, намотал на ус :)
Буду тестировать. |
Вложений: 1
Попробовал. Получается так себе. Очевидно, что смещение точек зачастую нерациональное, не такое, как хотелось бы.
Код AS3:
По-идее, если не смотреть на небольшие ошибки расположения точек, то задача сводится к тому, чтобы найти наиболее оптимальные соответствия между точками, исходя из расстояний между ними. И да, возможно я просто криво написал код. Есть еще идеи? Подскажите :) |
Точки должны менять свою позицию относительно фигуры, только при изменении формы фигуры. Т.е. если ты просто искажаешь исходную фигуру, то достаточно, просто применить те же трансформации к уже сгенерированным точкам.
|
Нет, искажение фигуры в демке — только для тестов. В реальной задаче фигуры могут быть разными.
|
Также стоит попробовать заполнять фигуру не с центра, а с одного из краев, что бы точки располагались менее хаотично в разных итерациях. Или заполнять столбцами, а потом уже раздвигать их.
Добавлено через 10 минут По сути твоя задача это морфинг одного объекта в другой. Все реализации "красивого" морфинга, что я видел делались вручную. Т.е. берется одна фигура из определенного количества точек и вручную передвигая точки из нее получается другая фигура. В итоге, заранее известно какая точка из одной фигуры будет соответствовать точке на другой. |
Да, верно. Можно сказать и так. Но я не верю, что нет хотя бы приемлемых решений для моей задачи без "ручной" анимации, вот в чем дело.
В конце-концов я вполне отчетливо представляю себе демку на нэйпе или боксе, где меняется окружающая фигура, внутри которой находятся шарики, которые автоматически занимают наиболее выгодные места. http://napephys.com/samples.html#swf...uctibleTerrain Вот типа такого. |
Ну, не знаю. Попробуй совместить морфинг контура (что несколько проще) и распределение точек. Т.е. в начальную фигуру набрасываем точек, потом начинаем понемногу трансформировать один контур в другой и на каждой итерации запускать расталкивание точек (не вбрасывая их повторно).
|
А каким образом задан контур? Это функция или набор точек?
|
Может наложить сетку на фигуру? Выбираем только те ячейки, которые частично или полностью вмещают фигуру. Дальше, при генерации точек, выбираем случайную клетку, и в неё в случайное место вставляем точку.
Для получения равномерного распределения точек, можно сделать весовые коэффициенты для клеток, например коэффициент зависит от площади фигуры, которая помещена в клетку. При морфинге в другую фигуру, делаем тоже самое и дальше для каждой старой точки, ищем ближайшую новую, эта пара точек и будет отрезком для анимации движения. Ближайшие точки, можно находить либо полным перебором, либо используя всякие spatial grid. Если важна визуальная часть морфинга, то можно учитывать вектор направления движения на предыдущих шагах, при выборе точки "близнеца". В таком случае, подходящими будут только те точки, которые попадают в конус, который определяет вектор движения и какой-нибудь небольшой угол, например в 90 градусов. Если фигуры вообще разные, то можно и не парится на счет поиска "близнеца", а просто взять случайную точку и двигать старую точку в новую. Дополнение: А как такой вариант? Просканить битмапу и создать массив координат заполненных пикселей, при генерации распределения, выбираем случайную ячейку в массиве и вставляем точку в полученные координаты. По сути, это частный случай варианта про наложение сетки. |
semenyakinVS, если ко мне вопрос, то у меня нет контуров. Есть просто картинки. На данный момент — просто пятна черные.
vizgl, спасибо, дельный совет, буду пробовать. |
| Часовой пояс GMT +4, время: 19:55. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.