AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Béziers beliebigen Grades
Thema durchsuchen
Ansicht
Themen-Optionen

Béziers beliebigen Grades

Ein Thema von Khabarakh · begonnen am 13. Aug 2006 · letzter Beitrag vom 18. Aug 2006
Antwort Antwort
Benutzerbild von Khabarakh
Khabarakh
Registriert seit: 18. Aug 2004
Mal wieder ein etwas kleineres Projekt von mir. Zugegeben, es ist doch etwas größer geworden als anfangs angenommen, aber wenigstens hab ich jetzt ein halbwegs brauchbares Punkte-Rumschieb-Framework .
Sowohl der De Casteljau- als auch der Graham Scan-Algorithmus sind selbst programmiert, also wahrscheinlich nicht gerade die schnellsten .

Noch ein paar Worte zu den Anzeige-Optionen (lest sie durch oder auch nicht ):
  • Kontrollpolygon: Genauer gesagt wird hier die konvexe Hülle des Polygons angezeigt. Diese hat die besondere Eigenschaft, dass die Bézierkurve immer innerhalb von ihr liegt.
  • Teilbéziers: Dies sind alle Bézierkurven, die aus einer Teilmenge der originalen Kontrollpunkte entstehen. Beispielsweise entstünden bei einer Bézierkurve mit vier Kontrollpunkte (= 3. Grades) zwei Teilbéziers 2. Grades (also mit 3 Kontrollpunkten), einmal aus den ersten drei und einmal aus den letzten drei Originalkontrollpunkten. Interessant an diesen Kurven ist, dass sie fast automatisch beim Errechnen der Originalkurve entstehen (siehe auch nächster Punkt).
  • 1. Teilpunkt: Der De Casteljau-Algorithmus halbiert die Kurve immer weiter in zwei weitere Bézierkurven, bis diese so klein sind, dass sie durch eine einfache Strecke ersetzt werden können. Diese Option zeigt die Konstruktionen bis zum ersten Halbieren an. Beim Verschieben des erschienen Punktes auf der ersten Kontrollstrecke erkennt man, dass eine Strecke immer die Bézierkurve tangiert; der Schnittpunkt ist eben dieser 1. Teilpunkt, der die Kurve halbiert. Die restlichen Strecken wiederum (die für die Konstruktion dieser Strecke benötigt werden) sind Tangenten an die Teilbéziers.

Version... ähm, hab immer noch 1.0 eingestellt :
+ Option zum Einfügen des Punktes in nächste Kontrollstrecke


Benötigt wird (mal wieder) das .Net-Framework 2.0
Miniaturansicht angehängter Grafiken
b_zier_206.png  
Angehängte Dateien
Dateityp: zip bezier_160.zip (419,5 KB, 113x aufgerufen)
Moderator in der EE
 
Benutzerbild von Christian S.
Christian S.
 
#2
  Alt 13. Aug 2006, 19:20
Hallo!

Sehr schönes Programm!

Nett fände ich es, wenn man auch Punkte zwischen zwei anderen Punkten einfügen könnte. Wenn man also mit der Maus über einer Verbindungslinie ist und klickt, wird der Punkt zwischen den beiden Punkten, welche die Linie definieren, eingefügt.

Ach ja, kann es sein, dass Du anonyme Methoden magst?

Grüße
Christian
Christian S.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh
 
#3
  Alt 18. Aug 2006, 22:03
Erst einmal: Vielen Dank !

Über das Einfügen der Punkte hatte ich mir ebenfalls schon Gedanken gemacht, aber für so eine kleine Demoanwendung, mit der man nicht wirklich Formen konstruieren kann (dazu bräuchte es noch die Möglichkeit zur Erstellung mehrerer getrennte Béziers), als unwichtig abgetan. Als du das Thema jedoch wieder erwähnt hast, habe ich die Nichtexistenz eines Ansatze in meinem Kopf bemerkt, wie man die Punkte überhaupt dynamisch in die Kurve einfügen könnte. Was das Thema sofort wieder interessanter machte .

Mindestens fünfmal während der Entwicklung umgeworfen sieht mein finales Konzept, mit dem ich endlich zufrieden bin, so aus:
Zuerst werden die dem Cursor am nächsten liegende Strecke und der nächstliegende Punkt ermittelt. Zum Punkt gibt es nicht viel zu sagen, zur Strecke soviel:
Der Abstand eines Punktes A zu einer Strecke OB errechnet sich aus der Länge der Lotstrecke des Ersteren auf Letztere. Nun muss erst einmal bestimmt werden, ob der Lotfußpunkt überhaupt Element der Strecke ist:

Länge des Lots:


Sollte der Streckenabstand kleiner als der zum nächsten Punkt sein, wird der Punkt in diese Strecke eingefügt. Ansonsten gehts mit einer Fallunterscheidung weiter:
Sollte der nächste Punkt der erste/letzte Kontrollpunkt sein, wird der neue Punkt der erste bzw. letzte. Ansonsten wird er in die nächste Strecke eingefügt, mathematisch gesehen ist es von den zwei Strecken, die am nächsten Punkt enden, die Strecke mit dem längsten Lot.

Tja, eigentlich sollte jetzt noch das Feature dazukommen, den Punkt direkt nach dem Hinzufügen umherzuziehen und ihn dabei "Just in Time" in andere Strecken einfügen zu können. Die Idee wurde leider von 20 Garbage Collections pro Sekunde zunichte gemacht. Ich weiß zwar, wo sie geschehen (nämlich beim Verschieben des Punktes per List<T>.RemoveAt + Insert), allerdings fallen weder Dax noch mir eine sinnvolle Ursache für diese GCs ein, da das Ganze auch ohne jegliche Allocations möglich sein müsste.
Zitat von Christian S.:
Ach ja, kann es sein, dass Du anonyme Methoden magst?
Könnte sein . Da fällt das Benennen nicht so schwer *g* .
Sebastian
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:09 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