Мне нужно реализовать алгоритм развертки от нашего профессора, но я не очень понимаю, как получить точки пересечения линии развертки с полигоном. Вот алгоритм:
Я уже реализовал свой собственный многоугольник (с такими методами, как paint()
, contains()
и т. д.), и у меня есть все ребра из многоугольника, сохраненные в массиве, подобном этому:
int[] pointsX;
int[] pointsY;
и у меня есть минимальные и максимальные значения для x и y, сохраненные в
int ymin, ymax, xmin, xmax;
Итак, моя первая мысль заключается в том, что мне нужно создать строку сканирования, начинающуюся с 0,ymin
, и проверить в цикле, находится ли следующая точка внутри полигона. Я реализовал этот метод следующим образом:
public boolean contains(Point test) {
boolean result = false;
java.awt.Polygon polygon = new java.awt.Polygon(pointsX, pointsY, pointsX.length);
if (polygon.contains(test)) {
result = true;
}
return result;
}
Итак, когда следующая точка находится внутри многоугольника, у меня есть точка пересечения и так далее. Для этого у меня есть этот цикл:
ArrayList<Point> intersectionPoints = new ArrayList<>();
wasInside = false;
for (int yTemp = ymin; yTemp <= ymax; yTemp++) {
for (int xTemp = xmin; xTemp <= xmax; xTemp++) {
if (wasInside != this.contains(new Point(xTemp, yTemp))) {
intersectionPoints.add(new Point(xTemp, yTemp));
wasInside = !wasInside;
}
}
}
Но я получил подсказку, что это не правильное решение из мой вопрос о стеке с переполнением.
Может ли кто-нибудь дать мне подсказку, как я могу начать реализацию алгоритма от моего профессора? Где взять точки x1,y1,x2,y2,c? Я знаю, что это ребра, но как мне узнать, какие ребра мне нужно взять?
РЕДАКТИРОВАТЬ: ОК, теперь у меня есть все ребра, отсортированные по их значениям y. Могу ли я вычислить точки пересечения по заданной формуле Sx=x1+(x2-x1)/...? Моя первая попытка выглядит так:
for (int c = ymin; c <= ymax; c++) {
for (int xTemp = xmin; xTemp <= xmax; xTemp++) {
for (int currentEdge = 0; currentEdge < edges.size() - 1; currentEdge++) {
int x1 = edges.get(currentEdge).x;
int x2 = edges.get(currentEdge + 1).x;
int y1 = edges.get(currentEdge).y;
int y2 = edges.get(currentEdge + 1).y;
if ((y1 <= c && y2 > c) || (y2 <= c && y1 > c)) {
intersectionPoints.add(new Point((x1 + (x2 - x1) / (y2 - y1) * (c - y1)),c));
}
}
}
}
Но это кажется неправильным, потому что я получаю много неправильных Баллов в intersectionPoints
.