查找多边形的交集并按线排序

Find intersection of polygon and order by line

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

这里有一张图片来说明这个想法:

红色数字是列表中存在的多边形线。 然后我有另一个列表,其中的线是一条多边形线的平行线,以一定的偏移量与多边形相交(图像显示多边形线 nr.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);    
                }
            }
}

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

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

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

 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());
 }