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!";
}