JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=1990a5609f8303fcfa6a85c3bfdabafaMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Wellengenerator
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Projekte
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

BeitragVerfasst am: 01.04.2006, 17:50    Titel: Wellengenerator Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 01.04.2006, 21:14    Titel: Re: Wellengenerator Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 01.04.2006, 22:00    Titel: Antworten mit Zitat

Warum nicht gleich DirectDraw?
_________________
Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 01.04.2006, 22:02    Titel: Antworten mit Zitat

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 Wink Razz

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 02.04.2006, 07:44    Titel: Antworten mit Zitat

ist halt für die Schule und da isses peinlich, wenn die Software net läuft. Wink
_________________
https://jonathank.de/games/


Zuletzt bearbeitet von Jonathan_Klein am 02.04.2006, 11:56, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 02.04.2006, 08:39    Titel: Antworten mit Zitat

Jonathan_Klein hat Folgendes geschrieben:
ist hatl für die Schuel und da isses peinlich, wenn die Software net läuft. Wink


DirectX7 ist doch sogut wie überall drauf.
_________________
http://www.sieder25.org/ (Siedler 2 - Remake)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 02.04.2006, 08:56    Titel: Antworten mit Zitat

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. Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 02.04.2006, 10:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 02.04.2006, 11:40    Titel: Antworten mit Zitat

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

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 02.04.2006, 12:41    Titel: Antworten mit Zitat

auch eine Variante: per Pixelshader auf der GPU berechnen lassen. Very Happy

interessantes Programm. Thumb Up
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 02.04.2006, 12:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 02.04.2006, 13:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 02.04.2006, 14:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 02.04.2006, 14:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 02.04.2006, 15:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Projekte Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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

Impressum