8 Stimmen

Bestimmung, ob sich ein Lat-Long-Rechteck und ein Kreis auf einer Kugel überschneiden

Angenommen, ich habe Folgendes:

  • Ein Bereich, definiert durch minimalen und maximalen Breiten- und Längengrad (üblicherweise ein 'Breiten-Längen-Rechteck', obwohl es tatsächlich nur in bestimmten Projektionen rechteckig ist).
  • Ein Kreis, definiert durch einen Mittelpunkt Breiten- und Längengrad und einem Radius.

Wie kann ich feststellen:

  1. Ob sich die beiden Formen überschneiden?
  2. Ob der Kreis vollständig im Rechteck enthalten ist?

Ich suche nach einer vollständigen Formel/Algorithmus, anstatt einer Lektion in Mathematik.

1voto

Noah Punkte 13541

Dies sollte für alle Punkte auf der Erde funktionieren. Wenn Sie es auf eine Kugel mit einer anderen Größe ändern möchten, ändern Sie einfach den Wert von kEarchRadiusKms auf den gewünschten Radius für Ihre Kugel.

Diese Methode wird verwendet, um die Entfernung zwischen zwei Breiten- und Längengraden zu berechnen.

Ich habe diese Distanzformel von hier erhalten: 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;

    // Zwischenergebnis 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);

    // Zwischenergebnis c (Großkreisentfernung in Radianten).
    double c = 2.0 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1.0 - a));

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

    return dDistance;
}

Wenn die Entfernung zwischen einem beliebigen Eckpunkt des Rechtecks kleiner ist als die Entfernung des Radius des Kreises, überschneiden sich der Kreis und das Rechteck. Wenn die Entfernung zwischen dem Mittelpunkt des Kreises und allen Eckpunkten größer ist als der Radius des Kreises und all diese Entfernungen kürzer sind als die Breite und Höhe des Rechtecks, sollte sich der Kreis im Rechteck befinden.

Fühlen Sie sich frei, meinen Code zu korrigieren, falls Sie ein Problem damit finden, da ich sicher bin, dass es einige Bedingungen gibt, an die ich nicht gedacht habe.

Außerdem bin ich mir nicht sicher, ob dies für ein Rechteck funktioniert, das die Enden der Hemisphären überspannt, da die Distanzgleichung zusammenbrechen könnte.

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 "Kreis und Rechteck überschneiden sich...";
    }

    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 "Kreis befindet sich innerhalb des Rechtecks!";
    }

    return "NEIN!";
}

0 Stimmen

Schöner Code, aber du bist in dieselbe Falle getappt wie ich und viele andere, als sie die Frage zum ersten Mal gelesen haben. Lies die anderen Antworten und Kommentare gründlich durch. Wenn alle vier Ecken außerhalb des Kreises liegen, könnten immer noch Punkte auf den Seiten sein, die innen liegen!

-1voto

aib Punkte 42913

Für die Antwort zur euklidischen Geometrie, siehe: Kreis-Rechteck Kollisionsdetektion (Schnittmenge)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X