AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Reflection-Refraction Simulator
Thema durchsuchen
Ansicht
Themen-Optionen

Reflection-Refraction Simulator

Ein Thema von Khabarakh · begonnen am 28. Jan 2005 · letzter Beitrag vom 7. Feb 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Khabarakh
Khabarakh
Registriert seit: 18. Aug 2004
Hallo DPler,

Nachdem ich dieses Forum nun länger verfolgt habe, will ich doch auch mal aktiv werden .

Reflection-Refraction Simulator

http://www.honoghr.com/Reflection/1.jpg

Was soll ich sagen, mit diesem Programm können eben dem Namen gemäß Spiegelungen und Streuungen an verschiedenen Spiegeltypen simuliert werden .
Zum Zeichnen habe ich die GR32-Komponenten benutzt (Danke an dizzy, sonst hätte ich das nie entdeckt ).

Objekte werden allgemein mit der rechten Maustaste angewählt und mit der linken Maustaste an eine neue Position gesetzt. Zusätzlich gibt es objektspezifische Einstellungen am rechten Rand, die meistens selbsterklärend sein sollten, näheres unten. Neue Objekte werden durch den entsprechenden Button oben angewählt und dann mit Linksklick gesetzt. Gelöscht werden sie mit [Entf] (mir ist erst gerade eingefallen, dass das vielleicht für Verwirrung sorgen könnte, wenn man rechts ein Eintrag löschen will . Ich benutze immer die Backspace-Taste, deswegen habe ich daran gar nicht gedacht. Ich bin für alle Vorschläge offen ).
Rechts unten befinden sich noch drei allgemeine Optionen:
- Anti-Aliased: GR32 sei Dank
- Winkelangaben: Winkel jedes Strahls werden angezeigt
- Linsen: Brechungsmodus, s.u.


Der (Licht-)Strahl

Breitet sich geradlinig aus ( ), wird von Spiegeln reflektiert bzw. gebrochen. Die höchste Brechungs/Spieglungsanzahl pro Strahl beträgt 50. Der Strahl ist blau, geht nach mehreren Spiegelungen aber gegen rot.
- Winkel: Startwinkel des ersten Strahls

Der Hohlspiegel
http://www.honoghr.com/Reflection/2.jpg
Physikalischer Hintergrund:
Alle vor der Brechung parallelen Strahlen schneiden sich im Brennpunkt. Naja, jedenfalls fast . So bilden die Schnittpunkte die sogenannte Brennlinie, für einen einzigen Brennpunkt wäre ein Paraboloid zuständig.

- Radius: Halber Durchmesser in Pixeln ( )
- Startwinkel: Wo er eben anfängt ^^
- Weite: Länge des Kreisbogens

Der ebene Spiegel
http://www.honoghr.com/Reflection/3.jpg
Physikalischer Hintergrund:
Einfallswinke=Ausfallswinkel

Und hier sollte noch der Paraboloid stehen . Leider habe ich bei Drehung desselben noch einige Probleme, dafür brauche ich mal 4 Stunden Debugzeit .

Hehe, fast vergessen:

Der Brechungsmodus
http://www.honoghr.com/Reflection/4.jpg
BETA, folgt nach einem sehr einfachen Gesetz: Am Anfang befindet sich der Strahl in der Luft, bei der ersten Spiegel-"Durchquerung" wechselt er das Medium (und zwar gerade nach Glas mit einem Brechungsindex n=1,52), beim nächsten wieder in Luft. (Hier also ein Glas-Prisma)

ToDo:
- werde wohl noch "Echtzeitverschiebung" von Objekten (mit gleichzeitiger Brechnung) einbauen
- Brechungsindex frei wählbar
- Paraboloid
- Höchstspieglungszahl frei wählbar

Macht weiter so !

PS: Herzlichen Glückwunsch ^^

Download s.u.! (oder lieber andersherum?)
Moderator in der EE
 
Benutzerbild von Aenogym
Aenogym

 
Delphi 7 Enterprise
 
#2
  Alt 28. Jan 2005, 21:52
muss schon sagen: ein echt interessantes programm

vorschläge:
mehr objekte
verschieben der objekte pixelweise mit den pfeiltasten
verschieben der objekte mit der maus in echtzeit anzeigen (strahlen ggf. für die dauer der verschiebung "ausblenden")
"arbeitsbereich" scrollfähig

aber sonst richtig cool

anbei mal mein erster versuch, was spannendes hinzubekommen

Aenogym
Miniaturansicht angehängter Grafiken
ref_400.jpg  
Steffen Rieke
  Mit Zitat antworten Zitat
