【发布时间】:2015-10-27 17:37:23
【问题描述】:
我的 java 程序需要一个检查多边形碰撞的函数,但我尝试的算法(用于多边形中的点)不适合我的需要,退化情况对我来说是个问题。
这就是我试图用我的程序达到的目标:我有 2 个多边形,并希望将它们尽可能地放在一起。我想将它们放在它们的顶点上并沿着边缘旋转它们以适应最佳效果。因此,如果它们相交,我需要进行碰撞检测。
我最大的问题是那些多边形边缘可能在同一个点上。研究的算法决定它是在多边形 a 还是 b(主要是 y 值)。
我用什么
- x 和 y 具有双坐标的多边形
- 标准java
- 没有外部库
我需要的规则:
- 多边形可以有相同的边和顶点(可以在相同的边界上,但不能完全覆盖多边形)
- 不应允许边缘相交
- 不允许一个多边形完全被另一个多边形(孔)包围。
- (算法中可选的非常小的 epsilon 会很好,因为双精度旋转不是很精确)
我也尝试了像 Path2D.Double() 这样的内部类,但也没有成功解决这个问题。 我尝试的最后一个算法(大约最少 8 个)是这样的: wiki.cizmar.org/doku.php?id=physics:point-in-polygon_problem_with_simulation_of_simplicity
这是链接算法的 C 代码(我尝试过的最后一个)
int i, j, c = 0;
for (i = 0, j = number_of_vertices-1; i < number_of_vertices; j = i++) {
if ( ((vertices[i].y>p.y) != (vertices[j].y>p.y)) &&
(p.x < (vertices[j].x-vertices[i].x) * (p.y-vertices[i].y) / (vertices[j].y-vertices[i].y) + vertices[i].x) )
c = !c;
}
return c;
我改编的 JAVA 代码(Punkt=Point, Form.getCoords = List of Coordinates with x,y)
private boolean testPointInsidePolygon3c(Punkt p, Form f){
int number_of_vertices = f.getCoords().size();
int i, j = 0;
boolean odd = false;
for (i = 0, j = number_of_vertices-1; i < number_of_vertices; j = i++) {
if ( ((f.getCoords().get(i).getY() >p.getY()) != (f.getCoords().get(j).getY() >p.getY())) &&
( p.getX() < (f.getCoords().get(j).getX() -f.getCoords().get(i).getX())
* (p.getY() -f.getCoords().get(i).getY())
/ (f.getCoords().get(j).getY() -f.getCoords().get(i).getY())
+ f.getCoords().get(i).getX())
){
odd = !odd;
}
}
return odd;
}
为了说明这个问题:这里有 2 个多边形的图片。蓝色顶点是麻烦。 Problem Example #1example from another source
我希望你对我有一些想法、链接、算法或任何东西。我被这个问题困扰太久了;-)
【问题讨论】:
标签: java algorithm polygon intersect point-in-polygon