Redundanzen in den Ergebniswerten von sin() und cos()
Übersicht BlitzBasic Beginners-Corner
FlushBetreff: Redundanzen in den Ergebniswerten von sin() und cos() |
Mo, März 26, 2018 14:33 Antworten mit Zitat |
|
---|---|---|
Hallo zusammen ,
Ich hab einen Teil eines kleinen AutoIt Tutorials in Blitz3D umgesetzt, wenn es fertig ist könnte man es vllt. als Tutorial für Anfänger nutzen: Sin & Cos/ Bewegung und ihre Mathematik. Es funktioniert eigentlich genau wie es soll, zwei kreisförmige Flächen drehen sich umeinander auf einer Kreisbahn durch Phasenverschiebung. Was mich stört ist die Tatsache, dass die Bewegung gelegentlich ruckelt, langsamer wird und dann wieder scheller. Ich denke dass es an den Sinuswerten liegt. Bis zur Stelle 81 ist die Sache O.K. es werden nur Sprünge von 1 bis 2 Pixel gemacht, doch dann beginnen Wiederholungen in den Sinus- bzw. Cosinuswerten. Die Stelle 93, 95, 96 werden jeweils zweimal, die Stellen 97 und 98 dreimal, die Stelle 99 viermal und die Stelle 100 sogar elfmal wiederholt. Auf dem absteigenden Ast sieht es natürlich genauso aus, Stelle 99 viermal etc.. D.h. dass die Bewegung an den Wiederholungen festsitzt und so die Ruckler entstehen. Hier liegt der Hund begraben! Dass es sich um ein Rundungsproblem handelt ist klar aber wie kann mans lösen? Habt Ihr eine Ahnung wie ich die die Redundanzen bei den Werten vermeiden oder irgendwie glätten kann und somit die Animation smoother läuft? Ich habe am Ende noch ein kleines Hilfsprogramm angehängt das Sinuswerte in eine Textdatei schreibt, so kann man besser testen! Hier der Source des Hauptprogramms: BlitzBasic: [AUSKLAPPEN]
Hier der Source des Hifsprogramms: BlitzBasic: [AUSKLAPPEN]
Viele Grüße und danke für Eure Hilfe vorab, Flush |
||
Flush |
Mo, März 26, 2018 18:50 Antworten mit Zitat |
|
---|---|---|
Hi,
ist die Frage doof, zu viel Code oder hab ich falsch gepostet ? Die einzige Möglichkeit die mir einfällt das Sinus/ Cosinus Problem zu lösen ist die, die Werte von Hand anzupassen?! Nicht gerade elegant aber wie gesagt die einzige Möglichkeit die mir auch nach langem googeln, herumrechnen und ausprobieren einfällt ! Was meint Ihr? Viele Grüße, Flusher |
||
Lobby |
Mo, März 26, 2018 20:14 Antworten mit Zitat |
|
---|---|---|
Kannst du vielleicht mal die Ausgabe deines Testprogramms hochladen? Ist dort das Problem denn schon vorhanden?
Und generell, gibt es einen bestimmten Grund, Sinus und Cosinus vor zu berechnen? Der Laufzeitunterschied sollte den Mehraufwand bei der Programmierung nicht rechtfertigen können (Paradigma beim Optimieren: optimiere nur dort, wo es sich auch lohnt). |
||
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux |
Flush |
Mo, März 26, 2018 20:30 Antworten mit Zitat |
|
---|---|---|
@Lobby
Ich berechne vor weil LookUp Tables immer schneller als Berechnungen in Realtime sind. Aber Du hast mit der Optimiererei schin recht! Ausgabe Sinus: BlitzBasic: [AUSKLAPPEN]
Ausgabe Cosinus: BlitzBasic: [AUSKLAPPEN]
Viele Grüße und vielen Dank für die Hilfe vorab, Flush |
||
XeresModerator |
Mo, März 26, 2018 20:43 Antworten mit Zitat |
|
---|---|---|
Also, das Grundproblem liegt da:
BlitzBasic: [AUSKLAPPEN] Field arrBlau%[360] Du definierst deine Werte als Ganzzahlen. Das kann niemals Flüssig aussehen. Benutze Floats, dann gibt es wenigstens die Change, dass es besser aussehen kann. Generelle Hinweise: BlitzBasic: [AUSKLAPPEN] ;361 Stellen
Das ist die Definition eines schlechten Kommentars: da steht genau das, was man auch im Code ablesen kann. Wenn man Kommentare schreibt, dann um zu erklären, warum das so ist. Plus: Warum denn 361? Winkel gehen von 0 bis 359. Das sieht komisch aus: BlitzBasic: [AUSKLAPPEN] For iAngle = 0 To 360; Step 3 Warum gibt es zwei Schleifen in der CalcSine Funktion? Warum benutzt du dann die Variablen j und k? Du machst dir richtig Mühe um Werte vor zu berechnen und machst das dann halb so effizient wie möglich. Warum sind Sinus und Cosinus in zwei unterschiedliche Types aufgeteilt? Wenn du zwei Programme hast - warum importieren die nicht die Types & Funktionen aus einer gemeinsamen Datei? |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Flush |
Mo, März 26, 2018 21:12 Antworten mit Zitat |
|
---|---|---|
Hi Xeres,
1.) ich habe aus Integern % Floats # gemacht, das Problem besteht immer noch da jetzt 100.0 statt 100 im Array steht also das gleiche. 2.) Stimmt der Kommentar ist verunglückt. 3.) Warum siht das komisch aus? Ist einfach nur eine Endlosschleife einer Animation. BlitzBasic: [AUSKLAPPEN]
3.) Ich hab herumexperimentiert deshalb die Designmängel, die werden noch behoben! Die schleifen haben keinen Einfluss auf die Geschwindigkeit der Animation da Sie nur zur Vorberechnung der LUT's dienen. Wird wie gesagt noch behoben! Viele Grüße und vielen Dank für die Hilfe vorab, Flush |
||
Lobby |
Mo, März 26, 2018 23:50 Antworten mit Zitat |
|
---|---|---|
Ich weiß nicht was du für ein Programm schreibst, aber ich habe Zweifel, dass du durch das Vorberechnen von cos und sin einen relevanten Performancevorteil erreichen kannst.
1) Hier hat sinus nach wie vor den Typ int denke ich: BlitzBasic: [AUSKLAPPEN] sinus = Sin(j + phasenverschiebung)*100 Also entweder direkt dem Array zuweisen oder sinus als float deklarieren. |
||
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux |
HolzchopfMeisterpacker |
Di, März 27, 2018 9:23 Antworten mit Zitat |
|
---|---|---|
Ob schlussendlich look up tables schneller sind als die Cos/Sin-Funktionsaufrufe oder ob sie gar langsamer sind wegen Caching-Engpässen müsste man wohl messen. Es wird auch erst in's Gewicht fallen, wenn du abertausende Objekte hast, die auf trigonometrische Funktionen angewiesen sind, oder z.B. Fouriertransformationen von Signalen machst (wo ganz viele Ko- und Sinuswertchen einfliessen). So oder so muss man sich die Frage stellen ob 1° Winkelauflösung genug ist oder ob es evtl. sogar schon zu hoch aufgelöst ist... Aber bei gerademal 4 Aufrufen (2x Sin, 2x Cos) pro Hauptschleifendurchgang fällt das einfach noch nicht ins Gewicht.
Apropos Hauptschleife: Du missbrauchst eine For-Schleife dafür. Lass das! Ich mein's ernst, sowas tut man nicht. Also die Zählervariable einer For-Schleife in der Schleife manipulieren. Das ist wirklich sehr sehr schlimm Der arme Computer denkt, da käme eine kleine Schleife, die mal eben schwups abgearbeitet wird und dann setzt du kurz vor Schluss den Zähler wieder zurück. Wie gemein Weniger schlimm - gar schön oder an Perfektion kaum mehr zu übertreffen - ist eine While-Schleife, bei der eine schöne Abbruchbedingung im Kopf steht. BlitzBasic: [AUSKLAPPEN] While Not KeyHit(1) ; 1 = ESCAPE Aber zurück zu deiner eigentlichen Frage: Flush hat Folgendes geschrieben: Dass es sich um ein Rundungsproblem handelt ist klar aber wie kann mans lösen?
Gar nicht! Zumindest in BB nicht. Denn spätestens, wenn das Bild gezeichnet wird, werden die Koordinaten auf ganze Pixel gerundet. Ich habe dein Programm mal so angepasst, dass Sin/Cos direkt in ihrer majestätischen Fliesskomapräzision bei der Koordinaten-Berechnung der Bilder angewendet werden und man sieht bei tiefen Geschwindigkeiten immer noch schön das von dir beschriebene Phänomen: BlitzBasic: [AUSKLAPPEN] Graphics 640, 480, 24, 2 Um Bilder Subpixel-genau positionieren zu können, müsstest B3D in Kombination mit einer 2D-Sprite-Engine (nennen die sich so?) oder BlitzMax nehmen. Dann werden auch die Animation smoother Liebe Grüsse Holzchopf |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Flush |
Di, März 27, 2018 15:26 Antworten mit Zitat |
|
---|---|---|
Hallo zusammen,
@Holzchopf Die Sache mit der Hauptschleife nehm ich mir zu Herzen , ich lass meinen armen Computer nicht leiden, versprochen ! Zusammenfassen kann man also sagen, dass man das Phänomen mit Blitz3D nicht abschalten, wird Zeit für BlitzMax. Ich komm aus der OOP, sollte also nicht verkehrt sein @Lobby Ob Float Oder Integer, das Phänomen lasst sich nicht abschalten. Vielen Dank für Eure Hilfe und fröhliche Ostern! Viele Grüße, Flush |
||
Übersicht BlitzBasic Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group