mirror of https://github.com/2martens/uni.git
219 lines
6.2 KiB
Racket
219 lines
6.2 KiB
Racket
#lang racket
|
|
|
|
#|
|
|
SE 3 Funktional Blatt 1
|
|
Abgebende: Jim 2martens, Britta 2noack, Jan-Simon 0giesel
|
|
|#
|
|
|
|
; 1.1
|
|
; degrees ist eine positive Zahl in Grad
|
|
(define (degreeToRadian degrees)
|
|
(/ (* degrees pi) 180)
|
|
)
|
|
; radians ist eine Zahl in Bogenmaß
|
|
(define (radianToDegree radians)
|
|
(/ (* radians 180) pi)
|
|
)
|
|
|
|
; 1.2
|
|
(define (my-acos cosinus)
|
|
; berechnen von alpha
|
|
(atan
|
|
; berechnen des tangens
|
|
(/
|
|
; berechnen des Sinus
|
|
(sqrt (- 1 (sqr cosinus)))
|
|
cosinus
|
|
)
|
|
)
|
|
)
|
|
|
|
; 1.3
|
|
; nauticMiles ist eine positive Zahl in nautischen Meilen
|
|
(define (nmToKM nauticMiles)
|
|
(* nauticMiles 1.852)
|
|
)
|
|
|
|
; 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))
|
|
(define distanzLaengeRad (calculateDistanceLengthRad laengeA laengeB))
|
|
(define dG (calculateDG breiteARad breiteBRad distanzLaengeRad))
|
|
; umrechen in Kilometer
|
|
(nmToKM
|
|
; ermitteln der Entfernung in Seemeilen
|
|
(* 60
|
|
; umwandeln in Grad
|
|
(radianToDegree dG)
|
|
)
|
|
)
|
|
)
|
|
|
|
; 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]
|
|
)
|
|
) |