• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

gehe zum Ziel beim kreuzen zweier Linien...

Harry1999

Geocacher
Hi,

kann man im Solver eventuell so etwas lösen:
Vom Punkt A in Richtung Punkt B eine Linie bilden.
Vom Punkt C in Richtung Punkt D eine Linie bilden.
Gehe zum sich ergebenden Kreuz-Punkt, wenn die Linien sich schneiden...
Habs jetzt auf dem (im Handy) winzigen Display grafisch gelöst... ist jedoch äusserst ungenau, wie man sich denken kann.
Grüße, Harry1999
 

MiK

Geoguru
Das ist leider noch nicht direkt möglich. Steht aber irgendwo auf meiner Liste, bzw. ich habe es auch schon mal an skg weitergeleitet. Ich weiß nur nicht, wie aufwendig die Berechnung wird. Ich glaube noch sind in CW dafür keine Routinen vorhanden.
 

Engywuck

Geowizard
Das geht schon. Man muss nur etwas Geometrie benutzen. Die Funktionen sin und bearing werden dabei eine Rolle spielen.

Gruß,
E.
 

MiK

Geoguru
Redest Du jetzt von einer Approximation in der Ebene oder von einer Berechnung auf der Kugeloberfläche?
 

klausundelke

Geowizard
@MiK:
wie E. schon schreibt... mit den Funktionen bearing und distance sowie den Winkelfunktionen (Sinussatz) läßt sich das doch (relativ) leicht berechnen!

Ob die Funktionen jetzt in der Ebene gelten oder auf der Kugelfläche :???: :???: :???:
 

MiK

Geoguru
Engywuck schrieb:
In der Größenordnung, in der Caches sich bewegen, ist die Erde eine Ebene.
Klar kann man das als Workaround so machen. Eine eingebaute Solverfunktion sollte dann aber schon exakt arbeiten. Es gibt nämlich durchaus auch Caches, bei denen das großflächiger angewendet wird.
 

Engywuck

Geowizard
Da würde ich keine Solver-Funktion zu basteln. Was für Solver-Funktionen sollen denn sonst noch rein? Welche, die automatisch Inkreise von Dreiecken oder Regressionsgraden berechnen?
Für so exotische Fragestellungen sollten die Basisfunktionen reichen.

Gruß,
E.
 

MiK

Geoguru
Man muss nicht jede mathematische Spielerei einbauen. Aber eben Funktionen, die direkt etwas mit dem Cachen zu tun haben. Und eine solche Kreuzpeilung kommt schon öfter mal vor. Auch die Schnittpunkte von zwei Kreisen würde ich noch dazu zählen. Wenn wir imperialistische Berechnungsfunktionen einbauen, dann sollte sowas erstrecht rein.
 

Engywuck

Geowizard
Wir sollten vielleicht fehlende Solver-Funktionen mal sammeln. Ich wüsste noch mindestens eine, die ich bislang schmerzlich vermisst habe. Du hattest auch mal erwähnt, dass Du ein paar Funktionen noch wüsstest. Vermutlich haben andere User auch noch weiteren Input. Dann kann man mal sammeln und priorisieren und ganz ablehnen ;-)

Gruß, E.
 

MiK

Geoguru
Als ich das zuletzt erwähnt habe, hat mich SKG nochmal explizit danach gefragt und ich hab sie ihm genannt. Weiß nicht, was daraus geworden ist.
 
OP
H

Harry1999

Geocacher
Kann mir einer die Rechnung zeigen, wie ich im Solver mit Bearing und Distance das machen könnte?
 

Engywuck

Geowizard
Gehört das Finden der Lösung nicht zum Cache dazu? Sonst könntest Du ja auch einige Mysteries hier posten, und wir mailen Dir dann nur noch die Finalkoordinaten zu ;-)

Gruß,
E.
 

MiK

Geoguru
Mopsoso kann z.B. Kreuzpeilung. Aber irgendwie kamen mir die Ergebnisse bei einem Versuch komisch vor.
 

t31

Geowizard
Harry1999 schrieb:
Kann mir einer die Rechnung zeigen, wie ich im Solver mit Bearing und Distance das machen könnte?
Das funktioniert nicht direkt und damit muß man schon eine spezielle Funktion bauen.
Man kann sich höchstens in kleinen Schritten dem Kreuzungspunkt annähern, das dürfe manuell per Hand eher lästig sein und würde CW so rechnen, ist es sicher auch nicht hochperformant.

