Performance Sinuskurven verbessern



  • Ich berechne zwei Wellen, die ich quer über den Bildschirm laufen lasse. Damit diese nicht abgehackt aussehen brauche ich ja möglichst viele Pixel, am Besten für jeden x-Breiten Pixel sehr viele y-Werte, da ich diese Werte aus dem <0 -Bereich auf meine Zeichenhöhe (400 Pixel) hochrechnen muss, damit die Sinuskurve auch schön aussieht. Je mehr Bögen ich habe, desto mehr Pixel muss ich also berechnen. Habe ich nun eine Welle mit der Wellenlänge 0.5m und eine Andere mit der Wellenlänge 0.05m dann muss ich, damit ich die lange Welle komplett sehe, für die kurze Welle 20 Bögen berechnen, dh. sehr viele Pixel. Ist der Unterschied zwischen den Wellenlängen also sehr groß, ruckelt mein Bild ganz einfach nur noch...

    while(x<=xmax)
    {					
    
    y1=amp1*sin(2*Pi*((t/T1)-(x/lamda1)));	//zB. y1=0.05*sin(2*Pi*((0.05/0.02)-(x/0.04))		
    y2=amp2*sin(2*Pi*((t/T2)-((x/lamda2)));
    y3=y1+y2;
    
    SetPixel(x,y1,..);			
    SetPixel(x,y2,..);	
    SetPixel(x,y3,..);						
    
    x+=(xmin/(WNDWIDTH/2)); //xmin ist die kleinere der beiden Wellenlängen 
    //(im Beispiel 0.05/(1280/2)=	0.0000012 -> Es werden ca. 41 000 Pixel berechnet, kleinere Werte sehen unschön aus	
    }
    

    Wie kann ich nun die Zahl der Schleifendurchläufe verringern, aber gleichzeitig mein schönes zusammnehängendes Sinuskurvenbild beibehalten? Ich muss eine Möglichkeit finden, mir irgendwie dieses Wahnsinns hochgerechne auf Zeichengröße zu sparen, nur wie?



  • Du könntest Linien nehmen und nur noch jeden 5. Pixel oder so berechnen und verbinden.



  • Kannst du nicht die Pixel alle nur einmal berechnen, in nem Array speichern und dann eben in x-Richtung verschieben? (dx=v*dt)



  • Das mit Linie is keine schlechte Idee, habs grad mal umgesetzt, läuft jetzt flüssiger, sieht allerdings nicht mehr so schön rund aus 🙂 Aber was tut man nicht alles für die Performance 😛 Dachte halt, dass das noch irgendwie anders gehen könnte, bin ja bestimmt nicht der erste mit dem Problem ^^



  • Evtl. kannst du ja Bresenham's Algorithmus fuer Kurven irgendwie anpassen und verwenden?



  • Eventuell kannst Du auch versuchen adaptiv zu arbeiten. Da wo der Sinus stark gekrümmt ist bruachste viele Samples, da wo er nicht so stark gekrümmt ist brauchste wenige.

    Krümmung ist im Prinzip nix anderes als die zweite Ableitung. Praktischerweise ist das beim sinus grad wieder der sinus ;). Anschaulich passt das auch: Da wo der Sinus nahe 1 oder -1 ist, ist er auch stark gekrümmt, während er beim Nulldurchgang nahezu gerade ist und daher ein längeres Stück mit einer Strecke approximiert werden kann.


Anmelden zum Antworten