我需要为我的java程序检查多边形碰撞的功能,但算法(对于多边形中的点)我尝试过不适合我的需求,退行性病例对我来说是一个问题。Java-Algorithm for Polygon-Collision(Point-in-Polygon):Degenerated @ Boundary的问题
这就是我试图达到我的程序:我有2个多边形,并希望把它们放在一起尽可能。我想把它们放在它们的顶点上并沿着边缘旋转它们以适合最佳。因此,如果它们相交,我需要碰撞检测。
我最大的问题是那些多边形边缘可能在同一点上。研究的算法决定它是否在多边形a或b中(大部分是y值)。
我用什么
- 多边形双坐标x和y
- 标准的Java
- 没有外部图书馆的
我所需的规则:
- 多边形可以具有相同的边缘和相同的顶点(可以是在同一边界上,但不是完整的多边形覆盖)
- 边缘不应该被允许相交
- 这是不允许的,一个多边形完全被另一个多边形(一个孔)包围。
- (算法中的一个可选的非常小的小量将是一件好事,因为双旋转不是很准确)
我试着像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 =点,Form.getCoords =坐标列表与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
我希望你有一些想法,链接,算法或任何对我来说。我得到这个问题的时间太长了;-)