Benutzerbild von gmarts
gmarts

 
Delphi 6 Enterprise
 
#3
  Alt 28. Jan 2005, 22:06
Ich kann mich nur anschließen. Tolle Sache.


- Ein Echtzeit-Verschieben der Objekte halte ich auch für eine tolle Verbesserung.
- Schön wäre ein Drehen der Objekte zusätzlich per Maus.
- Die Simulationsfläche sollte auch bei hohen Auflösungen den ganzen Bildschirm ausfüllen. Dann machst gleich noch mehr Spass.
- toll wäre auch es auch Spiegel und Linsen kombinieren zu können.
- Freihandobjekte bzw. Beziersplines fehlen noch.

MfG GM


Nachtrag: Speicheroption muss unbedingt rein!
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh
 
#4
  Alt 6. Feb 2005, 19:46
Nein, ich hab euch nicht vergessen, sondern die ganze Woche hier dran gearbeitet :
Großes Update

- Vollbild, Komponenten passen sich automatisch an die Auflösung an
- Stark erweiterte Bedienung:
Objekte können jetzt mit den Tasten g(Grab), r(Rotate) und s(Size) verändert werden. Der Cursor muss sich dazu auf der Paintbox befinden. Mit Linksklick kann die Veränderung bestätigt, mit Rechtsklick wieder rückgängig gemacht werden.
Wer weiß, von welchem Programm ich das geklaut habe, bekommt nen Keks .
- Speichermöglichkeit
- Bei jedem Spiegel Einstellmöglichkeit als Linse (Hab einfach das "Spiegelnd" rausgeworfen, das braucht eh keiner )
- Brechung im Hohlspiegel korregiert
- Höchste Anzahl der Reflektionen/Brechungen pro Strahl und kleinster Abstand von 2 hintereinander folgender Brechungen eines Strahls einstellbar

Zum letzten Punkt noch etwas:
Ein großes Problem war zu Anfang, dass sich Strahlen durch mathematische Ungenauigkeiten (dass ich die Position jedes Strahls nur in ganzen Pixel-Einheiten gespeichert habe, macht es auch nicht besser ) zweimal kurz hintereinander im Hohlspiegel schneiden. Deshalb habe ich eben einen minimalen Abstand eingeführt. Wenn ihr einen Strahl sehr flach zu einem Hohlspiegel positioniert, kann man es immer noch sehen, aber 10 sollte ein guter Wert sein.

PS: Mir ist ganz am Schluss aufgefallen, dass es noch einen Bug gibt. Wehe jemand stellt einen Strahl auf 315° .

PPS: "maximale" Maximale Reflektionen habe ich mal auf 1000 begrenzt, bei mir (3,2 GHz) braucht er dann ca. 1 Sekunde zum aktualisieren (im Anfangskreis mit 1 Strahl). Aber auch ganz nett anzuschauen .

PPPS: ( )
Zitat von gmarts:
- Freihandobjekte bzw. Beziersplines fehlen noch. Stupid
Das Anzeigen der Beziérs wäre ja kein großes Problem , jetzt brauche ich nur noch die Formel für den Schnittpunkt mit einer Geraden+eine Orthogonale im Schnittpunkt .
Angehängte Dateien
Dateityp: zip reflectionrefraction_simulator_133.zip (253,2 KB, 122x aufgerufen)
Sebastian
  Mit Zitat antworten Zitat
Kernel32.DLL
 
#5
  Alt 6. Feb 2005, 20:04
Schickes Progg

*Auch was gemalt hab*
Miniaturansicht angehängter Grafiken
auchwastolles_337.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

 
Delphi 2009 Professional
 
#6
  Alt 6. Feb 2005, 20:21
Hi,

supi! Gefällt mir echt sehr gut

*meins im Anhang*
Miniaturansicht angehängter Grafiken
spider_1_102.jpg  
Manuel
  Mit Zitat antworten Zitat
Nicolai1234

 
Turbo Delphi für Win32
 
#7
  Alt 6. Feb 2005, 20:38
Evtl. wäre es ganz nett, wenn sich der Strahl langsam aufbaut, so wie ein Lichtstrahl. (nur eben langsamer)
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh
 
#8
  Alt 6. Feb 2005, 20:51
Gut, dass es euch gefällt .
Zitat von Nicolai1605:
Evtl. wäre es ganz nett, wenn sich der Strahl langsam aufbaut, so wie ein Lichtstrahl. (nur eben langsamer)
Gute Idee, hab ich mir auch schon überlegt und sollte auch nicht schwer zu realisieren zu sein. Oder vielleicht auch ein einzelner Strahlen-"Schuss", mal sehen.

