确定球体上的纬线矩形和圆形是否重叠

时间:2008-12-26 19:59:10

标签: language-agnostic math geometry gis trigonometry

假设我有以下内容:

  • 由最小和最大纬度和经度定义的区域(通常是'lat-long rect',但除了某些投影外,它实际上不是矩形)。
  • 由中心纬度/长度和半径
  • 定义的圆

我如何确定:

  1. 两个形状是否重叠?
  2. 圆圈是否完全包含在矩形内?
  3. 我正在寻找一个完整的公式/算法,而不是数学课程本身。

7 个答案:

答案 0 :(得分:3)

答案 1 :(得分:3)

使用Stereographic projection。所有圆圈(特别是纬度,经度和圆圈)都映射到平面中的圆(或线)。现在只是关于平面几何中的圆和线的问题(更好的是,所有的长度都是0到0的线,所有的纬度都是0左右的圆)。

答案 2 :(得分:2)

这个怎么样?

找到将矩形中心(点v)连接到圆心的矢量Cr。找到iv相交的点||i-Cr|| + r > ||v||。如果v则它们相交。

换句话说,矩形内的线段长度加上圆内线段的长度应该大于总长度(i,中心连接线段)。

寻找点{{1}}应该是一个棘手的部分,特别是如果它落在经度边缘,但你应该能够提供比我更快的东西。

编辑:此方法无法判断圆是否完全在矩形内。您需要找到从中心到矩形边缘的四个边缘的距离。

编辑:以上内容不正确。有些情况,正如Federico Ramponi建议的那样,即使在欧几里德几何中它也不起作用。我会发布另一个答案。请不要接受这个并随意投票。我很快就会删除它。

答案 3 :(得分:2)

  • 是的,如果方框角包含圆心。
  • 是的,如果任何方框角落在圆心半径范围内。
  • 是的,如果框中包含圆心的经度,则最接近圆心 - 纬度的框 - 纬度的经度交点在圆心的半径范围内。
  • 是的,如果框中包含圆心的纬度,并且距离最短交叉轴承的圆心半径距离的点是“超出”最近的盒子经度;通过找到从圆心到零纬度点的经度和经过pi / 2“超过”最接近的经度的点的初始方位来确定最短交叉点。
  • 不,否则。

假设:

  • 您可以找到从A点到B点的最小路线的初始方位。
  • 你可以找到两点之间的距离。

第一次检查是微不足道的。第二次检查只需要找到四个距离。第三项检查只需要找到从圆心到(最近的盒子纬度,圆心 - 经度)的距离。

第四项检查需要找到最接近圆心的边界框的经度线。然后找到距离圆心最远的经度线所在的大圆的中心。找到从圆心到大圆心的初始方位。从该轴承的圆心中找出圆弧半径。如果该点位于距离圆心最近的经度线的另一侧,则圆和边界框在该边相交。

在我看来应该有一个缺陷,但我找不到它。

我似乎无法解决的真正问题是找到完美包含圆圈的边界框(对于不包含极点的圆圈)。纬度最小值/最大值的方位似乎是圆心和圆半径/(球面周长/ 4)的纬度的函数。在赤道附近,它落到pi / 2(东)或3 * pi / 2(西)。随着中心接近极点并且半径接近球面周长/ 4,轴承接近零(北)或pi(南)。

答案 4 :(得分:1)

再试一次......

我认为解决方案是测试一组积分,正如Jason S建议的那样,但我不同意他选择的积分,我认为这在数学上是错误的。

您需要找到lat / long框两侧的点,其中到圆心的距离是局部最小值或最大值。将这些点添加到角集,然后上面的算法应该是正确的。

即,让经度为x维度,纬度为y维度,让每个维度 对于o <= t <= 1.0,框的边是参数曲线P(t)= P0 + t(P1-P0),其中 P0和P1是两个相邻的角。

设f(P)= f(P.x,P.y)是距圆心的距离。

然后f(P0 + t(P1-P0))是t:g(t)的距离函数。找到距离函数的导数为零的所有点:g'(t)== 0.(丢弃解决方案超出域0&lt; = t&lt; = 1.0,当然)

不幸的是,这需要找到超越表达式的零,因此没有封闭形式的解决方案。这种类型的方程只能通过Newton-Raphson迭代求解。

好的,我意识到你需要代码,而不是数学。但数学就是我所拥有的。

答案 5 :(得分:1)

这适用于地球上的任何一点。如果要将其更改为不同大小的球体,只需将kEarchRadiusKms更改为球体所需的半径。

此方法用于计算纬度和离子点之间的距离。

我从这里得到了这个距离公式: http://www.codeproject.com/csharp/distancebetweenlocations.asp

public static double Calc(double Lat1, double Long1, double Lat2, double Long2)
{
    double dDistance = Double.MinValue;
    double dLat1InRad = Lat1 * (Math.PI / 180.0);
    double dLong1InRad = Long1 * (Math.PI / 180.0);
    double dLat2InRad = Lat2 * (Math.PI / 180.0);
    double dLong2InRad = Long2 * (Math.PI / 180.0);

    double dLongitude = dLong2InRad - dLong1InRad;
    double dLatitude = dLat2InRad - dLat1InRad;

    // Intermediate result a.
    double a = Math.Pow(Math.Sin(dLatitude / 2.0), 2.0) +
               Math.Cos(dLat1InRad) * Math.Cos(dLat2InRad) *
               Math.Pow(Math.Sin(dLongitude / 2.0), 2.0);

    // Intermediate result c (great circle distance in Radians).
    double c = 2.0 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1.0 - a));

    // Distance.
    // const Double kEarthRadiusMiles = 3956.0;
    const Double kEarthRadiusKms = 6376.5;
    dDistance = kEarthRadiusKms * c;

    return dDistance;
}

如果矩形的任何顶点之间的距离小于圆的半径距离,则圆和矩形重叠。如果圆心和所有顶点之间的距离大于圆的半径,并且所有这些距离都比矩形的宽度和高度短,那么圆应该在矩形内部。

如果您发现问题,请随意更正我的代码,因为我确信有一些我没想过的情况。

此外,我不确定这是否适用于跨越半球末端的矩形,因为距离方程可能会崩溃。

public string Test(double cLat,
    double cLon,
    double cRadius,
    double rlat1,
    double rlon1,
    double rlat2,
    double rlon2,
    double rlat3,
    double rlon3,
    double rlat4,
    double rlon4)
{
    double d1 = Calc(cLat, cLon, rlat1, rlon1);
    double d2 = Calc(cLat, cLon, rlat2, rlon2);
    double d3 = Calc(cLat, cLon, rlat3, rlon3);
    double d4 = Calc(cLat, cLon, rlat4, rlon4);

    if (d1 <= cRadius ||
        d2 <= cRadius ||
        d3 <= cRadius ||
        d4 <= cRadius)
    {

        return "Circle and Rectangle intersect...";
    }

    double width = Calc(rlat1, rlon1, rlat2, rlon2);
    double height = Calc(rlat1, rlon1, rlat4, rlon4);

    if (d1 >= cRadius &&
        d2 >= cRadius &&
        d3 >= cRadius &&
        d4 >= cRadius &&
        width >= d1 &&
        width >= d2 &&
        width >= d3 &&
        width >= d4 &&
        height >= d1 &&
        height >= d2 &&
        height >= d3 &&
        height >= d4)
    {
        return "Circle is Inside of Rectangle!";
    }



    return "NO!";
}

答案 6 :(得分:-1)

有关欧几里德几何答案,请参阅:Circle-Rectangle collision detection (intersection)