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 2 von 2     12   
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 Khabarakh
Khabarakh
 
#11
  Alt 7. Feb 2005, 13:18
@ Torpedo: öhm... hups .

@ Dizzy:

Das wird interesant mit dem Wissen der 9. Klasse (Wer sich an diese Zeit nicht mehr erinnern kann: als letztes hatten wir in Algebra lineare Gleichungen mit mehreren Variablen ).

Zitat:
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 Stupid
Hab natürlich auch Nr. 2 genommen , bei bei den Spiegeltypen bisher aber auch nicht wirklich schwer. Beim ebenen Spiegel reicht ja sogar eine lineare Gleichung, bei Hohl- und Parabolspiegel eben eine quadratische (zum Glück ohne komplexe Zahlen ). Und um die Verwaltung der einzelnen Objekte dreht sich sicher auch mein halber Quellcode (~ 2300 Zeilen).
Zitat:
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...
Ok, stopp . Bei "Substitution" in der netten Formel hörts dann doch auf . Also, du hast 1. den (bzw. einen) Schnittpunkt herausgefunden und 2. eine Tangente berechnet. Das wars doch . Glaub ich . Jedenfalls reicht eigentlich eine Gerade orthogonal zur Kurve durch den Schnittpunkt aus. Oder willst du festlegen, auf welcher Seite welches Medium bei einer Brechung liegt? Ich warte einfach mal auf deine Antwort .
Zitat:
Wie hast du das denn mit den Strahlen gemacht? Schrittweise (subpixelweise) aufgebaut, oder eine Liste von Linien?
Ein Array (ja, ich weiß, eine Liste wäre besser gewesen ) aus Linien. Beim Neuberechnen werden alle Strahlen bis auf den ersten gelöscht, der nächste Schnittpunkt gesucht, der Winkel ausgerechnet (das finde ich btw. einfach genial, dass man auch so einen Vorgang wie die Brechung mathematisch (wenn auch über "Umwege") berechnen kann) und dann eine neue Instanz mit diesem Winkel und dem Schnittpunkt als Position erstellt wird.

PS: Dass sich noch niemand darüber beschwert hat, dass die Winkel mathematisch falschherum angezeigt werden, spricht dafür, dass hier alle so gut wie nur Delphi im Kopf haben .
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

 
Delphi 7 Enterprise
 
#12
  Alt 7. Feb 2005, 14:29
Zitat von Khabarakh:
Das wird interesant mit dem Wissen der 9. Klasse (Wer sich an diese Zeit nicht mehr erinnern kann: als letztes hatten wir in Algebra lineare Gleichungen mit mehreren Variablen ).
Ich hätte damals nicht mal dein aktuelles Programm auf die Kappe gekriegt. Von daher...

Zitat von Khabarakh:
Hab natürlich auch Nr. 2 genommen , bei bei den Spiegeltypen bisher aber auch nicht wirklich schwer. Beim ebenen Spiegel reicht ja sogar eine lineare Gleichung, bei Hohl- und Parabolspiegel eben eine quadratische (zum Glück ohne komplexe Zahlen ). Und um die Verwaltung der einzelnen Objekte dreht sich sicher auch mein halber Quellcode (~ 2300 Zeilen).
Schade dass der eher langweiligere Teil (weil weniger mathematisch) so viel Raum beansprucht

Zitat von Khabarakh:
Ok, stopp . Bei "Substitution" in der netten Formel hörts dann doch auf . Also, du hast 1. den (bzw. einen) Schnittpunkt herausgefunden und 2. eine Tangente berechnet. Das wars doch . Glaub ich . Jedenfalls reicht eigentlich eine Gerade orthogonal zur Kurve durch den Schnittpunkt aus. Oder willst du festlegen, auf welcher Seite welches Medium bei einer Brechung liegt? Ich warte einfach mal auf deine Antwort .
Ich will tatsächlich herausfinden auf welcher Seite man sich befindet, allerdings nicht um den Medienübergang zu bekommen (bei mir sinds z.Zt. eh nur 1-dimensionale Objekte), sondern ich dachte mir: Bei Auftreffen des Strahls, den Winkel des Strahls zur Normalen bilden, und um den doppelten Winkel drehen. Bei der brechung muss ich allerdings anders drehen als bei der Spiegelung, glaube ich zumindest. Und um unterscheiden zu können wie ich vorgehen muss um das gewünschte zu erwirken, muss ich (glaub ich...) feststellen auf welcher Seite ich nun bin.
(Ist ja das lustige: So sehr genau hab ich mich mit der Physik noch nicht auseinandergesetzt - bisher hab ich erstmal den Rahmen erstellt )

