查找一组线段中的所有交点?

Posted

技术标签:

【中文标题】查找一组线段中的所有交点?【英文标题】:Finding all intersection points in a group of line segments? 【发布时间】:2020-04-09 20:21:56 【问题描述】:

我有一个对象数组(线)和一个返回真/假的二元运算(交集)。 蛮力是复制数组并在嵌套的 for 循环中运行。

for (Line line : linesArray) 
            for (int j = 0; j < linesArray.length; j++) 
                if (line.isIntersecting(linesArray[j])) 
                    Point intersection = line.intersectionWith(linesArray[j]);
                    d.drawCircle(intersection.getXInt(), intersection.getYInt(), 3);
                    d.fillCircle(intersection.getXInt(), intersection.getYInt(), 3);
                
            
        

但是,顺序并不重要,所以我想生成一个大小为 2 的子集并检查每个子集,但复杂的明智之举似乎并没有更好

这样做是否有效率(运行时间)?

【问题讨论】:

你的输入输出是什么? 【参考方案1】:

您是正确的,枚举所有大小为 2 的子集并检查每个子集不会对您现有的算法有所改进。事实上,这本质上只是对你的算法所做的重述。

有更快的算法可以解决在一组线段中查找所有交点的问题。其中最著名的是Bentley-Ottmann algorithm,它的工作原理是按线段的 x 坐标对线段进行排序,并在点上从左到右扫过一条线。它的工作时间为 O((n + k)log n),其中 n 是线段数,k 是交点数。

还有其他更现代的算法可以更快地解决这个问题,但这可能是一个很好的起点。

希望这会有所帮助!

【讨论】:

以上是关于查找一组线段中的所有交点?的主要内容,如果未能解决你的问题,请参考以下文章

所有线段的交点-初级篇

以整数形式获取线段和 2^n 网格之间的所有交点

求两条线段交点zz

[poj] 3304 Segments || 判断线段相交

POJ 1039 (求线段交点 + 思维)

线段与线段的交点