Geometry 使用delphi检查位置并合并多边形

Geometry 使用delphi检查位置并合并多边形,geometry,polygons,Geometry,Polygons,在我的应用程序中,我有2个或更多多边形,一个多边形可以在其他多边形的内部或外部(全部在内部或全部在外部)。 我必须这样做: 检查一个多边形是否在其他多边形的内部(所有多边形都在内部,没有交点) 如果点1为真,“合并多边形” 要理解我的“合并多边形”,请参见图片: 如你所见,有两个多边形:A-B-C-D-A和1-2-3-1,我需要找到两个点(一个点用于A-B-C-D-A,一个点用于1-2-3-1),然后连接两条线,新线不能与多边形线相交 对于这类问题,有没有一种理论可以更快地找到最佳解决方案?边

在我的应用程序中,我有2个或更多多边形,一个多边形可以在其他多边形的内部或外部(全部在内部或全部在外部)。 我必须这样做:

  • 检查一个多边形是否在其他多边形的内部(所有多边形都在内部,没有交点)
  • 如果点1为真,“合并多边形” 要理解我的“合并多边形”,请参见图片:

    如你所见,有两个多边形:A-B-C-D-A和1-2-3-1,我需要找到两个点(一个点用于A-B-C-D-A,一个点用于1-2-3-1),然后连接两条线,新线不能与多边形线相交


    对于这类问题,有没有一种理论可以更快地找到最佳解决方案?

    边上的多边形另一个多边形中的多边形

    由于多边形要么全部在内部,要么全部在外部,因此可以简单地简化为测试多边形的一个点是在另一个多边形的内部还是外部。这是一个众所周知的问题,有多种解决方案:

    合并多边形


    你的问题没有唯一的解决办法。对我来说,最明显的方法是找到两个角点,每个多边形的一个角点比其他角点对靠得更近。

    要达到最佳性能,你应该在自己的数据上比较不同的算法。我比较了一些多边形中的点算法,发现光线投射提供了最好的性能。您可以找到一个编写良好的光线投射算法实现

    这是快速和简单的一部分,在下一步你们要合并两个多边形。如果多边形是凸的,你可以连接两个更近的顶点,但是因为你说它们可能是凹的(或者甚至是边缘上有额外顶点的凸多边形),所以更近的角点不起作用。例如:

    您应该从每个多边形中选择一个顶点,使其连接线不与任何多边形的边相交。要查找两条相交的直线,可以执行以下操作:

    function Zero(const Value: Double): Boolean;
    const
      Epsilon = 1E-10;
    begin
      Result := Abs(Value) < Epsilon;
    end;
    
    function IntersectLines(const X11, Y11, X12, Y12, X21, Y21, X22, Y22: Double;
      out X, Y: Double): Boolean;
    var
      A1, B1, C1, A2, B2, C2, D: Double;
    begin
      A1 := Y12 - Y11;
      B1 := X11 - X12;
      C1 := A1 * X11 + B1 * Y11;
    
      A2 := Y22 - Y21;
      B2 := X21 - X22;
      C2 := A2 * X21 + B2 * Y21;
    
      D := A1 * B2 - A2 * B1;
      if Zero(D) then
        Result := False // Lines are parallel
      else
      begin
        X = (B2 * C1 - B1 * C2) / D;
        Y = (A1 * C2 - A2 * C1) / D;
      end;
    end;
    
    函数零(常量值:Double):布尔值;
    常数
    ε=1E-10;
    开始
    结果:=Abs(值)
    但是请注意,仅仅查找交点并不意味着选定的顶点不正确,因为我们正在处理线段,因此交点应该在线段内部。若要了解这一点,可以检查该点是否位于线段的边界框内。例如,在本图中,1和2是选定的顶点,3是它们与边的交叉线的交点,但3不在1和2的覆盖边界框内

    您应该注意到,每个选定顶点对的交叉线将与边界框内每个多边形的至少两条边(与选定顶点相交的边)交叉,因此边界框不应包含其边界

    之后,您应该将外部多边形与其选定顶点分开,并在它们之间插入内部多边形的重定向顶点

    最后一句话,我应该说:是的!关于所有这些有很多理论,但你应该找到自己的理论。正如您所说,一个多边形都在另一个多边形内,这意味着它们是系统生成的,甚至是预定义的,就像角色边界一样。然后
    您可以更改所有讨论过的算法,以便在您自己的情况下获得更好的性能。

    我们使用一种简单的蛮力方法来确定多边形中的任何点

    创建画布,用白色填充,然后用蓝色绘制多边形。现在查看您感兴趣的任何点的像素颜色,以确定它是否位于多边形内

    如果您想知道一个画布是否完全包含在另一个画布中,请创建第二个画布并在另一个画布上绘制一个画布,两个画布都是蓝色的,然后比较它们是否相同


    从计算上来说,这不是最有效的,但它是完全准确的。

    请不要使用JPG进行插图-使用PNG(或者更好的是,如果可能,使用SVG)。好的,下次我将使用PNG或SVG。您的多边形总是凸的吗?不,也可以是凹的,但没有任何相交。