-         

Ergebnis 1 bis 6 von 6

Thema: Problem mit dem ArcTan in Visual Basic

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    24.05.2007
    Ort
    Im hohen Norden
    Beiträge
    227

    Problem mit dem ArcTan in Visual Basic

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    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.
    #ifndef MfG
    #define MfG

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    24.05.2007
    Ort
    Im hohen Norden
    Beiträge
    227
    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

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von marvin42x
    Registriert seit
    02.08.2005
    Ort
    Berlin
    Alter
    68
    Beiträge
    703
    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ß
    Die ersten zehn Millionen Jahre waren die schlimmsten. Und die zweiten Zehn Millionen Jahre, die waren auch die schlimmsten.url

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Mal ne kurze Frage: "Pi" kennt er schon als Zahlenwert 3.14159...?
    #ifndef MfG
    #define MfG

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    24.05.2007
    Ort
    Im hohen Norden
    Beiträge
    227
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •