我有一个与此非常相似的问题:
我正在寻找一种方法(在 C# 中)来判断一条线是否与任意多边形相交。
我认为Chris Marasti-Georg 的算法非常有帮助,但缺少最重要的方法,即线对线交叉。
有谁知道完成 Chris Marasti-Georg 代码的线交叉方法或有类似的方法?
在 C# 中是否有内置代码?
此方法适用于使用禁区功能增强的 Bing 地图算法。生成的路径不得穿过禁区(任意多边形)。
我有一个与此非常相似的问题:
我正在寻找一种方法(在 C# 中)来判断一条线是否与任意多边形相交。
我认为Chris Marasti-Georg 的算法非常有帮助,但缺少最重要的方法,即线对线交叉。
有谁知道完成 Chris Marasti-Georg 代码的线交叉方法或有类似的方法?
在 C# 中是否有内置代码?
此方法适用于使用禁区功能增强的 Bing 地图算法。生成的路径不得穿过禁区(任意多边形)。
.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;
 }
    稍微偏离主题,但如果这条线是无限的,我认为有一个更简单的解决方案:
如果所有点都位于线的同一侧,则线不会穿过多边形。
在这两个人的帮助下:
我得到了这个小宝石:
  public class PointsAndLines
  {
    public static bool IsOutside(Point lineP1, Point lineP2, IEnumerable<Point> 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));
    }
  }
    这篇文章看起来会有所帮助
http://www.codeproject.com/KB/recipes/2dpolyclip.aspx
此代码是一种二维多边形裁剪算法,可精确确定直线与多边形边界的相交位置。此代码适用于完全任意形状的凹面和凸面多边形,并且能够处理任何线方向。