【问题标题】:Calculating intersect point of 2 lat/lng line segments on earth计算地球上 2 个 lat/lng 线段的交点
【发布时间】:2010-09-27 06:53:08
【问题描述】:

我一直在尝试多种功能,包括 2D 功能,试图让这有点工作,但还没有运气...

我在地球上有两条 latlng 端点的线段,我想知道两条线是否相交以及在何处相交。

我目前正在研究这个,物理学专业的学生说应该为 2d 平面做这项工作,但事实并非如此。相交总是返回 true

[代码]函数 intersectPoint($line1start, $line1end, $line2start, $line2end) //($p0_x, $p0_y, $p1_x, $p1_y, $p2_x, $p2_y, $p3_x, $p3_y) { $p0_x = $line1start['lat']; $p0_y = $line1start['lng']; $p1_x = $line1end['lat']; $p1_y = $line1end['lng']; $p2_x = $line2start['lat']; $p2_y = $line2start['lng']; $p3_x = $line1end['lat']; $p3_y = $line1end['lng'];

$s1_x = (double) $p1_x - (double) $p0_x;
$s1_y = (double) $p1_y - (double) $p0_y;

// s1_x = p1_x - p0_x; // s1_y = p1_y - p0_y; $s2_x = (双) $p3_x - (双) $p2_x; $s2_y = (双) $p3_y - (双) $p2_y; $s3_x = (双) $p0_x - (双) $p2_x; $s3_y = (双) $p0_y - (双) $p2_y; // s2_x = p3_x - p2_x; // s2_y = p3_y - p2_y;

$s = (double) ((double)(-$s1_y * $s3_x + $s1_x * $s3_y) / (double) (-$s2_x * $s1_y + $s1_x * $s2_y));
$t = (double) ((double)( $s2_x * $s3_y - $s2_y * $s3_x) / (double) (-$s2_x * $s1_y + $s1_x * $s2_y));

// s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y)) / (-s2_x * s1_y + s1_x * s2_y); // t = ( s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x)) / (-s2_x * s1_y + s1_x * s2_y);

if ($s >= 0 && $s <= 1 && $t >= 0 && $t <= 1)
{
    AppCommUtility::echof(" FUNC RETURNED TRUE $s >= 0 && $s <= 1 && $t >= 0 && $t <= 1");
    // Collision detected
    return array(
        'lat' => $p0_x + ($t * $s1_x),
        'lng' => $p0_y + ($t * $s1_y)
    );
}

return null; // No collision

}[/code]

【问题讨论】:

    标签: line segment intersect


    【解决方案1】:

    假设:你的线段是great circle arcs。

    任何一对不同的大圆恰好相交两次。所以,你可以:

    1. 找到两个交点。
    2. 查看交点是否位于您的圆弧中。

    Here是这个方法的讨论。

    【讨论】:

      猜你喜欢
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 2017-05-05
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多