Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fractal-Visualisierung in Delphi (https://www.delphipraxis.net/106567-fractal-visualisierung-delphi.html)

everdream 12. Jan 2008 21:28


Fractal-Visualisierung in Delphi
 
Hallo,

ich möchte eine kleine Visualisierung für Fractale (bzw. zum Testen erstmal für die Mandelbrotmenge) entwickeln. Die Berechnungen hab ich alle schon. Ich brauche nur noch etwas, um meine Ergebnisse schnellstmöglich darzustellen.

Für alle, die jetzt nicht wissen was ich eigentlich mache:
  • entweder kurz bei wiki nachlesen: Link zum Artikel "Mandelbrotmenge"
  • oder, wenn euch das zu lang ist, folgende Situation:
    Ich habe für jeden Pixel einen Integerwert, der in eine Farbe umgerechnet und angezeigt werden soll.
Mit Canvas Pixel für Pixel zeichnen ist allerdings recht langsam, vor allem, wenn man bei höheren Auflösungen bildschirmfüllend anzeigen will.

Ich vermute, dass DirectX oder OpenGL meine Ansprechpartner sind. Wenn ich da richtig liege, könnte mir jemand einige Informationen dazu zukommen lassen?

Vielen Dank schonmal im Voraus!

lg, Max!

P.S.: Ich weiß, "gibts schon", aber ich hab halt Spaß dran :love:

Muetze1 12. Jan 2008 21:50

Re: Fractal-Visualisierung in Delphi
 
Wie malst du bisher "pixelweise"? Nutzt du die Eigenschaft Pixels[] des Canvas oder schon ein OffScreenBitmap und dessen ScanLine[] Eigenschaft? Wenn ersteres, dann suche nach letzterem hier im Forum. Wenn letzteres, dann zeig mal den Code...

everdream 12. Jan 2008 21:58

Re: Fractal-Visualisierung in Delphi
 
Bis jetzt male ich Pixel für Pixel mit Pen.color und canas.moveto/canvas.lineto.
werde mich mal nachder OffScreenBitmap erkundigen.

Habe mir orgestellt am ende einen flüssigen Zoom ins bild zu haben, wäre das damit möglich?


edit: Zu "OffScreenBitmap" find' ich irgendwie nich so viel. Meinst du damit einfach TBitmap?

rawsoul 12. Jan 2008 22:21

Re: Fractal-Visualisierung in Delphi
 
Ich denke, dass er das meint, ja. Ein OffScreenBitmap wäre meiner Meinung nach ein TBitmap, welches nicht auf dem Bildschirm, sondern nur im Speicher existiert.

Der Zoom damit wäre nicht möglich, zumindest nicht flüssig. Ein Pixel ist ein Pixel.

everdream 12. Jan 2008 22:30

Re: Fractal-Visualisierung in Delphi
 
nja, aber das ganze soll ja angezeigt werden,... im speicher bringts mir nix (ich weiß, bitmaps kann man ja auch anzeigen lassen)

ist das vllt mit DirectX oder OpenGL einfacher? or allem der zoom?

rawsoul 12. Jan 2008 22:44

Re: Fractal-Visualisierung in Delphi
 
Bei DX bzw. OGL wirst du auch Pixel bemalen müssen, kommt also so ziemlich aufs gleiche raus. Du könntest jedoch eine - sagen wir mal 100px * 100px Darstellungsfläche setzen, jedoch ein gestretchtes (StretchBlt), oder verkleinertes Bitmap mit viel größeren Dimensionen darstellen.

Natürlich kannst du das OffScreenBitmap später darstellen, wenn du es fertig gezeichnet hast (TImage.Picture.Bitmap.Assign(TBitmap), ich glaube sogar, mit TImage.Assign(TBitmap) geht es auch). Oder bestehst du darauf, den Zeichenprozess beobachten zu können?

everdream 12. Jan 2008 23:05

Re: Fractal-Visualisierung in Delphi
 
Nee, ich muss da nicht zugucken können.
Mir wäre auch recht, dass er im Voraus schonmal die Berechnungen für x-frames durchführt, bevor er startet, aber es muss ja möglich sein so einen Zoom hinzubekommen.

Müsste ich dann erstmal x bitmaps erstellen und die dann einfach alle zeigen lassen? das wäre sehr speicheraufwändig!
Das muss doch irgendwie anders gehen!

rawsoul 12. Jan 2008 23:17

Re: Fractal-Visualisierung in Delphi
 
Wenn das so ist, dann nutze doch das zeichnen im OffScreenBitmap.

Ein verkleinertes Bild ist ja nicht mehr als ein (großes) Bild, bei welchem nicht alle Pixel dargestellt werden. Also berechne ein großes und stelle beim Zoomen den Skalierungsfaktor hoch. Der Benutzer kann dann selbst hineinzoomen.

everdream 12. Jan 2008 23:23

Re: Fractal-Visualisierung in Delphi
 
ich hab ja schon ne lösung, bei der der user selbst zoomt, das ganze passiert halt auch noch mit canvas usw....
screenshots kann man da aber auch schon machen (ein screenshot vom 1600x1600 ist allerdings 10MB groß)

alles noch weit weg von perfektion!

das soll ja selber zoomen, darum gehts ja. sonst bräuchte ich auch nich (viel) schneller zeichnen....

Muetze1 12. Jan 2008 23:29

Re: Fractal-Visualisierung in Delphi
 
Was machst du hier eigentlich für ein Aufstand? Eine Frage, vieles wird angenommen und alles ist schon wieder zu langsam. Also mal der Reihe nach...

1. OffScreenBitmap ist ein Bitmap welches du anlegst und zum malen nutzt. Dadurch erzeugst du das Bild einmalig nach einer Änderung und kannst dieses dann bei jedem Malen einfach auf die Form malen.
2. Nutzung von TImage ist von Nachteil. Selbst wenn nur ein kleier Teil neugezeichnet werden muss, wird das komplette TImage gemalt. Damit wird das Flackern gefördert und es verlangsamt den Zeichenprozeß.
3. Fülle das TBitmap über die ScanLine Property und du hast eine grundlegend hohe Geschwindigkeit.
4. Male das OffScreenBitmap direkt auf die Form. Nutze dabei die Eigenschaft ClipRect des TCanvas und male nur den markierten Bereich (also das Rechteck welches die Überschneidung zwischen ClipRect und deinem Bitmap darstellt). Dies kannst du einfach lösen mit [mdsn]IntersectRect()[/msdn] und MSDN-Library durchsuchenBitBlt()
5. Zoom - wie stellst du dir das vor? Wenn du ein Bild berechnest, dann wirst du die schnellste und grafisch beste Darstellung bekommen, wenn du das Bild passend zu der dargestellten Bildauflösung berechnest. Wenn du nun hinein zoomen willst, dann geschieht das mathematisch mit Änderung deiner Formelparameter. Dadurch werden andere Pixeldaten errechnet und somit entsteht ein neues Bild und dieses zeigt dann einen bidlichen Zoom dar. Ein berechneter Pixel mit einem Farbwert kann nur als Rechteck/Quadrat gezoomt werden und somit wird aus einem roten Pixel gezoomt ein rotes Rechteck - dein zoom ist ein rein mathematisches Problem. verständlich?
6. Ein Screenshot unkomprimiert sind 10 MB an Daten - klar. Wenn du es komprimierst (z.B. PiNG), dann wird es weniger - also nicht immer TBitmap nutzen um was abzuspeichern.
7. Du kannst mit einem Thread im Hintergrund die Daten feiner rechnen. Das Problem beim vorberechnen von Bilddaten für den Zoom: wohin zoomt der Nutzer? man kann ja schliesslich oben links zoomen oder unten rechts ...

Schon allein wegen deinen Fragen und ein paar Dingen bezüglich Zoom, etc. eine Frage von mir: Kennst du fractint? Schonmal mit gearbeitet bzw. Zoom, Formelparameter etc?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:43 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz