Sinus auch mir Grad-Winkeln?
Sinus auch mir Grad-Winkeln?
Kann man für Sinus berechnungen mit 'Sin()' auch einstellen das man Grad-Winkel berechnet?? oda wenn nein, wie rechnet man das um...
Zuletzt geändert von Swappy am 28.12.2004 22:30, insgesamt 1-mal geändert.
Wer anderen eine Grube gräbt, hat Gold im Mund.
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:
Ebenso kannst du das für die beiden anderen Winkelfunktionen sowie deren Umkehrfunktionen umschreiben.
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- NicTheQuick
- Ein Admin
- Beiträge: 8812
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Von mir auch danke
! Die Frage wollt ich auch grad stellen.
mfg, Max
Computerkunde: "Ich suche noch ein spanndendes Grafik-Adventure, das mich so richtig fordert"
Verkäufer: "Haben Sie es schon mal mit WINDOWS 95 probiert ?"
http://bratwurst-24.de.ki
Computerkunde: "Ich suche noch ein spanndendes Grafik-Adventure, das mich so richtig fordert"
Verkäufer: "Haben Sie es schon mal mit WINDOWS 95 probiert ?"
http://bratwurst-24.de.ki
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
wenn es
a) performance-kritisch ist und
b) nur ganze grad benötigt werden,
empfehle ich folgende vorgehensweise:
- 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.:geht ohne IF und ohne fehler.
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)
Nextam 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)...
NextDer Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
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:
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
?
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
Code: Alles auswählen
for winkel = -800 to 800
debug winkel % 360
next
- NicTheQuick
- Ein Admin
- Beiträge: 8812
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
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:Die Anwendung ist ja hoffentlich klar.
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