2010-04-29 2 views
1

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

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

alt text

ответ

3

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

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

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

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

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

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

  • Выполнено!

3

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

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

Смежные вопросы