给定一些线段(a1,b1)到(c1,d1),(a2,b2)到(c2,d2),我有一条从原点径向向外指向的特殊线,我想要确定我可以实现的最大和最小交叉点数量。我可以使用算法或概念吗?
我能想到的最接近的是礼品包装算法问题,在那里我们可以找到线段的封闭边界,但我陷入了概念层面,因此无法设计策略。
另一种想法:如果两条线在x或y维度上没有交叉,那么可以通过它们的最大交叉点数只是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
(不要忘记重叠遍历以考虑零角度的间隔)