Aktuelle Zeit: 17.06.2019 02:47

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: [FRAGE] Winkel im voraus berechnen?
BeitragVerfasst: 16.12.2018 21:07 
Offline
Benutzeravatar

Registriert: 25.09.2016 01:42
Eventuell eine dumme Frage :oops:
Ist es möglich alle Winkel im voraus zu berechnen?

Bei -> sin oder cos(Winkel.f)
Wobei Winkel ja irgendwas sein kann 11.2938.. !?

Wie machen das die Spiele?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [FRAGE] Winkel im voraus berechnen?
BeitragVerfasst: 16.12.2018 21:15 
Offline
Benutzeravatar

Registriert: 23.07.2011 02:08
Naja, es gibt unendlich viele Winkel.
Du kannst aber einfach jeden ganzen Winkel berechnen, das sind dann immerhin 360. Oder jeden halben oder viertelten.
Dann guckst du einfach ob das ausreicht für deine Anwendung (wenn du z.B. ein Spiel programmierst, dann guck ob die Drehung bei 360 oder 720 Schritten flüssig aussieht).

Die Frage ist auch, wozu? Hast du 100e Objekte gleichzeitig auf dem Bildschirm, die alle mehrmals pro Sekunde eine Winkelberechnung benötigen?

Möglicherweise hast du Anfangs wenige und später mehrere Berechnungen, dann kannst du den Winkel berechnen und anschließend abspeichern. Wenn das nächste mal ein Winkel benötigt wird, greifst du auf dein Array zu, oder falls der Eintrag leer/nicht vorhanden ist, berechnest du ihn neu.

_________________
Signatur und so


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [FRAGE] Winkel im voraus berechnen?
BeitragVerfasst: 16.12.2018 21:38 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Man kann so eine Tabelle anlegen (z.B. in einem Array), allerdings gibt es dann ein paar Nachteile, die den Vorteil des schnellen Zugriffs wieder zu nichte machen:
Du wirst nicht alle Winkel abdecken können, somit brauchst du sowas wie Round() oder komplizierter, um den beliebigen Winkel in einen Vorberechneten umzuwandeln.
Du musst Mod() verwenden, damit auch Winkel >360 oder <0 in die richtige Range gebracht werden, außer das machst du schon vorher, wenn sich z.B. dein Objekt dreht.

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [FRAGE] Winkel im voraus berechnen?
BeitragVerfasst: 17.12.2018 11:48 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Wenn man ein Array in der Größe einer Zweierpotenz nutzt, kann man sich das Mod sparen und einfach mit ein bisschen Bit-Arithmetik arbeiten.
Code:
EnableExplicit

; Hier kann man die Präzision der Sinus-Tabelle einstellen
#SINE_PRECISION = 12

; Hier berechnen wir ein paar Werte vor, die wir benötigen
#_sineMax = 1 << #SINE_PRECISION
#_sineFac = #_sineMax / #PI / 2
#_sineMask = #_sineMax - 1
Global Dim _sineTable.f(#_sineMax - 1)

; Muss aufgerufen werden um die Sinus-Tabelle zu initialisieren
Procedure initSineTable()
   Protected i.i
   For i = 0 To #_sineMax - 1
      _sineTable(i) = Sin(i * 2 * #PI / #_sineMax)
   Next
EndProcedure

; Das ist nun unsere neue Sinus-Funktion, aber als Makro
Macro fastSin(a)
   _sineTable(Int(a * #_sineFac) & #_sineMask)
EndMacro

initSineTable()

; Hier berechnen wir die durchschnittliche Abweichung zwischen der
; Sinus-Tabelle und der originalen Sinus-Funktion
Define i.i, sumDiff.d
For i = -100 To 100
   sumDiff + Abs(Sin(i) - fastSin(i))
Next
Debug "Durchschnittliche Abweichung: " + StrD(sumDiff / 201.0, 20)

Man könnte sogar nur die Hälfte der kompletten Sinusperiode im Array speichern, aber dann würde das Makro wieder komplexer werden. Da müsste man mal ausprobieren, ob sich das lohnt. Solange die Sinus-Tabelle noch locker in den Cache passt, sollte sie aber noch schnell funktionieren. In meinem Beispiel nutze ich eine Präzision von 12, d.h. es werden 2^12 = 4096 Werte in der Tabelle gespeichert, mal 4 Bytes pro Float sind das dann 16 kB, die in heutige Caches locker passen sollten.

_________________
Freakscorner.de - Der Bastelkeller | Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 18.04.1 LTS x64, PureBasic 5.60 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [FRAGE] Winkel im voraus berechnen?
BeitragVerfasst: 17.12.2018 22:09 
Offline
Benutzeravatar

Registriert: 25.09.2016 01:42
Danke für die vielen Antworten :)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  
cron

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye