2015-10-27 42 views
0

我需要为我的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

我希望你有一些想法,链接,算法或任何对我来说。我得到这个问题的时间太长了;-)

回答

0

真是遗憾 - 我无法做一个完整的正确算法,解决了我的问题。

这就是我现在使用JTS-Library的原因! 重叠和覆盖/在我的测试案例中,我得到了一切正确。