2009-07-13 115 views
9

我有非常类似这样的一个问题:如何判断一条线是否与C#中的多边形相交?

How to know if a line intersects a plane in C#?

我正在寻找一种方法(在C#),告诉如果一个线相交的任意多边形。

我认为algorithm by Chris Marasti-Georg是非常有用的,但缺少最重要的方法,即线到线的交集。

有谁知道一个线交集方法来完成Chris Marasti-Georg的代码或者有类似的东西吗?

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

该方法适用于增强了禁用区域功能的Bing Maps算法。得到的路径不得通过禁区(任意多边形)。

回答

20

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

这里已经做了你需要的东西(实际的算法是在comp.graphics.algorithms发现在谷歌组)代码(移植到C#):

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; 
} 
0

这篇文章看起来像它会帮助

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

此代码是一个二维的多边形裁剪算法来决定恰恰是一个符合多边形的边界相交。此代码适用于完全任意形状的凹面和凸面多边形,并且能够处理任何线方向。

1

为了检测我们的Silverlight地图项目多边形之间的碰撞,我们正在使用剪辑库:

免费用于商业用途,体积小,性能卓越,非常易于使用。

Clipper webpage

2

稍微偏离主题,但如果该行无限我觉得有一个更简单的解决方案:

线不通过多边形去,如果所有的点位于同的线。

有了这两个求助:

我得到了这个小宝石:

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)); 
    } 
    } 
相关问题