Hier nochmal ein Algorithmus mit dem ich das in Excel mache, er ist dem vom Morpos angelehnt, Einsprung ist bei test()
Code:
Public Const r = 6371000.8
Public Const pi = 3.14159265358979
Public Const rad = 57.2957795130823
Public Function WGS84toXYZ(Lon, Lat) As Variant
Dim arr(2)
    'Lon = Lon + 180
    'Lat = Lat + 90
    arr(0) = -r * Cos(Lat / rad) * Cos(Lon / rad)
    arr(1) = -r * Cos(Lat / rad) * Sin(Lon / rad)
    arr(2) = r * Sin(Lat / rad)
    WGS84toXYZ = arr
End Function
Public Function XYZtoWGS84(x, y, z) As Variant
    Dim arr(1)
    arr(0) = rad * IIf(x, Atn(y / x) - (x > 0) * pi, pi / 2 + (y > 0) * pi) - 180
    arr(1) = (rad * WorksheetFunction.Acos(z / r) - 90)
    XYZtoWGS84 = arr
End Function
Sub test()
LA = kor("N 51° 20.436 E 12° 21.984")
LB = kor("N 51° 20.230 E 12° 22.905")
LC = kor("N 51° 21.454 E 12° 23.676")
LD = kor("N 51° 19.971 E 12° 21.902")
    a = WGS84toXYZ(LA(1), LA(0))
    b = WGS84toXYZ(LB(1), LB(0))
    C = WGS84toXYZ(LC(1), LC(0))
    D = WGS84toXYZ(LD(1), LD(0))
    e1 = a(1) * b(2) - a(2) * b(1)
    e2 = a(2) * b(0) - a(0) * b(2)
    e3 = a(0) * b(1) - a(1) * b(0)
    f1 = e1 * C(0) + e2 * C(1) + e3 * C(2)
    f2 = e1 * D(0) + e2 * D(1) + e3 * D(2)
    N = -(f2 / f1)
    g1 = N * C(0) + D(0)
    g2 = N * C(1) + D(1)
    g3 = N * C(2) + D(2)
    N = Sqr(g1 * g1 + g2 * g2 + g3 * g3)
    P1 = r * g1 / N
    P2 = r * g2 / N
    P3 = r * g3 / N
    P = XYZtoWGS84(P1, P2, P3)
    Q = XYZtoWGS84(-P1, -P2, -P3)
    Debug.Print "P - Lon: " & P(0) & " Lat: " & P(1)
    Debug.Print "Q - Lon: " & Q(0) & " Lat: " & Q(1)
End Sub
Public Function kor(strg)
Dim arr(1), teil() As String
teil = Split(strg, " ")
arr(0) = IIf(teil(0) = "N", 1, -1) * CDbl(Replace(teil(1), "°", "")) + CDbl(Replace(teil(2), ".", ",")) / 60
arr(1) = IIf(teil(3) = "E", 1, -1) * CDbl(Replace(teil(4), "°", "")) + CDbl(Replace(teil(5), ".", ",")) / 60
kor = arr
End Function
Hier wir genaugenommen die zwei Kreuzungspunkte zweier Orthodrome berechnet, einer ist die Lösung des Problem, der anderen liegt halt auf der anderen Seite Erde. :)

Der Algo ist übrigens von KoenigDickBauch
 

Robin888

Geomaster
Harry1999 schrieb:
kann man im Solver eventuell so etwas lösen:
Vom Punkt A in Richtung Punkt B eine Linie bilden.
Vom Punkt C in Richtung Punkt D eine Linie bilden.
Gehe zum sich ergebenden Kreuz-Punkt, wenn die Linien sich schneiden.
Halbautomatisch, ja.

Dazu sollte man einmal die Entfernung von A und B sowie den Winkel wissen, unter dem man von C nach D kommt:
Code:
dist(A,B)
bzw.
bear(C,D)
Dann untersucht man die Punkte zwischen A und B, ob sie auf dem Großkreis C,D liegen.

Am kompaktesten geht das indem man systematisch Werte 0<x<1 in folgenden Code einsetzt und versucht die Ausgabe nah an Null zu bekommen.
Code:
x=
d=x*dist(A,B)
bear(C,proj(A,bear(A,B),d))-bear(C,D)
Der gesuchte Punkt ist dann:
Code:
proj(A,bear(A,B),d)
Am effizient sollte dabei Intervallhalbierung sein. Also zum Beispiel:
x_1=0,5
x_2=0,25 (oder 0,75)
x_3=0,125
...
je nachdem, ob man nach oben oder unten korrigieren muss.
Damit hätte man eine Strecke von einem Kilometer in zehn Schritten auf einen Meter eingegrenzt. :) Das sollte man auch unterwegs noch hinbekommen.
Schneller geht's zu Beginn wahrscheinlich mit Augenmaß und Schätzung ob man mit 0,2 oder mit 0,8 anfangen sollte.

