Выберите случайную точку на линии многоугольника - PullRequest
3 голосов
/ 13 апреля 2011

Я использую объект Java Polygon, в котором хранится массив точек, определяющих линии, составляющие фигуру.

Как мне выбрать случайную точку на одной из этих линий?Существуют ли какие-либо методы в классе Polygon, которые облегчили бы это?

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

Ответы [ 3 ]

5 голосов
/ 13 апреля 2011

Первое, что вам нужно сделать, это найти периметр многоугольника.

Теперь найдите случайное число в диапазоне от 0 до периметра.

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

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

================================

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

2 голосов
/ 13 апреля 2011

Используйте форму "точка-наклон", чтобы создать уравнение y = mx + b для случайно выбранного ребра из одного из ребер n, соединяющих вершины. Вершины определены в Polygon.xpoints и Polygon.ypoints.

Примите во внимание следующее:
Предположим, у нас есть пятиугольник. У нас есть 5 ребер и 5 вершин. Поскольку у нас есть вершины, хранящиеся в Polygon, и мы хотим ребро, нам нужны две вершины для формирования линии, поэтому мы случайным образом выбираем между 0 и 5. Предположим, наше случайно сгенерированное число r = 0.

Предположим, xpoints[r] = 1, ypoints[r] = 1, xpoints[r+1] = 2 и ypoints[r+1] = 4.

Для m у нас есть

m = (4-1)/(2-1) = 3

Для формы с наклоном у нас есть

(y - 1) = m(x - 1)
(y - 1) = 3(x - 1) --> y = 3x - 2

Теперь выберите случайное значение x между двумя x-границами этого ребра, т. Е. В домене [0,2], и у вас есть случайные точки (x, y(x)).

0 голосов
/ 13 апреля 2011

Если у вас есть n точек в массиве, используйте java-класс Random.

java.util.Random r = new java.util.Random();
int num = r.nextInt(n); // n is the highest random number generated, also the size of the array
fuctionThatUsesPoint(myPolygon.xpoints[num], myPolygon.ypoints[num]);
...