找到多边形和逐行的交集

时间:2015-05-21 12:32:46

标签: c# geometry polygon intersection

我想知道是否有一种方法可以根据相交线的方向对列表中的交点进行排序。

这是一张想法的图片:

enter image description here

红色数字是List中存在的多边形线。 然后我有另一个List,其中的行是一条多边形线的平行线,该多边形线在某个偏移处与多边形相交(图像显示多边形线的平行线4)。 通过它们迭代,我得到以黑色数字显示的交叉点。

我现在的问题是我希望如图所示订购交叉点。但是当迭代每个平行时,交叉点的顺序在第22个交叉点处发生变化。 因为算法首先在多边形1处找到交点,因为我正在浏览列表。

我希望你知道我的意思。 我想找到的交点总是处于相同的模式中。

我想出的唯一想法是在坐标轴上变换当前线,然后用x值对2个交点进行排序,但我认为这非常糟糕......

我很感激每一个引导我解决问题的答案。 提前致谢

这是我的代码段:

for (int i = 0; i < parallelLines.Count; i++)
{
            for (int j = 0; j < polyLines.Count; j++)
            {
                var actual = ber.LineSegementsIntersect(
                    parallelLines[i].v1,
                    parallelLines[i].v2,
                    polyLines[j].v1,
                    polyLines[j].v2,
                    out intersection);

                // if intersection is found
                if (actual)
                {
                      intersections.Add(intersection);    
                }
            }
}

1 个答案:

答案 0 :(得分:1)

首先在外部循环中遍历这些行,然后为每一行按照您想要的特定顺序获取2个点。

修改你的代码,将两个找到的itxns放在临时列表中,而不是直接放入交集集合中 - 然后,在内部循环和外部循环之间,以正确的顺序将这两个intx对象添加到交集集合中((首先是较小的x值,或者你想要的任何规则

像这样:(假设IntersectionType是交集对象的声明类型)

 for (int i = 0; i < parallelLines.Count; i++)
 {
        var pair = new List<IntersectionType>();
        for (int j = 0; j < polyLines.Count; j++)
        {
            var actual = ber.LineSegementsIntersect(
                parallelLines[i].v1,
                parallelLines[i].v2,
                polyLines[j].v1,
                polyLines[j].v2,
                out intersection);

            // if intersection is found
            if (actual) pair .Add(intersection);                    
        }
        intersections.Add(pair.OrderBy(i=>i.XValue).First());
        intersections.Add(pair.OrderByDescending(i=>i.XValue).First());
 }

哦,顺便说一句,变量actual,如果它是我认为的那样,应该重命名为found,或者更好,重构为:

 for (int i = 0; i < parallelLines.Count; i++)
 {
        var pair = new List<IntersectionType>();
        for (int j = 0; j < polyLines.Count; j++)
            if(ber.LineSegementsIntersect(
                 parallelLines[i].v1, parallelLines[i].v2,
                 polyLines[j].v1, polyLines[j].v2,
                 out intersection))
               pair .Add(intersection);
        intersections.Add(pair.OrderBy(i=>i.XValue).First());
        intersections.Add(pair.OrderByDescending(i=>i.XValue).First());
 }