给定一些行段(A1,B1(到(C1,D1(,(A2,B2(至(C2,D2(从原点开始,我想确定我可以实现的最大和最小交叉点数。我可以使用算法或概念吗?
我最接近的是礼物包装算法问题,我们可以在其中找到线段的封闭外围,但我陷入了概念层面,因此无法制定策略。
另一个想法:如果两条线在x或y维度上都没有相交,则可以通过它们的最大交叉点仅为1。但是,只有当我的特殊线路朝那个方向上方点,因此如何适用我会说其他行段吗?
据我了解,您需要为每个段创建角间隔,并检查这些片段与来自坐标的射线的交叉点。
查找每个片段末端的角度(例如,使用atan2
(,订购这些角度(作为Angluar间隔的开始和结尾(。
制作包含所有角度的数组/列表与启动/结束字段一起使用值1/-1。
按角度对所有项目进行排序。
制作ac=Active_Counter=0
traverse列表,将开始/结束字段添加到ac
。ac
的最大值对应于基于原点的射线相交的段的最大nuimber
示例:
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
(不要忘记重叠遍历以占零角度的间隔(