Frage

Ich programmiere einen Algorithmus, wo ich die Oberfläche einer Kugel in Gitterpunkten aufgebrochen sind (der Einfachheit halber I die Rasterlinien parallel und senkrecht zu den Meridianen haben). Bei einem Punkt A, würde Ich mag der Lage sein, effizient jede grid „square“ zu nehmen und den Punkt B auf dem Platz zu bestimmen, mit dem geringsten Abstand AB sphärischen Koordinate. Im entarteten Fall sind die „Quadrate“ eigentlich „Dreiecke“.

Ich bin eigentlich nur sie gebunden, die Quadrate mit Ich suche, so kann ich auch ein Untergrenze akzeptieren, wenn es nur ein kleines bisschen ausgeschaltet ist. Aus diesem Grunde muß ich den Algorithmus extrem schnell sein, sonst wäre es besser, nur den Verlust der Genauigkeit zu nehmen und noch ein paar Plätze suchen.

War es hilfreich?

Andere Tipps

Für die Punkte auf einer Kugel, die Punkte am nächsten in dem vollen 3D-Raum werden auch am nächsten sein, wenn entlang der Oberfläche der Kugel gemessen. Die tatsächlichen Entfernungen werden anders sein, aber wenn man nur nach dem nächsten Punkt ist es wahrscheinlich am einfachsten, den 3D-Abstand zu minimieren, anstatt Sorgen über große Kreisbögen, etc.

Um die tatsächliche Großkreisentfernung zwischen zwei (latitidude, Längengrad) Punkten auf der Kugel zu finden, können Sie die erste Formel in Link .

Ein paar Punkte, für Klarheit.

Wenn Sie nicht speziell auf diese Quadrate wollen quadratisch sein (und daher nicht genau mit Bezug auf die Meridiane in diesen parallel und senkrecht Layout passen), sind diese nicht genau Quadrate. Dies ist vor allem dann deutlich, wenn die Abmessungen des Platzes sind groß.

Die Frage spricht von einer [perfekt] Kugel. Matters würde etwas anders sein, wenn wir die Erde erwogen (oder einem anderen Planeten) mit ihren abgeflachten Polen.

Im Anschluss ist ein „Algorithmus“, die die Rechnung passen würden, bezweifle ich es optimal ist, könnte aber eine gute Basis bieten. Bearbeiten : siehe Tom10 Vorschlag mit der Ebene 3D-Abstand zwischen den Punkten zu arbeiten, anstatt der entsprechenden großen cirle Abstand (dh, dass die Schnur eher als der Bogen), da dies der Komplexität der stark reduzieren Formeln.

Problem layout:  (A, B and Sq as defined in the OP's question)
 A  : a given point the the surface of the sphere
 Sq : a given "square" from the grid 
 B  : solution to problem : point located within Sq which has the shortest 
      distance to A.
 C  : point at the center of Sq

Tentative algorithm:
Using the formulas associated with [Great Circle][1], we can:
 - find the equation of the  circle that includes A and C
 - find the distance between A and C. See the [formula here][2] (kindly lifted
    from Tom10's reply).
 - find the intersect of the Great Circle arc between these points, with the
   arcs  of parallel or meridian defining the Sq.
   There should be only one such point, unless this finds a "corner" of Sq, 
   or -a rarer case- if the two points are on the same diameter (see 
   'antipodes' below).
Then comes the more algorithmic part of this procedure (so far formulas...):
 - find, by dichotomy, the point on Sq's arc/seqment which is the closest from
   point A.  We're at B! QED.

Optimization:  
 It is probably possible make a good "guess" as to the location
 of B, based on the relative position of A and C, hence cutting the number of
 iterations for the binary search.
 Also, if the distance A and C is past a certain threshold the intersection
 of the cicles' arcs is probably a good enough estimate of B.  Only when A
 and C are relatively close will B be found a bit further on the median or
 parallel arc in these cases, projection errors between A and C (or B) are
 smaller and it may be ok to work with orthogonal coordinates and their 
 simpler formulas.

Another approach is to calculate the distance between A and each of the 4 
corners of the square and to work the dichotomic search from two of these
points (not quite sure which; could be on the meridian or parallel...)

( * ) *Antipodes case*:  When points A and C happen to be diametrically 
opposite to one another, all great circle lines between A and C have the same
 length, that of 1/2 the circonference of the sphere, which is the maximum any
 two points on the surface of a sphere may be.  In this case, the point B will
 be the "square"'s corner that is the furthest from C. 

Ich hoffe, das hilft ...

Die lazy untere Schranke Methode ist, um den Abstand zu der Mitte des Platzes zu finden, dann den halben diagonalen Abstand subtrahiert und gebundenen die Dreiecksungleichung verwenden. Gegeben sind diese nicht reale Plätze, es wird tatsächlich zwei diagonale Strecken - wir werden die größer verwenden. Ich nehme an, dass es auch einigermaßen genau sein wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top