我必须从我们的教授那里实现扫描线算法,但是我不太了解如何从扫描线与多边形获得交点。这是算法:
我已经实现了自己的多边形(已使用,方法,诸如此类)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;
}
}
}
但是我从我的stackoverflow问题中得到了一个暗示,这不是正确的解决方案。
有人可以给我一个提示,我如何从教授那里开始实现算法?我在哪里可以得到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
。
问题是我用int
数字计算,然后int
除以另一个int
结果,结果是不准确的。因此,只需使用double
数字即可解决。
这就是我计算交点的方式:edges
是一个ArrayList<Point>
包含边缘点的。ymin
是最低的y值,而ymax是最高的y值。
for (int yTemp = ymin; yTemp <= ymax; yTemp++) {
ArrayList<Point> intersectionPoints = new ArrayList<>();
for (int p = 0; p < edges.size() - 1; p++) {
int x1, x2, y1, y2;
double deltax, deltay, x;
x1 = edges.get(p).x;
y1 = edges.get(p).y;
x2 = edges.get(p + 1).x;
y2 = edges.get(p + 1).y;
deltax = x2 - x1;
deltay = y2 - y1;
int roundedX;
x = x1 + deltax / deltay * (yTemp - y1);
roundedX = (int) Math.round(x);
if ((y1 <= yTemp && y2 > yTemp) || (y2 <= yTemp && y1 > yTemp)) {
intersectionPoints.add(new Point(roundedX, yTemp));
}
}
//for the last interval
int x1, x2, y1, y2;
x1 = edges.get(edges.size() - 1).x;
y1 = edges.get(edges.size() - 1).y;
x2 = edges.get(0).x;
y2 = edges.get(0).y;
if ((y1 <= yTemp && y2 > yTemp) || (y2 <= yTemp && y1 > yTemp)) {
intersectionPoints.add(new Point(x1 + (x2 - x1) / (y2 - y1) * yTemp - y1, yTemp));
}
//you have to sort the intersection points of every scanline from the lowest x value to thr highest
Collections.sort(intersectionPoints, new SortXPoints());
pointsOfScanline.add(intersectionPoints);
这将为您提供一个ArrayList,其中包含每个Scanline的scanline点的ArrayList。因此,您只需要使用即可绘制它们drawLine(x1, y2, x2, y2)
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句