|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 01.04.2006, 17:50 Titel: Wellengenerator |
|
|
So, ich hab gestern Abend mal n kleines Programm für den Physikunterricht geschreiben, welches das Superpositionsprinzip von Wellen verdeutlichen soll:
Download
Im Prinzip sollte das ganze selbsterklärend sein.
Wens interesseit, hier mal wie die Berechnung funktioniert:
CPP: | case WM_PAINT:
//backbuffer erzeugen
BeginPaint(hWnd, &PS);
hDC=CreateCompatibleDC(PS.hdc);
hBackBuffer=CreateCompatibleBitmap(PS.hdc, theSettings.Size, theSettings.Size);
SelectObject(hDC, hBackBuffer);
for(int x=0; x<theSettings.Size; ++x)
{
for(int y=0; y<theSettings.Size; ++y)
{
float WaveHeight=64+theSettings.D1*sinf((Distance(x, y, XPos1, YPos1)/theSettings.L1+Time*theSettings.T1+theSettings.P1))*64.0f;
float WaveHeight2=64+theSettings.D2*sinf((Distance(x, y, XPos2, YPos2)/theSettings.L2+Time*theSettings.T2+theSettings.P2))*64.0f;
switch(Color)
{
case 1:
SetPixel(hDC, x, y, RGB(
static_cast<int>(WaveHeight+WaveHeight2),
0, 0));
break;
case 2:
SetPixel(hDC, x, y, RGB(0,
static_cast<int>(WaveHeight+WaveHeight2),
0));
break;
case 3:
SetPixel(hDC, x, y, RGB(0, 0,
static_cast<int>(WaveHeight+WaveHeight2)
));
break;
case 4:
SetPixel(hDC, x, y, RGB(static_cast<int>(WaveHeight), static_cast<int>(WaveHeight2), 0));
break;
case 5:
SetPixel(hDC, x, y, RGB(static_cast<int>(WaveHeight), static_cast<int>(WaveHeight2), static_cast<int>(WaveHeight+WaveHeight2)));
break;
}
}
}
if(1!=theSettings.Scale)
{
StretchBlt(PS.hdc, 50, 50, theSettings.Size*theSettings.Scale, theSettings.Size*theSettings.Scale, hDC, 0, 0, theSettings.Size, theSettings.Size, SRCCOPY);
}
else
{
BitBlt(PS.hdc, 50, 50, theSettings.Size, theSettings.Size, hDC, 0, 0, SRCCOPY);
}
DeleteObject(hBackBuffer);
DeleteDC(hDC);
EndPaint(hWnd, &PS);
break;
|
Dazu gleich mal eine Frage: SetPixel ist ja ein wenig blöd, vor allen Dingen wenn man es 10.000 mal benutzt. Wie kommt man direkt an die Daten des HBITMAPS dran? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 01.04.2006, 21:14 Titel: Re: Wellengenerator |
|
|
Jonathan_Klein hat Folgendes geschrieben: |
Dazu gleich mal eine Frage: SetPixel ist ja ein wenig blöd, vor allen Dingen wenn man es 10.000 mal benutzt. Wie kommt man direkt an die Daten des HBITMAPS dran? |
gar net, geht nur mitm speicherkontext und setpixel / getpixel
aber du kannst daraus ne DIB-Section machen, dann hast du Zugriff auf die bits und das geht ein wenig schneller; so schlimm is das andere aber auch net
Gruß DXer |
|
Nach oben |
|
|
Dragon Super JLI'ler
Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 01.04.2006, 22:02 Titel: |
|
|
Dragon hat Folgendes geschrieben: | Warum nicht gleich DirectDraw? |
verschwendung. für sowas DX zu nehmen, da reicht die WinAPI völlig 100%ig im größten maße usw. aus
Gruß DXer |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 02.04.2006, 07:44 Titel: |
|
|
ist halt für die Schule und da isses peinlich, wenn die Software net läuft. _________________ https://jonathank.de/games/
Zuletzt bearbeitet von Jonathan_Klein am 02.04.2006, 11:56, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
OLiver Super JLI'ler
Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 02.04.2006, 08:39 Titel: |
|
|
Jonathan_Klein hat Folgendes geschrieben: | ist hatl für die Schuel und da isses peinlich, wenn die Software net läuft. |
DirectX7 ist doch sogut wie überall drauf. _________________ http://www.sieder25.org/ (Siedler 2 - Remake) |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 02.04.2006, 08:56 Titel: |
|
|
DirectDraw halte ich in dem Fall für angemessen, ich hatte das bei den Einstellungen ein bisschen größer gemacht... und naja... adioz amigoz!
Schaut nice aus ansonsten. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 02.04.2006, 10:52 Titel: |
|
|
ja, das Hauptproblem sind wahrscheinlich auch die sinus-Funktionen, imemrhin 2Stück pro Pixel und Frame. Wenn ich da schnellere Versionen nehmen würde, würd das wohl mehr optimieren. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 02.04.2006, 11:40 Titel: |
|
|
Jonathan_Klein hat Folgendes geschrieben: | ja, das Hauptproblem sind wahrscheinlich auch die sinus-Funktionen, imemrhin 2Stück pro Pixel und Frame. Wenn ich da schnellere Versionen nehmen würde, würd das wohl mehr optimieren. |
schon mal über ne Lookuptable nachgedacht? Ich denke, dass könnte damit schneller gehen. Also, einfach die Sinuswerte von x bis y in z schritten vorher berechnen (mit x, y, z als Parameter für ne Klassenfunktion / Funktion, je nachdem was du alles damit machen willst) und das in nem Array sprechern. Wenn du willst, kann ich dir ne kleine Erklärungsklasse von mir dafür schicken. Kann aber auch sein, dass du sowas kennst...
Gruß DXer |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 02.04.2006, 12:41 Titel: |
|
|
auch eine Variante: per Pixelshader auf der GPU berechnen lassen.
interessantes Programm. |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 02.04.2006, 12:43 Titel: |
|
|
Ich hab kA wie der Algo funktioniert und Physik nicht mehr in der Schule, aber vlt. könntest du die Werte auch irgendwie inkrementell aus einem Ausgangswert und einem Deltawert errechnen? |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 02.04.2006, 13:20 Titel: |
|
|
Lookuptable bringen heutzutage wenig, sind kompliziert, ungenau und fehleranfällig - würde ich von abraten, außer die Rechner in der Schule sind uralt. Verwende mal SetPixelV() das sollte um einiges schneller sein. |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 02.04.2006, 14:04 Titel: |
|
|
Christian Rousselle hat Folgendes geschrieben: | Lookuptable bringen heutzutage wenig, sind kompliziert, ungenau und fehleranfällig - würde ich von abraten, außer die Rechner in der Schule sind uralt. Verwende mal SetPixelV() das sollte um einiges schneller sein. |
naja, man könnte auch, speziell für das Sinusproblem, eine Vereinfachung aus der Taylorreihe(auch nicht 100%ig genau, aber für spiele reichts) nehmen(angle muss Bogenmaß sein):
CPP: | sinus = angle-angle*angle*angle*0.16666667f+angle*angle*angle*angle*angle*0.00833333f-angle*angle*angle*angle*angle*angle*angle*0.000198413f; |
Gruß DXer
EDIT: std::sin ist auch seehhr schnell |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 02.04.2006, 14:39 Titel: |
|
|
std::sin() ist das selbe wie sinf().
In diesem konkreten Fall gehts ja grade nicht um Spiele, ich denke bei einer physikalischen Simulation ist eine gewisse Genauigkeit schon erforderlich. Am besten Jonathan äußert sich mal dazu. |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 02.04.2006, 15:15 Titel: |
|
|
GreveN hat Folgendes geschrieben: | std::sin() ist das selbe wie sinf().
In diesem konkreten Fall gehts ja grade nicht um Spiele, ich denke bei einer physikalischen Simulation ist eine gewisse Genauigkeit schon erforderlich. Am besten Jonathan äußert sich mal dazu. |
naja, die Taylorreihe bietet da schon eine äüßerst hohe Genauigkeit, hier mal ein Beispiel in Pseudo:
Code: |
55° = 11/36*PI = 0.9599310886...
var A = rad(55*)
sin(A) = 0.8191520443...
//mit Taylor:
sinus = A-A*A*A*0.16666667f+A*A*A*A*A*0.00833333f-A*A*A*A*A*A*A*0.000198413f =
A-0.1474242509...+6.792331377...-1.490220465...
= 0.8191521471 |
Gruß DXer |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|