diff --git a/se3/blatt1.rkt b/se3/blatt1.rkt index eef884b..12276cb 100644 --- a/se3/blatt1.rkt +++ b/se3/blatt1.rkt @@ -35,31 +35,41 @@ Abgebende: Jim 2martens, 2noack, 0giebel ) ; 2.1 +; Helferfunktion, um dG in Bogenmaß zu errechnen +(define (calculateDG widthARad widthBRad distanceLengthRad) + ; ausrechnen von dG im Bogenmaß + (acos + ; ausrechnen von cos dG im Bogenmaß + (+ (* + (sin widthARad) + (sin widthBRad) + ) + (* (cos widthARad) + (cos widthBRad) + (cos distanceLengthRad) + ) + ) + ) + ) + +; Helferfunktion, um Differenz der Länge in Bogenmaß zu errechnen +(define (calculateDistanceLengthRad lengthA lengthB) + ; Differenz geographische Längen + (define distanceLength + (- lengthB lengthA) + ) + ; Differenz in Radiant umrechnen + (degreeToRadian distanceLength) + ) + ; breiteA laengeA breiteB laengeB alle in Grad angegeben ; westliche Länge und südliche Breite negativ angeben (define (distanzAB breiteA laengeA breiteB laengeB) ; Parameter in Radiant umrechnen (define breiteARad (degreeToRadian breiteA)) (define breiteBRad (degreeToRadian breiteB)) - ; Differenz geographische Längen - (define distanzLaenge - (- laengeB laengeA) - ) - ; Differenz in Radiant umrechnen - (define distanzLaengeRad (degreeToRadian distanzLaenge)) - (define cosDG - ; ausrechnen von cos dG im Bogenmaß - (+ (* - (sin breiteARad) - (sin breiteBRad) - ) - (* (cos breiteARad) - (cos breiteBRad) - (cos distanzLaengeRad) - ) - ) - ) - (define dG (acos cosDG)) + (define distanzLaengeRad (calculateDistanceLengthRad laengeA laengeB)) + (define dG (calculateDG breiteARad breiteBRad distanzLaengeRad)) ; umrechen in Kilometer (nmToKM ; ermitteln der Entfernung in Seemeilen @@ -70,10 +80,140 @@ Abgebende: Jim 2martens, 2noack, 0giebel ) ) -; ausrechnen der Entfernung von Oslo und Hongkong +; ausrechnen der Entfernung zwischen den angegebenen Städten (display "Entfernung Oslo - Hongkong (in km): ") (distanzAB 59.93 10.75 22.2 114.1) (display "Entfernung San Francisco - Honolulu (in km): ") (distanzAB 37.75 -122.45 21.32 -157.83) (display "Entfernung Osterinsel - Lima (in km): ") (distanzAB -27.1 -109.4 -12.1 -77.05) + +; 2.2 +; breiteA laengeA breiteB laengeB alle in Grad angegeben +; westliche Länge und südliche Breite negativ angeben +(define (kurswinkel breiteA laengeA breiteB laengeB) + ; benötigte Variablen bereitstellen + (define distanzLaengeRad (calculateDistanceLengthRad laengeA laengeB)) + (define breiteARad (degreeToRadian breiteA)) + (define breiteBRad (degreeToRadian breiteB)) + (define dG (calculateDG breiteARad breiteBRad distanzLaengeRad)) + ; cos alpha r errechnen + (define cosAlphaR (/ + (- (sin breiteBRad) + (* (cos dG) + (sin breiteARad) + ) + ) + (* (cos breiteARad) + (sin dG) + ) + ) + ) + ; alpha R bestimmen und in Grad umrechnen. + (define alphaR (acos cosAlphaR)) + (define alphaRGrad (radianToDegree alphaR)) + ; bestimmen, ob Kurs nach Osten geht + (define isEastboundA (if (> laengeB laengeA) true false)) + (define checkNecessary (> 0 + (* laengeA + laengeB) + ) + ) + ; überprüfen, ob offensichtliche Richtung tatsächlich kürzer ist + (define isEastbound (if checkNecessary + (if (> (- 360 + (+ (abs laengeB) + (abs laengeA) + ) + ) + (+ (abs laengeB) + (abs laengeA) + ) + ) + isEastboundA + (not isEastboundA) + ) + isEastboundA + ) + ) + ; abhängig von der Richtung den Kurswinkel bestimmen + (if isEastbound alphaRGrad (- 360 + alphaRGrad) + ) + ) + +; ausrechnen der Kurswinkel auf den angegebenen Routen +(display "Kurswinkel Oslo - Hongkong: ") +(kurswinkel 59.93 10.75 22.2 114.1) +(display "Kurswinkel San Francisco - Honolulu: ") +(kurswinkel 37.75 -122.45 21.32 -157.83) +(display "Kurswinkel Osterinsel - Lima: ") +(kurswinkel -27.1 -109.4 -12.1 -77.05) + +; 2.3 +; winkelGrad darf maximal eine Nachkommastelle haben und muss in Grad +; angegeben sein +(define (gradToHimmelsrichtung winkelGrad) + ; N=0,NNE=22.5,NE=45,ENE=67.5,E=90,ESE=112.5,SE=135,SSE=157.5,S=180 + ; SSW=202.5,SW=225,WSW=247.5,W=270,WNW=292.5,NW=315,NNW=337.5,N=360 + ; ein Kurswinkel ist also immer maximal 11.25 Grad von der nächsten fest + ; definierten Himmelsrichtung entfernt + (define winkelGradModuloReady (* 10 winkelGrad)) + (define abstand (/ (modulo winkelGradModuloReady 225) 10.0)) + (define aufrunden (>= abstand 11.25)) + (define richtungGrad1 (- winkelGrad abstand)) + (define richtungGrad (if aufrunden + (+ richtungGrad1 22.5) + richtungGrad1 + ) + ) + (case richtungGrad + [(0) "N"] + [(22.5) "NNE"] + [(45) "NE"] + [(67.5) "ENE"] + [(90) "E"] + [(112.5) "ESE"] + [(135) "SE"] + [(157.5) "SSE"] + [(180) "S"] + [(202.5) "SSW"] + [(225) "SW"] + [(247.5) "WSW"] + [(270) "W"] + [(292.5) "WNW"] + [(315) "NW"] + [(337.5) "NNW"] + [(360) "N"] + ) + ) + +; ausgeben der Himmelsrichtungen für die eben berechneten Kurswinkel +(display "Flugrichtung Oslo - Hongkong: ") +(gradToHimmelsrichtung 67.4) +(display "Flugrichtung San Francisco - Honolulu: ") +(gradToHimmelsrichtung 251.8) +(display "Flugrichtung Osterinsel - Lima: ") +(gradToHimmelsrichtung 70.0) + +; richtung muss als String in Form einer Himmelsrichtung gegeben werden +(define (himmelsrichtungToGrad richtung) + (case richtung + [("N") 0] + [("NNE") 22.5] + [("NE") 45] + [("ENE") 67.5] + [("E") 90] + [("ESE") 112.5] + [("SE") 135] + [("SSE") 157.5] + [("S") 180] + [("SSW") 202.5] + [("SW") 225] + [("WSW") 247.5] + [("W") 270] + [("WNW") 292.5] + [("NW") 315] + [("NNW") 337.5] + ) + ) \ No newline at end of file