Und wer's nicht so mit Dezimalbrüchen hat kann ja x auch als Bruch angeben:
x_1=(512)/1024
x_2=(512±256)/1024
x_3=(512±256±128)/1024
x_4=(512±256±128±64/1024
usw.

Ich hoffe ich konnte das Prinzip klarmachen. 0:)

P.S.: Schnitt von Kreisen fände ich auch nicht verkehrt. Aber es ist natürlich eine berechtigte Frage, welche Funktionen man einbaut und welche nicht. Fast alles lässt sich durch Näherungen obiger Art lösen.
(Schnitt zweier Kreise z.B. durch Projektion mit vorgegebenem Abstand zu Punkt A und laufendem Kurswinkel, bis der Abstand zum Punkt B stimmt.)

Robin(888)
 

Engywuck

Geowizard
Man kanns auch berechnen:

Gegeben sei eine Linie von A nach B und eine von C nach D, die sich schneiden. Der Kreuzungspunkt sei P. Per bearing findet man den Winkel alpha zwischen AC und AB. Die Senkrechte auf AC, die P schneidet, sei H (also H ist eine Strecke, kein Punkt). Die Strecke zwischen Kreuzungspunkt P und Punkt A sei X (also auch dies wieder eine Strecke). Damit ist sin(alpha) = H/X. Aufgelöst nach X: X=H/sin(alpha). Damit hast Du die Länge X und musst nur noch von A aus genau diese Länge in Richtung B gehen - zu berechnen mit bearing und project.

Wenn Du es damit nicht nachvollziehen kannst, ist das Thema einfach nix für Dich :)

Gruß, E.
 

Engywuck

Geowizard
Ach ja, natürlich. Der Teil fehlte noch. Dies wird mit dem Sinussatz ermittelt. Wie es genau geht, muss ich noch gucken, das fehlt grad noch in meiner Konstruktion ;-)

Gruß, E.

Edit: Konzept grad überlegt.
Das, was ich für die eine Seite gemacht habe (Winkel zwischen AB und AC) geht symmetrisch auch auf der anderen Seite (Winkel zwischen AC und CD). Damit bekommst Du zwei Ausdrücke für H, die Du gleichsetzen kannst.
Die beiden dann auftauchenden Unbekannten X und X' (=Längen zwischen P und C) sollte man dann zusammen mit dem Sinussatz berechnen können.
Eventuell muss man auch noch den guten alten Phytagoras zu Rate ziehen, um die Variablen auflösen zu können. Habe jetzt keine Zeit, um das genauer aufzudröseln, aber etwas elementare Geometrie reicht hier.
 

d0wnl0rd

Geocacher
So habe ich das mal bei einer Cachereihe hier in der Gegend gelöst:
Kreuzpeilung 1, Kreuzpeilung 2 und Habt ihr die Peilung?.
An den zwei Tradis fand man die Richtungsangaben, gesucht war dann der Schnittpunkt von diesen Geraden.

Code:
cls()
s2="N 49° 13.110 E 011° 23.020"
s1="N 49° 11.878 E 011° 25.354"
c = distance(s1, s2)
alpha2 = bearing(s1, s2)
alpha1 = 225 # Bewusst falsche Angabe, ich will ja nicht spoilern....
alpha=alpha1-alpha2
delta=360-alpha2
beta1 = 56 #  # Bewusst falsche Angabe, ich will ja nicht spoilern....
# 
beta=180-beta1-delta
"Alpha1=" alpha1:0.0:
"Alpha2=" alpha2:0.0:
"Alpha=" alpha:0.0:

"Beta1=" beta1:0.0:

"Beta=" beta:0.0:
gamma = 180 - alpha - beta

a = c * sin(alpha) / sin(gamma) # Gegenwinkel
b = c * sin(beta) / sin(gamma) # Gegenwinkel
# Gesucht ist der Schnittpunkt s3
s3 = project(s2, beta1, a)
"Schnittpunkt: " s3
# Gesucht ist der Schnittpunkt s3, Sicherheitshalber nochmals von der anderen Seite probieren
s4 = project(s1, alpha1, b)
"Alternativ: " s4
"Abstand zwischen den Punkten: " distance(s3, s4):0.0:
 
Oben