Метод, который возвращает случайную точку в радиусе заданного Vector2, с большей вероятностью в центре радиуса, чем ребро - PullRequest
1 голос
/ 02 мая 2020

Мне нужен метод, в котором я могу указать местоположение Vector2 и радиус, который даст мне случайную точку в радиусе с большей вероятностью в направлении центра, чем край радиуса.

Я пытался найти решение этой проблемы, но не смог достаточно подробно описать проблему в поисковиках, чтобы получить хороший результат.

Надеюсь, что кто-то здесь может указать мне в правильном направлении. Пример кода на любом языке высоко ценится!

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Как насчет этого:

  1. Генерировать три случайных числа с равномерным распределением в диапазоне [-R, R]. Вы получите (x, y, z), описывающее точку, нарисованную случайным образом (с равномерным распределением) в кубе.
  2. Если x 2 + y 2 + z 2 > R 2 , отклонить точку и начать все сначала. (Более половины сгенерированных вами точек пройдут этот тест.)
  3. Теперь у вас есть точка, нарисованная случайным образом (с равномерным распределением) внутри сферы радиуса R.
  4. Теперь отбросьте z, и у вас останется (x, y), описывающая точку в радиусе R центра, более вероятно, ближе к центру, чем дальше, потому что сфера толще в середине, чем на краях.
1 голос
/ 02 мая 2020

Не уверен, что это именно то, что вы хотите, но это должно дать вам некоторое распределение с большим количеством точек на объем в центре сферы:

Вы можете использовать эту простую формулу, чтобы найти случайную равномерно распределенную точку на поверхностях сфер: Генерация случайной выборки точек, распределенных по поверхности единичной сферы

Когда вы берете эту точку и перемещаете ее внутрь, умножая ее на случайное значение и деля на r:

(x,y,z) *= randomValue

где (x, y, z) - вектор, указывающий на случайную точку на поверхности, а randomValue - это некоторое случайное значение между 0 и 1.

Это дает равномерное распределение по r, но поскольку поверхность становится меньше с меньшим радиусом, ваши точки будут сосредоточены в середине.

Если вы хотите дополнительно настроить распределение, вы можете добавить некоторая сила для случайного значения:

(x,y,z) *= pow(randomValue, exponent)

, где чем выше показатель степени, тем больше очков вы получите в середине сферы .

...