Я хочу сгенерировать N точек в квадрате (равномерно). как я могу этого добиться?
Генерировать N точек в квадрате (равномерно)
Ответы (1)
Довольно крутая задача, и намного сложнее, чем я себе представлял, но вот идея. Есть статьи по этому поводу для n-угольников, но я просто сделаю квадрат. Таким образом, равномерное распределение по окружности является общей проблемой, и вы не можете просто выбрать радиус r
и угол theta
независимо друг от друга, поскольку больший вес придается большому радиусу, т. е. если мы возьмем бесконечно малое кольцо, у вас будет большая площадь исходит от большего радиуса дальше от центра, поэтому мы равномерно сэмплируем из r^2
, поскольку площадь является функцией r^2
.
Теперь идея аналогична для прямоугольника, его симметрия поддается захвату с помощью некоторой меры поворота (угла) и расстояния от начала координат (радиуса), но обратите внимание, что радиус резко меняется, когда вы вращаетесь вокруг круга, то поднимаясь, то опускаясь. то вверх то вниз. нам нужен способ задать радиус на основе угла, чтобы его масса примерно в любой заданной точке была однородной.
Рассмотрим следующую конструкцию (мы можем сориентировать квадрат так, чтобы он находился на одной из его сторон, но это более интуитивно понятно) Извините, мои диаграммы плохо нарисованы.
A
X
B O C
D
Вот наш квадрат, где A, B, C, D — углы, а O — начало координат. Мы объясним X позже. Начнем с точки C и будем вращать против часовой стрелки, угол будет обозначаться Theta. X является точкой пересечения с краем квадрата, если мы проводим линию из O с углом Theta. Другими словами, X = r(Theta). Что мы пытаемся сделать, так это зафиксировать расстояние r как функцию тета, чтобы сделать это равномерным распределением вероятности тета. Вот и вся идея..
мы можем написать следующее с законом синусов
Sin(pi - Theta - pi/4)/c = sin(pi/4)/r(Theta) where C sits at (c,0)
сделать немного алгебры и прийти к
r(Theta) = sqrt(2)*c / (2sin(3pi/4 - Theta)
теперь нам нужна константа k такая, что интегрирование k*r(Theta) даст вам 1, что вы можете легко сделать.
я получил
a*sin(pi/4)ln|tan((Theta+pi/4)/2)| evaluated from 0 to pi/4
вы успешно создали файл p.d.f. (функция распределения вероятностей) для вашего r(Theta), теперь вычислите c.d.f. (кумулятивная функция распределения), установите для нее значение uniform и получите выражение в закрытой форме для вашего Theta.
до сих пор мы построили случайную тету, чтобы построить радиус r, понимая, что так же, как у круга, у нас больше массы дальше, и мы можем построить его как
R = r(Theta)/s
где s однородно от 0 до 1.
мы используем r(Theta)
, потому что это максимально возможное значение с учетом Theta.