Registriert seit: 23. Jan 2008
3.686 Beiträge
Delphi 2007 Enterprise
|
AW: Punkt in Polygon einfügen
26. Okt 2011, 15:32
Der einfache Weg:
Ermittle die 2 benachbarten bestehenden Kontrollpunkte, deren addierter Abstand zum Cursor am kleinsten ist, und füge zwischen diesen ein.
Der bessere Weg:
Berechne den Abstand vom Cursor zu allen Strecken, die man zwischen benachbarte Kontrollpunkte ziehen könnte. Die Punkte der Strecke mit dem geringsten Abstand sind deine Kandidaten.
Der korrekte Weg:
Berechne den Abstand der Splines zwischen allen Punktpaaren zum Cursor, und dann weiter wie beim besseren Weg. Problem: Punkt-Spline-Abstände sind nicht ganz so trivial.
Der einfache korrekte Weg:
Puffer alle Punkte, die zum Zeichnen der Splines berechnet werden in einer Liste, und füge ihnen einen Index hinzu, zu welchem Punktepaar sie jeweils gehören. (Geht trivial aus der Zeichenroutine hervor.) Suche aus diesen den dem Cursor am nächsten liegenden, und dessen Index gibt dir die 2 Kandidaten an Kontrollpunkten. Der Tradeoff: Die komplizierte Berechnung wird durch eine LUT bereits berechneter Splinepunkte ersetzt, der Verlust an Genauigkeit ist meist kaum merkbar, da diese zum Zeichnen meist schon in ausreichend genauer Auflösung erzeugt sind. Dafür braucht's aber etwas mehr Speicher, und die paarweise Abstandsberechnung kann langsamer werden als die Spline-Punkt-Abstandsrechnung - je nach deren Implementierung, Anzahl der Kontrollpunkte und Anzahl der Zeichenpunkte.
Ein Vorteil: Der verwendete Splinetyp ist für die Abstandsberechnung nicht mehr wichtig. Geht mit allen.
Gerade wenn man sehr "ausstülpende" Kurven berüksichtigen will, kommt man um einen der letzten 2 Wege kaum herum. Bei beiden lässt sich zudem approximieren, wo der neue Kontrollpunkt (koordinatenmäßig) einzufügen wäre, um auf der bestehenden Kurve zu landen (ggf. wünschenswert).
Es ist ggf. auch sinnvoll einen maximalen minimalen Abstand zu setzen, ab dem tatsächlich ein neuer Punkt eingefügt wird. (Lies: Wenn man zu weit weg von "irgendwo am Rand" der Kurve klickt, dann kein neuer Punkt, weil potenziell nicht offensichtlich wo der dann landen würde.)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
Geändert von Medium (26. Okt 2011 um 15:38 Uhr)
|