Выберите случайную точку на линии многоугольника

#java #geometry #awt #polygon #computational-geometry

#java #геометрия #awt #многоугольник #вычислительная геометрия

Вопрос:

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

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

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

Ответ №1:

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

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

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

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

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

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

Комментарии:

1. 1 — эти подходы дают равномерно распределенные случайные точки по периметру.

Ответ №2:

Используйте форму наклона точки, чтобы создать 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)) .

Комментарии:

1. Кроме того, обратите внимание, что произойдет, если r = 5 у нас есть индекс массива 6, который выходит за рамки. Для r = 5 , вместо того чтобы делать r 1 , чтобы получить следующую вершину, мы используем 0 .

Ответ №3:

Если у вас в массиве 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]);
  

Комментарии:

1. Ему нужна случайная точка на одной из линий… не случайная вершина

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

3. @Matt — вопрос был достаточно ясен, как и было написано изначально, IMO.