计算几何——线段求交

线段求交一个算法,时间复杂度为(nlogn):

维护两个AVLTree的数据结构,分别为event和lines。

对于所有的线段,将其起点和终点都加入event中,其中每个点的key值为该点的y坐标。这样,对于这个AVLTree结构的event,我们得到的是一个重上到下的点集。

按照重上到下的遍历方法,对于每个节点,进行相应的处理:

      1.如果是起点,则将这个点所在的线段,加入到lines数据结构中,该线段对应的key值为这个点的x坐标。将这个线段和左右邻居线段分别求交,如果有交点,将交点加入event中,key值为该交点的y坐标。注意这里的左右邻居并不是简单的左孩子和右孩子,而是按照顺序遍历的左右邻居。

     2.如果是终点,则从lines中删除该点所在的线段。删除该线段后,该线段以前的左右邻居现在相邻,对他们求交,如果有交点,加入到event中。这里注意一点,应该存在交换线段的过程,所以此时的线段的key值和线段是不对应的。

     3.如果是交点,则交换产生该交点的两条线段在lines中的位置。对于处于新位置的线段,分别和左右邻居线段求交,将得到的新的交点加入到event中。


对于lines,不能准确的通过key值找到对应的线段,因为存在线段交换的问题。解决方案,对于每个线段,定义一个key值,专门用来存放该线段的真实key值。可以通过这个专门的key值进行线段的search和delete。


你可能感兴趣的:(计算几何)