查找一组线段中的所有交点?
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 是交点数。
还有其他更现代的算法可以更快地解决这个问题,但这可能是一个很好的起点。
希望这会有所帮助!
【讨论】:
以上是关于查找一组线段中的所有交点?的主要内容,如果未能解决你的问题,请参考以下文章