2

我有地图。在地图图层的顶部有一个多边形 A 和圆形 B。它们彼此相交。任何算法都可以计算交点 C 的面积?在此处输入图像描述

4

2 回答 2

4

假设您愿意采用圆的近似值(具有大量边的多边形......),那么有很多算法可以计算多边形裁剪的结果(参见此处,以获得简短列表)。

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

  1. 确定多边形 A 的哪些点位于多边形 B 内,反之亦然
  2. 确定穿过内外边界的线段的交点,以及
  3. 从收集的点集构造一个新的多边形。要计算该新多边形的面积,您只需将其分解为一组三角形并将它们的面积相加即可。

如果您不想完成所有这些工作,请尝试JS Clipper。它可能会让你的生活更轻松。

如果您不愿意随意使用您的圆的近似值,我认为您必须开始寻找多边形线段和圆边界之间的交点,然后对每个部分进行分段积分。

于 2013-06-02T04:24:19.500 回答
1

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

  1. 找到多边形和圆之间的交点
  2. 构成相交区域的边界 - 您将拥有一系列线段和弧线
  3. 使用格林公式计算该区域的面积: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)

于 2013-06-02T07:43:14.227 回答