Seite 1 von 2
Sinus auch mir Grad-Winkeln?
Verfasst: 26.12.2004 17:08
von Swappy
Kann man für Sinus berechnungen mit 'Sin()' auch einstellen das man Grad-Winkel berechnet?? oda wenn nein, wie rechnet man das um...
Verfasst: 26.12.2004 17:21
von Ynnus
Mit folgender Formel kann man Gradangaben in Bogenmaß umrechnen:
Bogenmaß = PI * Winkel / 180
Folglich kann man sich selbst eine Prozedur schreiben welche den Sinuswinkel zurückgibt und als Parameter eine Gradangabe erfordert:
Code: Alles auswählen
Procedure sin_grad(winkel)
ProcedureReturn Sin(3.1415 * winkel / 180)
EndProcedure
Ebenso kannst du das für die beiden anderen Winkelfunktionen sowie deren Umkehrfunktionen umschreiben.
Verfasst: 27.12.2004 11:43
von Lebostein
Ich mach mir immer einfach ne Konstante (180 / PI = 57.29578)
#degree = 57.29578
und dann einfach immer die Winkel durch diese Zahl teilen:
test.f = cos(56 / #degree)
Verfasst: 28.12.2004 22:10
von Swappy
Ey cool danke! das funktioniert jetzt danke an euch beide!
cu
Swappy
Verfasst: 31.12.2004 14:39
von NicTheQuick
Aber immer dran denken, dass Dividieren mehr Rechenschritte verbraucht als Multiplizieren. Also besser mal 0.017453 anstatt durch 57.295780.
Aber das sind auch wieder nur Kleinigkeiten.
Verfasst: 31.12.2004 15:49
von Lebostein
Verfasst: 01.01.2005 17:23
von M@xx
Von mir auch danke

! Die Frage wollt ich auch grad stellen.
Verfasst: 04.01.2005 22:07
von Kaeru Gaman
wenn es
a) performance-kritisch ist und
b) nur
ganze grad benötigt werden,
empfehle ich folgende vorgehensweise:
Code: Alles auswählen
Dim Sinus.f(720)
Dim Cosin.f(720)
For n.f = 0 To 359
Sinus(n) = Sin(n/57.29578)
Cosin(n) = Cos(n/57.29578)
Sinus(n+360) = Sin(n/57.29578)
Cosin(n+360) = Cos(n/57.29578)
Next
- die abfrage eines arrays ist x-mal schneller, als ein aufruf von Sin() verbunden mit der berechnung,
am ende noch in einer eigenen proc also noch ein aufruf mehr.
- der vollkreis kommt 2x im array vor, damit spart man innerhalb einer drehungsschleife die abfrage ">360"
d.h.:
Code: Alles auswählen
For Winkel = 0 to 359
...Sinus(Startwinkel+Winkel)...
Next
geht ohne IF und ohne fehler.
Verfasst: 06.01.2005 10:21
von Lebostein
Schon mal was von dem sogenannten MODULO-OPERATOR (in PB = %) gehört? Er gibt den Rest einer Division zweier ganzzahliger Zahlen zurück und ist in diesem Zusammenhang sehr nützlich. Wenn man einen beliebigen ganzzahligen(!) Winkel MOD 360 nimmt, dann erhält man immer den entsprechenden Winkel auf der Skala von 0 bis 359. Hier in paar Beispiele:
Code: Alles auswählen
debug 0 % 360
debug 50 % 360
debug 359 % 360
debug 360 % 360
debug 365 % 360
debug 719 % 360
debug 720 % 360
debug 721 % 360
Funktioniert natürlich auch mit negativen Zahlen
So, nun sollte alles zum Thema Winkel gesagt sein. Ab in die FAQ damit. Oder hat noch jemand ein paar Winkeltipps

?
Verfasst: 06.01.2005 15:16
von NicTheQuick
Das mit dem negativen Modulo kann man hier für die Winkel aber vergessen.
Denn -1° entspricht 359° und nicht etwa 1°.
Ein Modulo für Fließkommazahlen oder speziell für Winkel würde dann etwa so aussehen:
Code: Alles auswählen
Procedure.f ModuloF(a.f, b.f)
If b < 0 : b = -b : EndIf
If a > 0
ProcedureReturn a - Int(a / b) * b
Else
ProcedureReturn b + a - Int(a / b) * b
EndIf
EndProcedure
Procedure.f Mod_Angle(w.f)
If w >= 360
ProcedureReturn w - Int(w / 360) * 360
ElseIf w < 0
ProcedureReturn 360 + w - Int(w / 360) * b
Else
ProcedureReturn w
EndIf
EndProcedure
Die Anwendung ist ja hoffentlich klar.