Zitat von Khabarakh:
Ein Array (ja, ich weiß, eine Liste wäre besser gewesen ) aus Linien. Beim Neuberechnen werden alle Strahlen bis auf den ersten gelöscht, der nächste Schnittpunkt gesucht, der Winkel ausgerechnet (das finde ich btw. einfach genial, dass man auch so einen Vorgang wie die Brechung mathematisch (wenn auch über "Umwege") berechnen kann) und dann eine neue Instanz mit diesem Winkel und dem Schnittpunkt als Position erstellt wird.
Okay, das wäre auch mein Ansatz gewesen. Stellt sich für mich noch die Frage: Besser iterativ, oder rekursiv? Ist Strahlenverfolgung nicht ein eher rekursives Problem? (*insblauerat*)

Ich sollte mich echt mal tagsüber dran setzen, und vielleicht mal nen Plan machen...
Fabian K.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh
 
#13
  Alt 7. Feb 2005, 18:26
Zitat von dizzy:
Zitat von Khabarakh:
Ok, stopp . Bei "Substitution" in der netten Formel hörts dann doch auf . Also, du hast 1. den (bzw. einen) Schnittpunkt herausgefunden und 2. eine Tangente berechnet. Das wars doch . Glaub ich . Jedenfalls reicht eigentlich eine Gerade orthogonal zur Kurve durch den Schnittpunkt aus. Oder willst du festlegen, auf welcher Seite welches Medium bei einer Brechung liegt? Ich warte einfach mal auf deine Antwort .
Ich will tatsächlich herausfinden auf welcher Seite man sich befindet, allerdings nicht um den Medienübergang zu bekommen (bei mir sinds z.Zt. eh nur 1-dimensionale Objekte), sondern ich dachte mir: Bei Auftreffen des Strahls, den Winkel des Strahls zur Normalen bilden, und um den doppelten Winkel drehen. Bei der brechung muss ich allerdings anders drehen als bei der Spiegelung, glaube ich zumindest. Und um unterscheiden zu können wie ich vorgehen muss um das gewünschte zu erwirken, muss ich (glaub ich...) feststellen auf welcher Seite ich nun bin.
(Ist ja das lustige: So sehr genau hab ich mich mit der Physik noch nicht auseinandergesetzt - bisher hab ich erstmal den Rahmen erstellt )
Also imo gibts da keinen Unterschied . Differenzwinkel zur Orthogonalen, bei Reflektion eben verdoppeln, bei Refraktion +180° und dann ArcSin(Sin(alpha)/n) (von Luft zu n) (nein, in der 9. Klasse gibts eigentlich noch keine Trigonometrie ).

Zitat von dizzy:
Zitat von Khabarakh:
Ein Array (ja, ich weiß, eine Liste wäre besser gewesen ) aus Linien. Beim Neuberechnen werden alle Strahlen bis auf den ersten gelöscht, der nächste Schnittpunkt gesucht, der Winkel ausgerechnet (das finde ich btw. einfach genial, dass man auch so einen Vorgang wie die Brechung mathematisch (wenn auch über "Umwege") berechnen kann) und dann eine neue Instanz mit diesem Winkel und dem Schnittpunkt als Position erstellt wird.
Okay, das wäre auch mein Ansatz gewesen. Stellt sich für mich noch die Frage: Besser iterativ, oder rekursiv? Ist Strahlenverfolgung nicht ein eher rekursives Problem? (*insblauerat*)
Öhm...äh... . Meinst du mit rekursiv, einen Strahl wieder zurückzuverfolgen ? Das kommt doch auf's Gleiche raus, da sich jeder Strahlenverlauf umkehren lässt.
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

 
Delphi 7 Enterprise
 
#14
  Alt 7. Feb 2005, 21:52
Zitat von Khabarakh:
Also imo gibts da keinen Unterschied . Differenzwinkel zur Orthogonalen, bei Reflektion eben verdoppeln, bei Refraktion +180° und dann ArcSin(Sin(alpha)/n) (von Luft zu n) (nein, in der 9. Klasse gibts eigentlich noch keine Trigonometrie ).
Stimmt ja... oh man. Man bekommt ja eh immer den kleinsten Winkel zur Normalen. Jaja, wie gesagt schlag ich mich eigentlich auch noch eher mit dem Editor rum, und hab über die Physik noch nicht abschließend nachgedacht

Zitat von Khabarakh:
Öhm...äh... . Meinst du mit rekursiv, einen Strahl wieder zurückzuverfolgen ? Das kommt doch auf's Gleiche raus, da sich jeder Strahlenverlauf umkehren lässt.
Na, eher in der Programmstruktur. Ob der Strahl "von vorne" begonnen wird, das vollständig beendet, und dann weiter (iterativ) oder in einer irgendwie gearteten rekursiven Methode. Aber ich kann mir die Antwort eigentlich selbst geben: Iterativ müsste es am ehesten treffen. Da ja der vorhergehende Strahl schon komplett fertig berechnet sein muss um den nächsten Abschnitt überhaupt angehen zu können... Betrachte diese Frage als nie gestellt

Gudde Nacht,
Fabian
Fabian K.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 07:38 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