判断自相交有以下解决方案:
简单、缓慢、低内存占用:将每个段与所有其他段进行比较并检查交叉点。 复杂度 O(n2)。
稍快,中等内存占用(上面的修改版本):将边缘存储在空间“桶”中,然后在每个桶的基础上执行上述算法。 m 个桶的复杂度 O(n2 / m)(假设均匀分布)。
快速和高内存占用:使用空间散列函数将边分割成桶。 检查碰撞。 复杂度 O(n)。
快速且低内存占用:使用扫描线算法,例如此处(或此处)描述的算法。 复杂度 O(n log n)
最后一个是我最喜欢的,因为它具有良好的速度 - 内存平衡,尤其是 Bentley-Ottmann 算法。 实现也不是太复杂。