Line 计算地球上2条lat/lng线段的交点

Line 计算地球上2条lat/lng线段的交点,line,segment,intersect,Line,Segment,Intersect,我一直在尝试多个函数,包括2D函数,试图让它在某种程度上正常工作,但还没有运气 我在地球上有两条latlng端点的线段,我想知道这两条线是否相交,在哪里相交 我目前正在研究这个,一个物理专业的学生说应该做2d平面的工作,但它不是。对于intersect,它总是返回true [code]函数交点($line1start、$line1end、$line2start、$line2end) //($p0_x、$p0_y、$p1_x、$p1_y、$p2_x、$p2_y、$p3_x、$p3_y) { $p0

我一直在尝试多个函数,包括2D函数,试图让它在某种程度上正常工作,但还没有运气

我在地球上有两条latlng端点的线段,我想知道这两条线是否相交,在哪里相交

我目前正在研究这个,一个物理专业的学生说应该做2d平面的工作,但它不是。对于intersect,它总是返回true

[code]函数交点($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*s2y); //t=(s2_x*(p0_y-p2_y)-s2_y*(p0_x-p2_x))/(-s2_x*s1_y+s1_x*s2_y)

如果($s>=0&&$s=0&&$t$p0\ux+($t*$s1\ux),
“液化天然气”=>$p0\U y+($t*$s1\U y)
);
}
返回null;//无碰撞

}[/code]

假设:线段是圆弧

任何一对明显的大圆正好相交两次。因此,您可以:

  • 找到两个交点
  • 查看交点是否位于圆弧中
  • 是对这种方法的讨论

    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