![]() |
Re: RiB - Reflect it Baby
jo, ich meinte jetzt eher, dass man sie garnicht erst aus m bild schieben kann.
das mit dem cursor muss ich überlesen haben, sry. |
Re: RiB - Reflect it Baby
Zitat:
Muss ganz klar noch rein! Zitat:
Zitat:
Auch das könnte man ja wählbar machen... Mann das wird eine Propertyschlacht ^^ Zitat:
Zitat:
Zitat:
Zitat:
Die Weiterentwicklung wird in den kommenden 3 Wochen u.U. etwas stocken, da ich 6 Klausuren vor der Nase hab, aber grad bei so viel schöner Resonanz macht das Proggen gleich noch mal so viel Spaß! Ich geh erstmal in's Bett... wird ja schon wieder hell ^^ Fabian |
Re: RiB - Reflect it Baby
Liste der Anhänge anzeigen (Anzahl: 1)
Vier Tage Skiurlaub beendet... und hier geht die Post ab :lol: .
Was soll ich zu deinem Programm sagen, perfekt :thumb: ! Sieht auf den ersten Blick wie eine Mischung aus der GR32 GradLines-Demo und deinem Gravitationssimulator aus :mrgreen: . [EDIT] Das im Anhang sieht allerdings etwas komisch aus? Bzw. welche Art von Refraktion hast du eingebaut? |
Re: RiB - Reflect it Baby
Ja das ist evtl. noch nicht 100%ig. Im grunde hat man ständig Übergänge der Art: Medium1 -> Medium2, egal von wo aus. Nie Medium2 -> Medium 1. Da muss ich noch denken... ^^
|
Re: RiB - Reflect it Baby
Das wars dann wohl mit der Umkehrbarkeit des Lichtweges :mrgreen: . Hab mal auch in den Code geschaut, Hilfe, Vektoren :lol: . Die konnte ich bei meinem Programm zum Glück vermeiden :stupid: . Nett fande ich, dass meine Prozedur auch haargenau ReCalc heißt.
|
Re: RiB - Reflect it Baby
Wie schon öfters gesagt, finde ich das Programm auch genial :stupid:
Hab' mich jetzt auch mal dran gemacht.. (wie unser MicroKuchen ;-)) Ergebnis: Durch konsequenten Einsatz von handgemachtem Assemblercode (:mrgreen:) ist RiB schon fast 5% schneller, bei manchen Funktionen hab' ich 10% bekommen, aber da geht noch mehr :) So, genug geredet, ich hacke weiter an dizzy's Code rum ;) |
Re: RiB - Reflect it Baby
Zitat:
Ich hab aber auch schon wieder weitreichende Änderungen im Kopf. Wobei man die ganzen Funktionen zur Vektorrechnung sicherlich recht gefahrlos jetzt schon assemblieren kann... (btw: Die Bildschn aus deiner PM sind :thumb:) Cheeriot, Fabian |
Re: RiB - Reflect it Baby
Danke für das Kompliment, die Bilder warn auch eine Fummelei ^^ :) (/me schenkt dizzy eine Rose zum Valentinstag *g*)
PS: Sobald alle Optimierungen fertisch sind, poste ichs mal. Zur Zeit ist es nur FPU-Code, später kommt noch SSE, falls damit schneller wird :) (Die VOrtho-Funktion konnte ich mit FPU-pur um 75% verschnellern..) |
Re: RiB - Reflect it Baby
Ich möchte diesen Thread nochmal aus der Versenkung hervorhohlen, weil das Prog mich jetzt wirklich interessiert :stupid:
- Wird es noch entwickelt ? - Kann man auch gerade Linien machen ? - Das refrakting ist irgendwi nicht ... ganz richtig ... bei einer Linie wird das Licht gebrochen, wie bei einer Sammellinse, und manchmal wird es auch komplett ... fehlgeleitet :( Kommt da noch was ? |
Re: RiB - Reflect it Baby
Zitat:
Zitat:
Zitat:
Zitat:
Schönen Gruß, Fabian |
Re: RiB - Reflect it Baby
Habe das Teil heute erst gesehen, ich sag nix dazu !
:!: :shock: :cyclops: :hello: :thumb: |
Re: RiB - Reflect it Baby
Dass das refracting nicht geht meinte ich so:
-Manchmal wird es etwa so refraktiert:
Code:
Was ja nun nicht dein kann. Ausserdem wird bei einer fast geraden Linie, das Licht gebrochen, wie bei einer Sammellinse ... das ist auch ein wenig unlogisch.
\ | /
*\ | / \|/ | Aber ich würde gerne ein paar Features (wie gerade Linien) einbauen, könntest du mir einen Tipp geben, wo ich das am besten mache, damit ich nicht alle sourcen durchwühlen muss ? :mrgreen: Ausserdem ... könnte man das doch so machen, dass man nur 2D Objekte nimmt, dann geht das refracting auch besser ... |
Re: RiB - Reflect it Baby
Zitat:
Zitat:
Dann fehlen noch die entsprechenden Elemente für's GUI, aber das sollte dann das kleinste Problem sein denk ich. Zitat:
|
Re: RiB - Reflect it Baby
Ok, ich bin jetzt soweit:
Delphi-Quellcode:
In der GetIntersects-Methodem muss ich eventuelle überschneidungen zurückliefern, oder ?
TLineObj = class(TSceneObject)
protected procedure SetColor(v: TColor32); override; function GetColor: TColor32; override; public Line: TLine; SelPoint: Integer; constructor Create(Owner: TScene; x1, y1, x2, y2: Single; FX: TEffect; Color: TColor32); procedure Draw; override; function GetIntersects(a, b: TFloatPoint): TZS; override; procedure Changed; override; end; constructor TLineObj.Create(Owner: TScene; x1, y1, x2, y2: Single; FX: TEffect; Color: TColor32); begin inherited Create(Owner, FX, Color); Line.a.X := x1; Line.a.Y := y1; Line.b.X := x2; Line.b.Y := y2; Changed; end; procedure TLineObj.Changed; begin Rect.Left := Min (Line.a.X, Line.b.X) - 5; Rect.Right := Max (Line.a.X, Line.b.X) + 5; Rect.Top := Min (Line.a.Y, Line.b.Y) - 5; Rect.Bottom := Max (Line.a.Y, Line.b.Y) + 5; end; procedure TLineObj.Draw; var c: TColor32; begin if isSelected then begin FOwner.FObjectBMP.Canvas.Pen.Color := clRed; FOwner.FObjectBMP.Canvas.Brush.Color := clRed; FOwner.FObjectBMP.Canvas.Rectangle(round(Line.a.X)-4, round(Line.a.Y)-4, round(Line.a.X)+4, round(Line.a.Y)+4); FOwner.FObjectBMP.Canvas.Rectangle(round(Line.b.X)-4, round(Line.b.Y)-4, round(Line.b.X)+4, round(Line.b.Y)+4); end; if isSelected then c := Color32(255,255,255) else c := self.FColor; FOwner.FObjectBMP.LineFS(Line.a.X, Line.a.Y, Line.b.X, Line.b.Y, c); end; procedure TLineObj.SetColor(v: TColor32); begin FColor := v; end; function TLineObj.GetColor: TColor32; begin result := FColor; end; function TLineObj.GetIntersects(a, b: TFloatPoint): TZS; begin // end; (In weiser (?) Vorraussicht auch: ![]() |
Re: RiB - Reflect it Baby
Zitat:
|
Spline mit mehr Punkten????
Hallo dizzy, habe das ray trace programm gesehen und bin begeistert. :thumb:
Ich bin gerade dabei ein Programm zur Rekonstruktion mikroskopischer Schnitte zu schreiben. Dazu brauche ich Splines! In deinem Programm sind die Splines wunderbar implemetiert!!! Allerdings nur Start- und Endpunkt mit zwei Kontrollpunkten. Mir schwebt eine geschlossene Spline Kurve mit beliebig vielen Punkten und zugehörigen Kontrollpukten vor (so ala Freehand, CorellDraw oder Illustrator). Ich frage mich jetzt wie man soetwas implementiert. Momentan benutze ich OpenGL da das automatisch die Kurve rendered . Wenn ich da allerings ein Spline höheren Grades (sagen wir 5) erstelle liegen wieder nur start und enpunkt auf der Linie, die restlichen Punkte sind Kontrollpunkte und "ziehen" die Kurve nur an. Ich brauche aber eine Linie mit beliebig vielen punkten, die jeweils durch Kontrollpunkte kontroliert werden. :gruebel: Hat jemand eine Idee??? |
Re: RiB - Reflect it Baby
Bezier-Splines haben grundsätzlich zur Eigenschaft, dass alle Punkte ausser den Randpunkten keine Durchgangspunkte der Kurve sind (ausser man legt es darauf an, z.B. bei einer Geraden). Es gibt Spline Verfahren, die das ermöglichen, aber man geht in fast jeder Grafik Suite die ich kenne so vor, dass man Bezier-Spline Segmente mit je 4 Kontrollpunkten aneinander stückelt.
Das hat den großen Vorteil, dass die beiden mittleren Punkte mit ihrem jeweiligen am selben Ende liegenden Endpunkt verbunden, die Tangente in den Endpunkten darstellen. Dadurch kann man recht einfach erreichen, dass die Kurve an den Übergangsstellen wirklich weich ist, ja sogar differenzierbar 8). Du musst nur die Tangenten zweier Segmente im Berührungspunkt auf eine Gerade bekommen. Das bietet dann also nicht nur gute Kontrolle über die grobe Form, sondern auch über die Art der "Ecken", bzw. die Ausprägung der Rundung in selbigen. :love: Bezier |
Re: RiB - Reflect it Baby
Splines, die durch Kontrollpunkte verlaufen, lassen sich relativ einfach berechnen. Im Prinzip sind es polynome 3.Grades, die durch die einzelnen Punkte laufen. Betrachten wir drei Punkte P[i-1], P[i] und P[i+1]. Ein Spline durch diese Punkte besteht aus 2 Polynomen. PN1 geht von P[i-1] zu P[i] und PN2 geht von P[i] zu P[i+1].
Die beiden Polynome müssen am Punkt P[i] in ihrer 1. und 2.Ableitung gleich sein, damit keine Stufen entstehen und das Ganze glatt verläuft. Wir wissen also: 1. PN1'(x[i]) = PN2'(x[i]) // gleiche Steigung 2. PN1''(x[i]) = PN2''(x[i]) Ich weiss nicht mehr, wieso, aber ich habe alle Polynome nicht von x[i]...x[i+1], sondern von 0... x[i+1]-x[i] laufen lassen. Damit ergeben sich folgende Bedingungen (sei dx0 = x[i]-x[i-1] und dx1 = x[i-1] - x[i]): 1. PN1[0] = y[i-1] 2. PN2[0] = y[i] 3. PN1[dx0] = y[i] 4. PN2[dx1] = y[i+1] Wir haben nun 6 Gleichungen für 8 unbekannte (2x 4 Koeffizienten für die Polynome). 2 fehlen noch. der nächste Abschnitt liefert uns jedoch die fehlenden 2 Gleichungen (für PN2) und so weiter. Wenn man das Gleichungssystem für alle Punkte in eine Matrix schreibt, erhält man M-2 Gleichungen mit M Unbekannten. Fast fertig. Nun kann man einfach definieren, das PN0"(0) = 0 und PNn"(dxn) = 0, also setzt einfach die 2.Ableitung am ersten Punkt und die am letzten Punkt auf 0. Somit ist das Gleichungsystem vollständig und man kann es mit einfachen Mitteln lösen. Dann erhält man N 4-tupel, die Koeffizienten der Polynome. Kleiner Haken: Die Sache klappt nur bei streng monoton steigenden X-Werten. Um nun beliebige Kurven zu zeichnen, Erstellt man zwei Splines: Eins für die Punkte x[i],z[i] und eins für die Punkte y[i],z[i], wobei z[i] eine streng monoton steigende Hilfsfunktion ist, z.B. der Abstand zwischen den einzelnen Punkten aufsummiert. Abschließend berechnet man die Splines S1 und S2 und trägt die Werte S1 S2 auf. Fertig ist die glatte Kurve. Leider hab ich den Sourcecode nicht auf meinem Laptop, sondern -wenn überhaupt- nur uff Aaabeet. Aber das selbst ich das vor 10-15 Jahren mal hinbekommen habe, schaffst Du das auch: Einfach mal 10 Minuten sacken lassen, Gleichungssystem aufschreiben und lösen (lassen). |
Re: RiB - Reflect it Baby
Hut hab zu dem Teil! :thumb:
Toll, wenn man Mathematik beherrscht... aber das muss man wohl auch in die Wiege gelegt bekommen haben :-( Weiter so! Gruß Pfoto |
Re: RiB - Reflect it Baby
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mein uralter TP-Code. Wer es unter Delphi zum Laufen bringt, kann und sollte es hier auch posten.
[edit] Ich hatte immer ne 3 oder 4 in Mathe. Im Studium bin ich gerade so durch die Prüfung gerauscht. Aber über die Jahre muss man sich mit dem Zeugs nun mal auseinandersetzen. Und so schwer ist das ja nicht.[/edit] |
Re: RiB - Reflect it Baby
Wenn ich das richtig sehe, ist dein Verfahren der Kubischen Interpolation recht ähnlich. Eine recht interessante Seite dazu gibts auch auf
![]() |
Re: RiB - Reflect it Baby
dizzy, ich glaube, ich habe die kubischen Splines aus dem Gedächtnis hergeleitet. Das Verfahren ist mit Sicherheit nicht von mir.
Wenn Du übrigens die Eckpunkte deiner Spline mit den Kontrollpunkten verbindest und von der Strecke den Mittelpunkt nimmst und dann diese Mittelpunkte wieder verbindest und davon die Mitte nimmst und dann wieder und wieder und wieder, dann hast Du ... ... die Bezierkurve. Ganz ohne Polynom oder höhere Mathematik. |
Re: RiB - Reflect it Baby
Das wollt ich ja garnicht untergraben ;). Ich wollt dem Kind nur nen Namen geben, damit Suchende ein Wort haben.
![]() Was die Beziers angeht, muss ich dich aber korrigieren, bzw. ergänzen. Was du beschreibst, ist eher das Corner-Cut Verfahren, wobei da als Teilungsverhältnis idR 1/4 angesetzt wird. Beim Bezier ist der "Trick", dass man das Teilungsverhältnis verschiebt. Der De Casteljau Algo macht genau dies, also Bezierpunkte über dieses Kontruktionsverfahren ermitteln, ohne je die Bezier Summenformeln gesehen zu haben. Lustigerweise wurden dieser Algo und die Bezier Formel nahezu gleichzeitig von 2 Franzosen getrennt entwickelt, ohne dass sie voneinander wussten. Sie haben sogar beide bei konkurrierenden Autoherstellern gearbeitet. Dass beide Verfahren exakt die selbe Kurve beschreiben, hat man erst nachher entdeckt. Find ich irre :stupid: Folglich nimmt man zur Analyse die Formeln, aber auf dem PC eigentlich ausschließlich die grafische Konstruktion (da sie auch weiiiit effizienter im Rechner ist). |
Re: RiB - Reflect it Baby
Zitat:
"RiB it Baby" |
Re: RiB - Reflect it Baby
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Gibt es eigentlich so etwas wie eine maximale Strahllänge? Warum kackt mein PC hierbei (Anhang) nicht in einer (nahezu) Endlosschleife ab? :P |
Re: RiB - Reflect it Baby
In deinem Screenie steht schon die Antwort ;) "Ray-Depth" gibt an, wie oft ein Strahl reflektiert werden darf. Standardeinstellung ist: Nach 32 Reflektionen/Refraktionen hört der Strahl einfach auf.
|
Re: RiB - Reflect it Baby
Wieso wird bei "Ray-Depth" immer gleich der Wert für alle Emitter gesetzt? Das find ich etwas unglücklich.
|
Re: RiB - Reflect it Baby
Liste der Anhänge anzeigen (Anzahl: 1)
Also dein RiB it Baby ^^ hat ein Problem bei einem 90° Spiegel (Also: |<---* : * = Emitter, <--- = Strahl, | = "Spline")...
Und zwar is dann nichts mit refelktieren :P |
Re: RiB - Reflect it Baby
Den gleichen Fehler konnte ich auch feststellen, allerdings auch bei 45°-Winkeln
|
Re: RiB - Reflect it Baby
Wie wäre es, wenn man das speichern könnte :D
PS: Der eine Strahl ist dann irgendwie "weg"... Andere Objekte brechen ihn net mehr (egal wohin) |
Re: RiB - Reflect it Baby
ich hab einen ermitter mit der shift taste und maus nach rechts die strahlen halt so aufgeteilt - dann kam eine fehlernachricht
Zitat:
sonst klasse :thumb: edit selber fehler wenn ich mit der strg taste einen spline nach rechts "gezogen" verschoben habe (bei jedem punkt des splines wie ich gerade merke selebr fehler :( ) edit auch beim bewegen jetzt jeder splines : :lol: das problem wurde nur durch löschen dieses splines gelöst lg |
Re: RiB - Reflect it Baby
Ich muss sagen das Programm macht einem Spaß, es ist echt super gemacht :thumb:
So, ich möchte ein Stück Code aus deinem Quelltext "klauen" bzw. verstehen. Und zwar handelt es sich um die Funktion, dass ein Objekt mit einem Auswahlrahmen umgeben wird wenn man darüber fährt. So wie es aussieht hast du das mit einem Timer gelöst, mir erschließt sich jedoch nicht wie du den Rahmen zeichnest. Hier der Ausschnitt:
Delphi-Quellcode:
procedure TScene.OnStippleTimer(Sender: TObject);
begin if Assigned(FMouseOver) then begin FStippleCount := FStippleCount + 0.4; DrawFrame; Redraw; end else begin DrawFrame; Redraw; FStippleTimer.Enabled := false; end; end; procedure TScene.DrawFrame; var sel, moov: TFloatRect; begin FFrameBMP.Clear(0); FFrameBMP.BeginUpdate; if Assigned(FSelection) then begin sel := FSelection.Rect; FFrameBMP.LineS(round(sel.Left), round(sel.Top), round(sel.Right), round(sel.Top), Color32(0,127,255)); FFrameBMP.LineS(round(sel.Right), round(sel.Top), round(sel.Right), round(sel.Bottom), Color32(0,127,255)); FFrameBMP.LineS(round(sel.Right), round(sel.Bottom), round(sel.Left), round(sel.Bottom), Color32(0,127,255)); FFrameBMP.LineS(round(sel.Left), round(sel.Bottom), round(sel.Left), round(sel.Top), Color32(0,127,255)); end; if Assigned(FMouseOver) then begin moov := FMouseOver.Rect; FFrameBMP.StippleCounter := FStippleCount; FFrameBMP.LineFSP(round(moov.Left), round(moov.Top), round(moov.Right), round(moov.Top)); FFrameBMP.LineFSP(round(moov.Right), round(moov.Top), round(moov.Right), round(moov.Bottom)); FFrameBMP.LineFSP(round(moov.Right), round(moov.Bottom), round(moov.Left), round(moov.Bottom)); FFrameBMP.LineFSP(round(moov.Left), round(moov.Bottom), round(moov.Left), round(moov.Top)); end; FFrameBMP.EndUpdate; end; procedure TScene.Redraw; begin FObjectBMP.DrawTo(Display); FFieldBMP.DrawTo(Display); FFrameBMP.DrawTo(Display); Control.Refresh; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz