我有地图。在地图图层的顶部有一个多边形 A 和圆形 B。它们彼此相交。任何算法都可以计算交点 C 的面积?
2 回答
假设您愿意采用圆的近似值(具有大量边的多边形......),那么有很多算法可以计算多边形裁剪的结果(参见此处,以获得简短列表)。
一个简单的实现可以归结为:
- 确定多边形 A 的哪些点位于多边形 B 内,反之亦然
- 确定穿过内外边界的线段的交点,以及
- 从收集的点集构造一个新的多边形。要计算该新多边形的面积,您只需将其分解为一组三角形并将它们的面积相加即可。
如果您不想完成所有这些工作,请尝试JS Clipper。它可能会让你的生活更轻松。
如果您不愿意随意使用您的圆的近似值,我认为您必须开始寻找多边形线段和圆边界之间的交点,然后对每个部分进行分段积分。
这可以在没有近似值的情况下完成:
- 找到多边形和圆之间的交点
- 构成相交区域的边界 - 您将拥有一系列线段和弧线
- 使用格林公式计算该区域的面积:http ://en.wikipedia.org/wiki/Green%27s_theorem#Area_Calculation -
Integral[border](x*dy-y*dx)
对于每个线段计算这个积分是微不足道的 - 它只是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)