[EDIT]Fast vergessen: Eure Bilder sind genial .
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

 
Delphi 7 Enterprise
 
#9
  Alt 6. Feb 2005, 23:41
Zitat von Khabarakh:
PPPS: ( )
Zitat von gmarts:
- Freihandobjekte bzw. Beziersplines fehlen noch. Stupid
Das Anzeigen der Beziérs wäre ja kein großes Problem , jetzt brauche ich nur noch die Formel für den Schnittpunkt mit einer Geraden+eine Orthogonale im Schnittpunkt .
Ist ja nen Dingen... Du hast mich mit diesem netten Progrämmchen seit langem mal wieder auf eine nette Programmier-Aufgabe gebracht: Brechung/Reflexion an Splines
Den Spline-Editor hab ich schon, nur mit den Emittern steh ich noch auf Kriegsfuß. Es gibt ja grundsätzlich 2 Möglichkeiten die "Kollision" zu erkennen. 1) Den Strahl Stück für Stück aufbauen, und dann, wenn nahe genug an einem Objekt agieren. 2) Arithmetisch, also brav die Schnittpunkte berechnen, und den naheliegensten verarbeiten.
So, Nr. 2 ist eindeutig schöner und genauer und performanter und überhaupt... Also wollte ich das so machen. Nun besteht ein Strahl, da ja mehrfach gebrochen/reflektiert aus mehreren einzelnen Stücken, also ein Array/List von Linien. Für einen Strahl ja noch okay, aber ich wollte dann auch Emitter haben, die beliebig viele Strahlen in einem wählbaren Öffnungswinkel in eine wählbare Richtung schießen. Eieiei, das ist dann schon schwerer nachzuvollziehen. Dazu kommt, dass ich beliebig viele Objekte in der Szene habe, und ich wollte diese auch unterschiedlichen Typs haben (Kreis, Linie, Spline, ...)
Da ich bisher immer nachts dran war, fehlt mir da noch die nötige Gedankenordnung zu

Aber das Problem mit den (Beziér-)Splines ist, dass diese eine Gleichung 3. Grades darstellen. Schneidet man das mit einer Linie, so bekommt man ein Gleichungssystem das zu lösen ist. Zwar eindeutig bestimmt, aber leider muss man am Ende die Nullstellen einer Gleichung 3. Grades berechnen, um letztendlich die Schnittpunkte zu erhalten. Das übliche Verfahren (eine NS raten, dann Polynomdivision und pq-Formel/Mitternachtsregel) ist numerisch im PC wenn überhaupt nur sehr aufwändig und wenig performant lösbar. Also ist klein Dizzy auf die Suche gegangen, und hat die Cardano'schen Formeln entdeckt, die es erlauben die NS von Gleichungen 3. bzw. 4. Grades implizit zu errechnen.

Das implementiert, und auf das nächste doofe Problem gestoßen: Man braucht ja die Normale im Schnittpunkt. Brauchbar annähern kann man das ja, in dem man zwei um den Schnittpunkt herum liegende Punkte auf dem Spline verbindet (Tangente), und diese um 90° dreht. Das dumme ist nur: Man kann nicht direkt bestimmen in welche Richtung die Normale zeigt. Naja, und eben das macht ja nachher den unterschied Relexion<->Refraktion aus... Also muss ich mir jetzt irgendwie überlegen, ob ich herausfinden kann, ob die Normale gewendet werden muss...
Bisher hat das Teil >700 Zeilen Code, und es wird noch überhaupt nichts gebrochen/gespiegelt. Also so eben Splines einbauen ist wohl leider nicht ^^

Wie hast du das denn mit den Strahlen gemacht? Schrittweise (subpixelweise) aufgebaut, oder eine Liste von Linien?
Sehr interessantes Thema das ganze , und ist eigentlich auch eine nette Vorstufe zum sogenannten Photontracing das gute 3D-Renderer beherrschen. Aber Polygondaten sind da nochmal ein anderes Kaliber .
Ich bin hot

Danke für die Anregung und Erwähnung (), und glückwunsch zu dem netten Progrämmchen!

Gruss,
Fabian
Fabian K.
  Mit Zitat antworten Zitat
Torpedo
 
#10
  Alt 7. Feb 2005, 08:50
Gefällt mir und funktioniert auch sehr gut.
Bis auf etwas.
Das Einfachste hast du vergessen => "Beenden" im Menü funktioniert nicht
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:05 Uhr.
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