Генерировать N точек в квадрате (равномерно)

Я хочу сгенерировать N точек в квадрате (равномерно). как я могу этого добиться?


person Soheil Ghahremani    schedule 24.11.2013    source источник
comment
Они могут быть случайными, а могут быть однородными. Они не могут быть обоими.   -  person T.J. Crowder    schedule 24.11.2013
comment
Вы имеете в виду, что хотите, чтобы случайные точки были равномерно распределены по квадрату в течение многих прогонов? Если бы они всегда были равномерно распределены в одном и том же цикле, они не были бы случайными.   -  person Robin Green    schedule 24.11.2013
comment
tnx, я отредактировал вопрос. это моя ошибка   -  person Soheil Ghahremani    schedule 24.11.2013
comment
Я ненавижу зацикливаться на такого рода вещах, но что вы пробовали?   -  person SimplyPanda    schedule 24.11.2013
comment
если N степень 2 . Я могу разделить квадрат на N клеток и поставить по одной точке в каждой клетке.   -  person Soheil Ghahremani    schedule 24.11.2013
comment
Я все еще не понимаю. Вам нужен детерминированный (неслучайный, всегда одинаковый) шаблон точек, равномерно расположенных внутри квадрата. Или вы хотите выбрать N точек внутри квадрата с равной вероятностью во всех местах квадрата?   -  person Hannes Ovrén    schedule 26.11.2013


Ответы (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.

person tweaking    schedule 26.11.2013