【问题标题】:Java-Algorithm for Polygon-Collision (Point-in-Polygon): Problems with Degenerated @ BoundaryJava-Algorithm for Polygon-Collision (Point-in-Polygon):退化@边界问题
【发布时间】: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


    【解决方案1】:

    太可惜了——我不能做一个完全正确的算法来解决我的问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 2017-10-19
      相关资源
      最近更新 更多