PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit dem ArcTan in Visual Basic



holzi
17.09.2008, 11:50
Moin moin,
ich möchte vorgegebene X/Y-Werte in die dazugehörigen Latitude und Longitude umwandeln.
Ich benutze folgende Formeln:

Y = Erdradius * cos(Pi * Latitude/180)
X = Erdradius * sin(Pi*Latitude/189) * cos(Pi*Longitude/180)

Diese beiden Gleichungen habe ich umgestellt:

Latitude= (180/Pi) * ArcCos(Y/Erdradius)

Longitude = (180/Pi) * ArcCos(x/(Erdradius*sin((Pi/180)*Latitude))

Nun gibt es in VisualBasic den ArcCos nicht. Dieser wird mit dem ArcTan wie folgt definiert:
ArcCos(x) = Atn(-x/Sqr(-x*x+1))+2*Atn(1) bzw.
ArcCos(y) = Atn(-y/Sqr(-y*y+1))+2*Atn(1)

Für den ArcCos setze ich nun diese Definition ein und starte das Programm. Nun bekomme ich aber immer einen Laufzeitfehler 5 Ungültiger Prozeduraufruf oder ungültiges Argument.
Kennt hier jemand das Problem und kann mir einen Tip geben.

Peter

Jaecko
17.09.2008, 13:43
Wird bei dem Fehler ne bestimmte Zeile angemeckert?
Was mir hier auffällt: Sqr(-x*x+1). Da "normalerweise" eine Wurzel nur aus ner positiven Zahl gezogen werden kann, könnte evtl hier der Fehler liegen, wenn (x*x) > 1 ist. Mit dem - davor überwiegt dann der negative Teil.

holzi
17.09.2008, 14:43
Nein, das ist es leider nicht. Das war das erste, was ich kontrolliert habe. Hier einmal die kompletten Zeilen des Programms. Wobei LatitudePosUpdate und LongitudePosUpdate als Double deklariert sind. UpLatitude und UpLongitude sind nur Textfelder zur Ausgabe der Werte. XZwischen ist auch als Double definiert und dient nur für eine Zwischenrechnung, damit die Zeile der Berechnung LongitudePosUpdate nicht noch länger wird.

LatitudePosUpdate = (180 / Pi) * Math.Atn((-YpUpdate / Radius) / Sqr((-YpUpdate / Radius) * (YpUpdate / Radius) + 1)) + 2 * Math.Atn(1)
UpLatitude = LatitudePosUpdate
XZwischen = XpUpdate / (Radius * Sin((Pi / 180) * LatitudePosUpdate))
LongitudePosUpdate = 180 / Pi * Atn(-XZwischen / Sqr(-XZwischen * XZwischen + 1)) + 2 * Atn(1)
UpLongitude = LongitudePosUpdate

Schon die aller erste Zeile wird mit dieser Fehlermeldung angemeckert.

Peter

marvin42x
17.09.2008, 15:14
An diesem Punkt würde ich versuchsweise die Zeile etwas entzerren.
Alle Schritte als einzelne Zeile untereinander und dann sagt er dir schon eher was ihm nicht gefällt.
Das mit den hoch komplexen Zeilen hat so seine Vor- und Nachteile.
Des Interesses halber: Welches VB benutzt Du?

Netter Gruß

Jaecko
17.09.2008, 15:22
Mal ne kurze Frage: "Pi" kennt er schon als Zahlenwert 3.14159...?

holzi
17.09.2008, 17:58
Erst einmal ein Danke schön. Ich habe es gelöst. Die Formel habe ich aus einander gefrimelt, so wie es mir Marvin42X empfohlen hat. Siehe da, der Absturz kommt doch tatsächlich in der Wurzel. Solange die Variable YpUpdate negativ ist, soll die Wurzel aus einer negativen Zahl gezogen werden, was natürlich nicht ist. Durch das Negativzeichen am Anfang der Wurzel passiert das.
Sqr((-YpUpdate / Radius) * (YpUpdate / Radius) + 1))

- * - = + und dann noch die 1 addieren, ergibt dann einen negativen Wert. Erst wenn YpUpdate positiv ist, ist alles OK. Somit habe ich das wie folgt geändert:

If YpUpdate >= 0 Then
Wurzel = Sqr(-(YpUpdate / Radius) ^ 2 + 1)
ArcusTangensLatitudePosUpdate = Math.Atn((-YpUpdate / Radius) / Wurzel) + 2 * Math.Atn(1)
LatitudePosUpdate = (180 / Pi) * ArcusTangensLatitudePosUpdate
UpLatitude = LatitudePosUpdate
End If

Ich bin happy. danke
Ich benutze Visual Basic 6. Ich habe damit angefangen. Würde ich noch einmal anfangen, würde ich gleich VB 2005 oder sogar Visual C nehmen. Das Projekt hat nun aber eine Größenordnung angenommen, dass ich momentan keine Lust habe, das alles auf VB 2005 zu konvertieren. Hätte ich ganz am Anfang besser machen können. Geht aber auch so.
Mein Pi habe ich in der main natürlich entsprechend deklariert.
Pi = 3.14159265358979
Könnte ich auch mit dem Tangens innerhalb des Programms berechnen.

mfg Peter