#математика #алгоритм #3d
Ищу алгоритм для "красивого" заполнения поверхности сферы однородными объектами и представляю себе входные условия на него таким образом: Необходимо размещать заданное количество точек на сфере как можно более равномерно. Под равномерно здесь понимается примерно вот что: для любой точки ее расстояние по сфере до ближайшей соседней как можно более велико (назовем такое расстояние ореолом точки). Некоторое количество точек задано сразу, точки могут добавляться и удаляться. При перераспределении точек они должны сдвигаться, но не прыгать, то есть меняющие свое положение точки должны двигаться по гладким путям. Желательно, чтобы при движении точек по путям их ореол либо только увеличивался, либо только уменьшался (точки либо все вместе уплотняются при добавлении новых, либо наоборот) Неплохо бы продумать модификации алгоритма для эллипсоида или для неоднородных объектов (скажем, кругов различного радиуса - ореолом тогда будет наименьшее расстояние между границами) Ясно, что здесь при позиционировании предельная точность не так важна, как скорость поиска "красивого" распределения. Очень желаю услышать полезные идеи по реализации таких условий, а также возможные варианты других критериев "красивого" распределения.
Ответы
Ответ 1
Пусть у каждой точки есть три степени свободы: x, y и z. На каждую точку действуют две силы: Отталкивание от других точек. Притяжение к поверхности сферы. Проецируя точки на сферу, получает распределение. При добавлении точки она будет "расталкивать" соседей. Пример для двумерного случая: Пример для трёхмерного случая:Ответ 2
Метод золотого сечения (это Matlab, но думаю понятно будет) num_pts = 200; % количество точек indices = 0:num_pts + 0.5; theta = acos(1 - 2 * indices / num_pts); phi = pi * (1 + 5^0.5) * indices; r = 3; x = r .* cos(phi) .* sin(theta); y = r .* sin(phi) .* sin(theta); z = r .* cos(theta); Источник - https://stackoverflow.com/questions/9600801/evenly-distributing-n-points-on-a-sphere
Комментариев нет:
Отправить комментарий