C++ 一个平面中有多少线段与水平线相交?找到这个最有效的方法是什么

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因此,您只有一条多段线,并且希望检查许多与水平线段相交的查询 在多段线上构建某种二进制

我试图解决:

平面上有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因此,您只有一条多段线,并且希望检查许多与水平线段相交的查询

    在多段线上构建某种二进制空间分区是值得的。在这种情况下,您可以在
    O(log(n))
    时间中检查交叉点,因此总时间为
    O(nlogn)+O(qlogn)
    (构建和检查)



    如果您的多段线幸运地是凸多边形(没有一条闭合边),事情就简单多了——只需按Y坐标对边进行排序,并只检查那些相交的查询Y(二进制搜索,每个查询记录n)。在一般情况下(非凸),您的多段线可能看起来像
    wmw
    ,您必须检查太多的边。

    我使用k-d树来解决此问题。也不要问持续挑战的问题。

    所以,为了解决这个问题,你基本上需要知道扫描线算法。

    对不起,我不知道hwat是多段线或BSP,我可以从中了解更多关于你的方法的细节吗?嗯。。。谷歌和计算几何书籍?多段线是常用术语。二进制空间分区-不同数据结构的广泛类。