Strukturen und For-Schleifen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Strukturen und For-Schleifen

    Hey!

    Ich habe eine Frage zu Strukturen und For-Schleifen. Ich möchte ein TSP in Swift umsetzen und habe dafür eine Struktur für verschiedene Orte angelegt.

    Quellcode

    1. struct Ort {
    2. let name : String
    3. let nordKoordinate : Double
    4. let ostKoordinate : Double
    5. var distanz: Double
    Dazu ein paar Orte definiert

    Quellcode

    1. var J = Ort(name: "Jena", nordKoordinate: 50.927, ostKoordinate: 11.589, distanz: 0)
    2. var EF = Ort(name: "Erfurt", nordKoordinate: 50.978, ostKoordinate: 11.029, distanz: 0)
    3. var NDH = Ort(name: "Nordhausen", nordKoordinate: 51.500, ostKoordinate: 10.791, distanz: 0)
    4. var SHL = Ort(name: "Suhl", nordKoordinate: 50.860, ostKoordinate: 10.693, distanz: 0)

    Und wollte in einem ersten Schritt die Luftdistanz von allen Orten nach Jena berechnen. Per Hand funktioniert das auch:

    Quellcode

    1. nord = J.nordKoordinate - EF.nordKoordinate
    2. ost = J.ostKoordinate - EF.ostKoordinate
    3. EF.distanz = sqrt(nord*nord) + sqrt(ost*ost)
    4. nord = J.nordKoordinate - NDH.nordKoordinate
    5. ost = J.ostKoordinate - NDH.ostKoordinate
    6. NDH.distanz = sqrt(nord*nord) + sqrt(ost*ost)
    7. nord = J.nordKoordinate - SHL.nordKoordinate
    8. ost = J.ostKoordinate - SHL.ostKoordinate
    9. SHL.distanz = sqrt(nord*nord) + sqrt(ost*ost)
    10. print(EF.distanz)
    11. print(NDH.distanz)
    12. print(SHL.distanz)
    Alles anzeigen

    Das wollte ich jetzt in einer Schleife standardisieren und habe dafür folgende Zeilen geschrieben:

    Quellcode

    1. let Ziele = [EF, NDH, SHL]
    2. for ziel in Ziele {
    3. nord = J.nordKoordinate - ziel.nordKoordinate
    4. ost = J.ostKoordinate - ziel.ostKoordinate
    5. ziel.distanz = sqrt(nord*nord) + sqrt(ost*ost)
    6. print(ziel.distanz)

    Hier meint Swift aber in Zeile 6, dass ziel eine Konstante wäre und daher nicht veränderbar sei. Das .distanz ist aber als Variable in der Struktur definiert und lässt sich beim händischen Berechnen ja auch überschreiben. Wie schreibe ich das, dass ich aus die 15 Zeilen oben in eine Schleife packen kann? Danke im Voraus
  • Es ist korrekt, dass ziel als Konstante definiert ist.
    Das ist implizit durch das for so definiert.

    Du könntest lesen:

    for let ziel in Ziele {…}

    Eine Distanz an einem Ziel ist relativ sinnfrei, da eine Distanz einen Bezugspunkt braucht.
    Also quasi distanceTo(other: Ziel)

    Diese sollte dann einfach die Distanz zurückgeben. Wenn es allerdings eine Variable innerhalb der Struktur ändern soll, muss die Funktion als mutating definiert werden, denn im Prinzip sollten Strukturen read-only Datentypen sein. Verhindert so ziemlich alle Probleme beim Multi Threading.

    Im Übrigen könntest Du statt Eigenimplementierungen eine CLLocation benutzen. Die kann die Entfernung zu einer anderen Koordinate etwas genauer berechnen als Du.

    Die Einarbeitung in CoreLocation scheint mir für Dein Projekt insgesamt ein guter zeitsparender Einstieg.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Marco Feltmann ()

  • Wenn du die Entfernung zwischen zweit Orten auf der Erdoberfläche bestimmen willst, ist deine Mathematik dahinter völlig falsch.
    CoreLocation bietet dir da entsprechende Methoden an.
    Falls du es aber selber berechnen willst oder musst, geht das prinzipiell so:


    Quellcode

    1. let cl0 = ... // CLLocation Startpunkt
    2. let cl1 = ... // CLLocation Zielpunkt
    3. let l0 = cl0.coordinate.longitude * Double.pi / 180.0
    4. let l1 = cl1.coordinate.longitude * Double.pi / 180.0
    5. let b0 = cl0.coordinate.latitude * Double.pi / 180.0
    6. let b1 = cl1.coordinate.latitude * Double.pi / 180.0
    7. var x = (sin(b0) * sin(b1)) + (cos(b0) * cos(b1) * cos(l1-l0))
    8. x = acos(x) * 111.2 * 180.0 / Double.pi
    Also erst wird der Winkel zwischen beiden Orten vom Erdmittelpunkt aus berechnet, dann wird aus diesem Winkel die Entfernung auf der Erdoberfläche in km bestimmt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Tolibi ()