我有地图。在地图图层的顶部有一个多边形A和一个圆B.它们相互交叉。任何算法都可以计算交点C?
答案 0 :(得分:4)
假设您愿意接近圆的近似值(具有大量边的多边形......),那么有许多算法可用于计算多边形裁剪的结果(请参阅here ,简短列表)。
一个简单的实现可归结为:
如果您不想完成所有这些工作,请尝试JS Clipper。它可能会让你的生活更轻松。
如果你不愿意对你的圆圈进行任意好的近似,我想你必须开始在多边形线段和圆的边界之间找到交点,然后逐段整合每个部分。
答案 1 :(得分:1)
这可以在没有近似值的情况下完成:
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)