用什么算法找到多边形和圆之间的交叉区域?

时间:2013-06-02 03:36:04

标签: javascript algorithm map geometry polygon

我有地图。在地图图层的顶部有一个多边形A和一个圆B.它们相互交叉。任何算法都可以计算交点C?enter image description here

的面积

2 个答案:

答案 0 :(得分:4)

假设您愿意接近圆的近似值(具有大量边的多边形......),那么有许多算法可用于计算多边形裁剪的结果(请参阅here ,简短列表)。

一个简单的实现可归结为:

  1. 确定多边形A的点在多边形B中的位置,反之亦然
  2. 确定跨越内外边界的线段的交点,
  3. 从收集的点集构造新的多边形。要计算新多边形的面积,您可以将其分解为三角形集合并对其面积求和。
  4. 如果您不想完成所有这些工作,请尝试JS Clipper。它可能会让你的生活更轻松。

    如果你不愿意对你的圆圈进行任意好的近似,我想你必须开始在多边形线段和圆的边界之间找到交点,然后逐段整合每个部分。

答案 1 :(得分:1)

这可以在没有近似值的情况下完成:

  1. 找到多边形和圆圈之间的交叉点
  2. 构成交叉区域的边界 - 您将有一系列线段和弧
  3. 使用格林公式计算区域面积:http://en.wikipedia.org/wiki/Green%27s_theorem#Area_Calculation - Integral[border](x*dy-y*dx)
  4. 对于每个线段,计算此积分都是微不足道的 - 它只是x0*y1-y0*x1

    对于圆弧,它有点冗长。最终结果为Cx*(y1-y0) - Cy*(x1-x0) ) + R^2*(t1-t0),其中(Cx,Cy)为圆心,(x0,y0)为弧的起点,(x1,y1)为弧的终点,t0为弧的起始角度,t1正在完成弧的角度。

    只是为了让任何人都可以验证推导,这是它: (当然,它可以从几何体派生,但我通过公式来实现)

    Integral[arc](x*dy-y*dx)

    Integral[t=t0..t1]( (Cx+R*cos t)*R*cos t - (Cy+R*sin t)*(-R*sin t) )dt

    Integral[t=t0..t1]( (Cx+R*cos t)*R*cos t + (Cy+R*sin t)*R*sin t )dt

    Integral[t=t0..t1]( Cx*R*cos t + R^2*cos^2 t + Cy*R*sin t + R^2*sin^2 t )dt

    Integral[t=t0..t1]( Cx*R*cos t + Cy*R*sin t + R^2*sin^2 t + R^2*cos^2 t )dt

    Integral[t=t0..t1]( Cx*R*cos t + Cy*R*sin t + R^2 )dt

    Integral[t=t0..t1]( Cx*R*cos t + Cy*R*sin t )dt + R^2*(t1-t0)

    Integral[t=t0..t1]( Cx*R*d(sin t) - Cy*R*d(cos t) ) + R^2*(t1-t0)

    Cx*R*(sin t1-sin t0) - Cy*R*(cos t1-cos t0) ) + R^2*(t1-t0)

    Cx*(y1-y0) - Cy*(x1-x0) ) + R^2*(t1-t0)