Случайная координата x, y внутри неправильного многоугольника, заданная списком точек x, y, без нахождения в такой угловой точке или ребре - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь заняться следующим вариантом использования:

Ввод: Список координат x, y, которые образуют неправильный многоугольник (они гарантированно действительны и линии не будет пересекаться, однако может быть вогнутым). Формат ввода не имеет значения, поэтому в настоящее время я использую два свободных int-массива для x и y соответственно.

Вывод: A x , координата y внутри этого многоугольника, который НЕ находится непосредственно над углом или краем.

Используя следующий код, я смог решить случайную x,y -координату внутри многоугольника:

// Currying Function with two int-arrays as parameters and double-pair return-type
X->Y->{
  // Create a Path2D object
  java.awt.geom.Path2D path = new java.awt.geom.Path2D.Double();
  // Start at the first coordinate given
  path.moveTo(X[0], Y[0]);
  // Loop over the remaining coordinates:
  for(int i=1; i<X.length; i++)
    // And draw lines from corner to corner
    path.lineTo(X[i], Y[i]);
  // After the loop, close the path to finish the polygon
  path.closePath();
  // Create a Rectangle that encapsulates the entire Path2D-polygon
  java.awt.Rectangle rect = s.getBounds();
  // The resulting x,y-coordinate, starting uninitialized
  double x,y;
  // Do-while the Path2D polygon does not contain the random x,y-coordinate:
  do{
    // Select a random x,y-coordinate within the Rectangle
    x = rect.getX() + Math.random()*rect.getWidht();
    y = rect.getY() + Math.random()*rect.getHeight();
  }while(!path.contains(x,y));
  // After which we return this random x,y-coordinate as result:
  return new double[]{x,y};
}

Это все работает как задумано. Теперь я хочу убедиться, что случайная координата x, y не является одной из входных координат x, y (это довольно легко) И не находится на ребре / линии Path2D. Во второй части я не знаю, как справиться, и быстрый поиск в Google не дал никакой полезной информации, отсюда и этот вопрос.

ПРИМЕЧАНИЕ. Я знаю, что вероятность случайной точки равна точно на вершине ребра / угла астрономически малы, и их, вероятно, можно игнорировать, но это вызов, поэтому необходимо применять его независимо.

1 Ответ

0 голосов
/ 24 апреля 2020

После подсказки @ Andreas в комментариях, чтобы использовать Line2D, я изменил do-while:

// The resulting x,y-coordinate, starting uninitialized
double x,y;
// Flag to indicate whether the random x,y-coordinate is on a corner or edge, starting truthy
boolean flag;
// Do-while the Path2D polygon does not contain the random x,y-coordinate:
do{
  // Select a random x,y-coordinate within the Rectangle
  x = rect.getX() + Math.random()*rect.getWidht();
  y = rect.getY() + Math.random()*rect.getHeight();
  // Set the flag to false:
  flag = false;
  // Loop over the pair of x,y-coordinates of the input:
  for(int j=0; j<X.length; )
    // Create a Line2D using the current pair of x,y-coordinates:
    if(new java.awt.geom.Line2D.Double(X[j],Y[j++], X[j],Y[j])
    // And if it contains the random x,y-coordinate:
       .contains(x,y))
      // Change the flag to true
      flag = true;
}while(!path.contains(x,y) || flag);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...