php - 有没有一种简单的方法来检测线段相交?

标签 php geometry

这比乍一看要复杂得多。我拥有的是一个巨大的数组,它由更多的数组组成,其中包含点[以数组“x,y”的形式],如下所示:

Array (
    [0] => Array (
        [0] => "0,9",
        [1] => "0,0",
        [2] => "9,0",
        [3] => "9,9",
        [4] => "0,9"
        )
    [1] => Array (
        [0] => "1,5",
        [1] => "1,6",
        [2] => "3,6",
        [3] => "3,8",
        [4] => "4,8"
    )
    ... and so on ...
)

所以我需要做的是处理所有点并查看数组中是否有任何点,例如 $points[0][1]$points[0][ 2],与数组中可能存在的任何其他线段相交。所有线段按照它们在各自数组中的顺序连续。因此,在第一个数组中,“0,9”变为“0,0”,并且该数组中没有其他点。数组中的最后一个点不会循环回数组中的第一个点。另外,如果一条线段终止于另一条线段的交点,则不应将其视为交点,它实际上需要穿过与其相交的线段。

我正在考虑在处理这些片段时绘制它们。因此,就像遍历数组一样,在“虚拟”网格上绘制每个点,然后每个数组都会计算它是否与已经绘制的另一个线段相交,如果这有意义的话,但这似乎仍然需要花费一些时间while 计算数组中是否有很多线段。看起来我要做的是对于数组中的每个段,计算它是否与它之前的任何段相交(因为理论上它可以与它所在的同一数组中的一个段相交)。必须有一种更简单的方法来做到这一点,对吗?

附注除了 PHP 之外,我实在想不出这应该属于什么标签。如果您想到任何请随时重新标记它。

最佳答案

这是一个简单的方法,如果每个列表中的点数很少,则可以接受:

  1. 取数组中的前两条线段和 check if they intersect .
  2. 如果没有,请对照前一个线段检查下一个线段
  3. 继续直到最后一点并对另一个数组重复(我假设您正在针对每个子数组执行此检查)。

这是O(n2),其中n是所有子数组中的点数 --- 如果n 很小 - 很棒,如果不是,请告诉我们。

更新:如果O(n2)不够好...

Sweep line algorithm for segment intersection - 据说O(n log (n))

输入:平面中的一组线段。

输出: S 中各段之间的交点集合。

关于php - 有没有一种简单的方法来检测线段相交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2411636/

相关文章:

php - 使用 JavaScript、PHP 和 MySQL 时,我在哪里设置字符集

php如何在选择下拉列表中显示类别然后显示子类别?

java - 在 JTS 上处理几何端 WKBwriter 时出现的问题

javascript - 使用 javascript 或 jquery 的几何(卷积)函数

php - 我无法使用日期获取 PHP mysql select

javascript - 页面未在 iOS 的 URLRequest 上重定向

php - CodeIgniter、Ajax...如何使用 insert_id()

java - 找到直线和高度之间的交点

c++ - CGAL - 从 Segment_2 获取边缘

Java:计算三角形的面积