Генерировать случайные координаты из области за пределами прямоугольника? - PullRequest
1 голос
/ 30 апреля 2010

Я работаю над простым уроком, и я хотел бы случайным образом сгенерировать положения красных и зеленых прямоугольников на сопровождающих изображениях где-нибудь внутри темно-серой области, но не в белой области. Есть ли какие-нибудь особенно элегантные алгоритмы для этого? У меня есть несколько хакерских идей, которые действительно просты (продолжайте генерировать, пока координаты не выходят за пределы внутреннего прямоугольника и т. Д.), Но мне было интересно, если кто-нибудь придумал какие-нибудь аккуратные решения.

Спасибо за любую помощь!

alt text

Ответы [ 2 ]

3 голосов
/ 30 апреля 2010

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

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

  • Определите высоту ч S и ширину ш S квадрата, который вы размещаете.

  • Разделите серую область на 8 прямоугольных областей R = { R 1 , R 2 , ... R 8 }, определяется белым полем. (Представьте сетку крестики-нолики с белым квадратом в центре; это определяет окружающие восемь областей.)

  • Пусть P ( S помещается в R i ) = A ( R i ) / A ( R ), где A ( R i ) - это область, в которой можно разместить центр S : то есть область, имеющая площадь ( ч R i - ч S ) & middot; ( ш R i - ш S ).

  • Выберите регион в соответствии с вышеуказанными вероятностями. Затем выберите точку в этой области из равномерного распределения доступных x- и y-координат.

  • Готово!

3 голосов
/ 30 апреля 2010

Лично я бы пошел с простым подходом «продолжайте выборку, пока не получите действительное значение», если только у вас не будет шанса, что у вас будет очень большой белый прямоугольник против серого, который не намного больше.Для меня проще - почти всегда лучше.

Альтернативой было бы определить, сколько будет возможных пикселей, и сгенерировать случайное число в этом диапазоне.Затем эффективно пронумеруйте пиксели сверху вниз слева направо.Определите, находится ли данный случайный образец в верхней части, нижней части или в середине (что можно сделать, просто посмотрев, меньше ли он первого пикселя в верхней строке белого прямоугольника или меньше первого пикселя налиния под белым прямоугольником).Как только вы это выясните, нужно просто проработать строку, а затем пиксель в строке.Это не очень сложно, но - это довольно сложно и легко ошибиться.Обратите внимание, что это определяет один случайный пиксель: поскольку вы генерируете большие квадраты, вы должны рассмотреть диапазон допустимых пикселей для верхнего левого угла квадрата и найти образец в этом диапазоне.

...