Sinus auch mir Grad-Winkeln?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Swappy
Beiträge: 51
Registriert: 09.12.2004 22:56
Wohnort: Hamburg
Kontaktdaten:

Sinus auch mir Grad-Winkeln?

Beitrag 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...
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.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag 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.
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag 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)
Benutzeravatar
Swappy
Beiträge: 51
Registriert: 09.12.2004 22:56
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Swappy »

Ey cool danke! das funktioniert jetzt danke an euch beide!

cu

Swappy
Wer anderen eine Grube gräbt, hat Gold im Mund.
Benutzeravatar
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

Beitrag 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.
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag von Lebostein »

:mrgreen:
Benutzeravatar
M@xx
Beiträge: 57
Registriert: 07.10.2004 11:30
Wohnort: Kiel
Kontaktdaten:

Beitrag von M@xx »

Von mir auch danke :D! 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag 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

Code: Alles auswählen

for winkel = -800 to 800
debug winkel % 360
next
So, nun sollte alles zum Thema Winkel gesagt sein. Ab in die FAQ damit. Oder hat noch jemand ein paar Winkeltipps :D ?
Benutzeravatar
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

Beitrag von NicTheQuick »

Das mit dem negativen Modulo kann man hier für die Winkel aber vergessen.

Denn -1° entspricht 359° und nicht etwa 1°. :wink:

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.
Antworten