Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 任意线段的Bentley-Ottmann算法_Java_Algorithm_Time Complexity_Computational Geometry_Line Intersection - Fatal编程技术网

Java 任意线段的Bentley-Ottmann算法

Java 任意线段的Bentley-Ottmann算法,java,algorithm,time-complexity,computational-geometry,line-intersection,Java,Algorithm,Time Complexity,Computational Geometry,Line Intersection,我已经实现了Bentley-Ottmann算法,还处理了这里提到的边缘情况: 但是,它仍然不适用于所有线段,例如,此线段仅找到左侧交点,而未找到第二个(当从事件优先级队列中将第一个交点提取为事件时,在扫描线字典中,左侧的前两条线反转): 或者在有点复杂的情况下,仍然只能识别左侧的第一个交点: 我应该向算法中添加什么或对其进行更改,以同时考虑这种情况(当然还要保持其O(n logn)复杂性) 编辑:另一个“脏”示例,这次未找到交点: 编辑2: 参见第28页起的算法伪代码和模拟: 为什么要投否决票

我已经实现了Bentley-Ottmann算法,还处理了这里提到的边缘情况:

但是,它仍然不适用于所有线段,例如,此线段仅找到左侧交点,而未找到第二个(当从事件优先级队列中将第一个交点提取为事件时,在扫描线字典中,左侧的前两条线反转):

或者在有点复杂的情况下,仍然只能识别左侧的第一个交点:

我应该向算法中添加什么或对其进行更改,以同时考虑这种情况(当然还要保持其O(n logn)复杂性)

编辑:另一个“脏”示例,这次未找到交点:

编辑2: 参见第28页起的算法伪代码和模拟:

为什么要投否决票?这是一个理论问题,这就是为什么没有代码发布。实际上没有,根据算法(应该足够快),只需尝试获取纸张上第一张图像的交点。您可以遵循以下伪代码:。我确信我的实现是正确的,因为我在互联网上的任何地方都没有看到这种与此算法相关的边缘情况。只是猜测-你记得在第一种情况下处理第一个交叉事件点后测试交叉口吗?根据算法,在这个确切的事件中不需要。查看正在处理交叉事件的“伪代码:Bentley-Ottmann算法”部分的“Else”语句。If(I=相交(segE2与segA)存在)If(I不在等式中)将I插入等式那不是在交换后检查交叉点吗?