algorithm - 如何确定我可以从一个点相交多少条线?

标签 algorithm data-structures convex-hull

例如,给定一些线段 (a1, b1) 到 (c1, d1),(a2, b2) 到 (c2, d2),我有一条从原点径向向外指向的特殊直线,我想确定我可以实现的最大和最小交叉点数。有我可以使用的算法或概念吗?

我能想到的最接近的是礼品包装算法问题,我们可以在其中找到线段的封闭周长,但我停留在概念层面,因此无法设计策略。

另一个想法:如果两条线在 x 或 y 维度上都不相交,那么可以通过它们的最大交点数仅为 1。但这仅适用于我的特殊线指向那个方向的情况,所以如何我是否考虑其他线段?

最佳答案

据我了解,您需要为每个线段创建角度间隔,并检查这些线段与来自坐标原点的射线的交点。

找到每个线段末端的角度(例如,使用 atan2),对这些角度进行排序(作为角度间隔的开始和结束)。

创建包含所有角度的数组/列表以及值为 1/-1 的开始/结束字段。

按角度对所有项目进行排序。

使ac=Active_Counter=0

遍历链表,在ac中加入start/end字段。 ac 的最大值对应于基于原点的射线相交的最大段数

示例:

 segments (1,0)-(0,1) and (-1,1)-(1,1)
 angles (0, Pi/2) and (Pi/4, 3*Pi/4) // I ordered angles for the second segment
 sorted list    (0;+1), (Pi/4;+1),(Pi/2;-1),(3*Pi/4;-1)
 ac:         0    1        2          1          0

所以最大值是2

(不要忘记重叠遍历以考虑零角度上的间隔)

关于algorithm - 如何确定我可以从一个点相交多少条线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49600497/

相关文章:

algorithm - 非 CS/数学学位的学习算法资源

javascript - 最低和最高的数字是多少

c++ - Qt中星型系统数据结构的实现

algorithm - 对具有凹域的一组点进行三角剖分

java - Java Android Opencv 2.3 上的凸包

algorithm - 给定一个凸多边形,添加一个点并重新计算面积

algorithm - VF2算法步骤举例

c# - 如何在 C# 中将小数舍入为特定分数?

java - 如何将网格中单元格的邻居存储到优先级队列中

java - 具有固定大小和独特元素的数据结构