C++ 一个平面中有多少线段与水平线相交?找到这个最有效的方法是什么
我试图解决: 平面上有N个点(编号1到N);对于每个有效i,第i点是Pi=(i,Ai)。有N个−它们之间的1条线段(编号为1到N−1); 对于每个有效i,通过连接点Pi和Pi+1形成第i条线段 您将获得Q条水平线段。每个查询水平线段由两个点表示,从一个点(x1,y)到一个点(x2,y)(在这里它停止并不再传播)。对于每个水平线段,您必须从其在途中碰撞的线段(N-1条线段)中找到线段的数量 这就是问题所在:C++ 一个平面中有多少线段与水平线相交?找到这个最有效的方法是什么,c++,geometry,combinatorics,line-intersection,line-segment,C++,Geometry,Combinatorics,Line Intersection,Line Segment,我试图解决: 平面上有N个点(编号1到N);对于每个有效i,第i点是Pi=(i,Ai)。有N个−它们之间的1条线段(编号为1到N−1); 对于每个有效i,通过连接点Pi和Pi+1形成第i条线段 您将获得Q条水平线段。每个查询水平线段由两个点表示,从一个点(x1,y)到一个点(x2,y)(在这里它停止并不再传播)。对于每个水平线段,您必须从其在途中碰撞的线段(N-1条线段)中找到线段的数量 这就是问题所在: 2因此,您只有一条多段线,并且希望检查许多与水平线段相交的查询 在多段线上构建某种二进制
- 2因此,您只有一条多段线,并且希望检查许多与水平线段相交的查询
在多段线上构建某种二进制空间分区是值得的。在这种情况下,您可以在
时间中检查交叉点,因此总时间为O(log(n))
(构建和检查)O(nlogn)+O(qlogn)
如果您的多段线幸运地是凸多边形(没有一条闭合边),事情就简单多了——只需按Y坐标对边进行排序,并只检查那些相交的查询Y(二进制搜索,每个查询记录n)。在一般情况下(非凸),您的多段线可能看起来像
,您必须检查太多的边。我使用k-d树来解决此问题。也不要问持续挑战的问题。所以,为了解决这个问题,你基本上需要知道扫描线算法。对不起,我不知道hwat是多段线或BSP,我可以从中了解更多关于你的方法的细节吗?嗯。。。谷歌和计算几何书籍?多段线是常用术语。二进制空间分区-不同数据结构的广泛类。wmw