如何判断一条线是否与C#中的多边形相交?

我有一个非常类似的问题:

如何知道一条线是否与C#中的平面相交?

我正在寻找一种方法(在C#中),它告诉一条线是否与任意多边形相交。

我认为Chris Marasti-Georg的算法非常有用,但缺少最重要的方法,即线对线交叉。

有没有人知道线路交叉方法来完成Chris Marasti-Georg的代码还是有类似的东西?

在C#中是否有内置代码?

此方法适用于使用禁区function增强的Bing Maps算法。 生成的路径不得通过禁区(任意多边形)。

.NET框架内置的边缘检测没有内置代码。

这里的代码(移植到C#)可以满足您的需求(实际的算法可以在Google组上的comp.graphics.algorithms中找到):

public static PointF FindLineIntersection(PointF start1, PointF end1, PointF start2, PointF end2) { float denom = ((end1.X - start1.X) * (end2.Y - start2.Y)) - ((end1.Y - start1.Y) * (end2.X - start2.X)); // AB & CD are parallel if (denom == 0) return PointF.Empty; float numer = ((start1.Y - start2.Y) * (end2.X - start2.X)) - ((start1.X - start2.X) * (end2.Y - start2.Y)); float r = numer / denom; float numer2 = ((start1.Y - start2.Y) * (end1.X - start1.X)) - ((start1.X - start2.X) * (end1.Y - start1.Y)); float s = numer2 / denom; if ((r < 0 || r > 1) || (s < 0 || s > 1)) return PointF.Empty; // Find intersection point PointF result = new PointF(); result.X = start1.X + (r * (end1.X - start1.X)); result.Y = start1.Y + (r * (end1.Y - start1.Y)); return result; } 

稍微偏离主题,但如果线是无限的,我认为有一个更简单的解决方案:

如果所有点都位于线的同一侧 ,则线不会通过多边形。

在这两个的帮助下:

  • 使用linq或其他方法,如何检查所有列表项是否具有相同的值并将其返回,如果不是,则返回“otherValue”?
  • 确定一条线所在的一侧

我得到了这个小gem:

  public class PointsAndLines { public static bool IsOutside(Point lineP1, Point lineP2, IEnumerable region) { if (region == null || !region.Any()) return true; var side = GetSide(lineP1, lineP2, region.First()); return side == 0 ? false : region.All(x => GetSide(lineP1, lineP2, x) == side); } public static int GetSide(Point lineP1, Point lineP2, Point queryP) { return Math.Sign((lineP2.X - lineP1.X) * (queryP.Y - lineP1.Y) - (lineP2.Y - lineP1.Y) * (queryP.X - lineP1.X)); } } 

为了检测silverlight地图项目中多边形之间的碰撞,我们使用了clipper库:

免费用于商业用途,体积小,性能卓越,使用方便。

快船网页

这篇文章看起来会有所帮助

http://www.codeproject.com/KB/recipes/2dpolyclip.aspx

此代码是一种二维多边形裁剪算法,可精确确定线与多边形边界相交的位置。 此代码适用于完全任意形状的凹面和凸面多边形,并且能够处理任何线方向。