Равномерная расстановка точек в произвольной фигуре
Всем привет, с наступающим!
В общем, задумал я одну демку сделать. Смысл такой — есть последовательность кадров, черно-белых. В каждом кадре нарисовано пятно. При воспроизведении видно, как форма пятна "трансформируется". Далее я хочу расставить поверх пятна в каждом кадре некоторое фиксированное количество точек (предположим сто) таким образом, чтобы они равномерно заполнили площадь фигуры (пятна). На следующем кадре мне необходимо сделать то же самое, но с учетом того, чтобы соответствующие точки переместились в соответствующее место нового пятна. Грубо говоря, чтобы точка номер 45 не прыгала с одного угла пятна на другое при небольшом изменении формы пятна.
Пока что я вижу решение задачи таким: смотрим габариты пятна в текущем кадре, получаем прямоугольную область. Рассчитав размер точки исходя из площади пятна (делим площадь габаритной области на количество точек — получаем площадь габаритов для точки), мы располагаем точки во всегда одинаковом порядке — слева направо, сверху вниз. На этом момента получаются уже не точки даже, а полноценные окружности. Далее включаем механизм столкновения точек между собой и ограничения по форме пятна. То есть для столкновения между собой довольно тривиальный механизм будет использован, а вот для constrain по форме пятна уже придется шаманить с битмапдатами. И прогоняем такой код раз 200, например.
По-идее, через некоторое количество итераций точки займут наиболее удобное положение с минимальными конфликтами столкновения между собой. Но это только теоретически. Для следующих кадров делая то же самое, наверное, соответствующие точки займут схожее положение, чего мне и нужно добиться.
Альтернативный вариант — любым образом расставлять равномерно точки поверх пятна, а уже потом прогонять все кадры и находить оптимальные соответствия точек в разных кадрах.
Есть у кого-нибудь идеи по этому поводу? Я больше чем уверен, что такая задача не нова и наверняка есть какие-нибудь более лаконичные и разумные решения.
Да, кстати. В итоге я хочу получить просто равномерный фиксированный по количеству набор точек на экране, которые перемещаются "сохраняя" форму оригинального пятна. Этакая интерполяция кадров, в общем.
|