【问题标题】:What algorithm use to find the intersection area between polygon and circle? [closed]什么算法用来找到多边形和圆之间的交集区域? [关闭]
【发布时间】:2013-06-02 03:36:04
【问题描述】:

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

【问题讨论】:

  • 您需要解决多普遍的问题?多边形总是简单的(非自相交的)吗?如果是这样,多边形是否总是凸的?多边形是否只在两点与圆相交(如图所示)?
  • @TedHopp,是的,多边形总是非自相交的。但是是非凸多边形。不,当圆移动内多边形时会有更多的点相交。
  • 要找到交叉点的面积,首先在两个交叉点之间画一条线。然后计算多边形其余部分的面积并添加线段的面积。

标签: javascript algorithm map geometry polygon


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 经过 JS 剪裁器后。我不知道从哪里开始使用脚本来计算交叉区域。你能简单地给出一些提示来达到这个结果吗?
【解决方案2】:

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

  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)

【讨论】:

    猜你喜欢
    • 2015-05-31
    • 2021-11-02
    • 1970-01-01
    • 2016-02-05
    • 2010-09-23
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多