如何确定从点开始可以相交的线数?

时间:2018-04-01 17:03:19

标签: algorithm data-structures convex-hull

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

我能想到的最接近的是礼品包装算法问题,在那里我们可以找到线段的封闭边界,但我陷入了概念层面,因此无法设计策略。

另一种想法:如果两条线在x或y维度上没有交叉,那么可以通过它们的最大交叉点数只是1.但这仅适用于我的特殊线指向该方向的情况,以及如何我是否会考虑其他细分市场?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

制作ac=Active_Counter=0

遍历列表,将开始/结束字段添加到ac。最大值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

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