, как говорится в другом ответе, самый простой подход - генерировать случайные точки, а затем отбрасывать те, которые находятся слишком близко к другим (не забудьте при необходимости проверить минимальное расстояние до центральной точки).
однако, генерирование случайных точек сложнее, чем объяснено. Во-первых, вам нужно выбрать радиус случайным образом. во-вторых, вам нужно иметь больше точек на больших радиусах (потому что там «больше места»). так что вы не можете просто сделать радиус равномерным случайным числом.
Вместо этого выберите число от 0 до $radius * $radius
. затем возьмите sqrt()
от этого, чтобы найти радиус для построения графика (это работает, потому что площадь пропорциональна квадрату радиуса).
я не знаю php ( см. Исправление Каролиса в комментариях ), но из другого ответа я думаю, что это будет означать:
$angle = deg2rad(mt_rand(0, 359));
$radius = sqrt(mt_rand(0, $max_radius * $max_radius));
Затем проверьте это по предыдущим пунктам, как уже описано.
наконец, не забывайте, что вы можете достичь состояния, в котором вы не можете генерировать больше точек, поэтому вы можете захотеть установить верхний предел цикла «попробуй и сбрось», чтобы избежать попадания в бесконечный цикл, когда пробел (близко к) полный.
ps как комментарий говорит о другом ответе, это O (n ^ 2) и поэтому не подходит для большого количества точек. Вы можете решить эту проблему в некоторой степени, отсортировав точки по радиусу и рассматривая только те из них, которые находятся в пределах $min_distance
, пока $min_distance << $max_radius
(как на вашем чертеже); для достижения лучшего результата требуется более сложное решение (например, при больших радиусах также с использованием угла или использования отдельного четырехугольного дерева для хранения и сравнения позиций). но для десятков пунктов я думаю, что в этом не было бы необходимости.