Ich habe eine Bezierkurve B mit den Punkten S, C1, C2, E und eine positive Zahl w, die die Breite darstellt. Gibt es einen Weg, die Kontrollpunkte von zwei Bezierkurven B1, B2 schnell zu berechnen, so dass das Zeug zwischen B1 und B2 der durch B & lt; / p> dargestellte verbreiterte Weg ist
Formal: Berechne die Kontrollpunkte von guten Bezier-Approximationen zu B1, B2, wo
B1 = {(x, y) + N (x, y) (w / 2) | (x, y) in C}
B2 = {(x, y) - N (x, y) (w / 2) | (x, y) in C},
wo N (x, y) ist die Normale
von C bei (x, y).
Ich sage gute Annäherungen, weil B1, B2 keine Polynomkurven sein könnten (ich bin mir nicht sicher, ob sie das sind).
Die exakte Parallele einer Bezier-Kurve ist mathematisch ziemlich hässlich (sie erfordert Polynome 10. Grades).
Es ist einfach, eine Aufweitung aus einer polygonalen Approximation des Beziers zu berechnen (das heißt, Sie berechnen Liniensegmente aus dem Bezier und verschieben dann die Punkte entlang der Normalen auf den beiden Seiten der Kurve).
Dies liefert gute Ergebnisse, wenn Ihre Dicke nicht zu groß im Vergleich zur Krümmung ist ... eine "ferne Parallele" ist stattdessen ein Monster für sich (und es ist nicht einfach, eine Definition dessen zu finden, was eine Parallele von ist eine offene Kurve, die jeden glücklich machen würde.)
Sobald Sie zwei Polylinien für die zwei Seiten haben, können Sie für diese Pfade eine am besten angenäherte Bezierstelle finden, wenn Sie diese Darstellung benötigen. Wieder einmal denke ich, dass für "normale Fälle" (das sind ziemlich dünne Linien) sogar nur ein einzelner Bezierbogen für jede der beiden Seiten ziemlich genau sein sollte (der Fehler sollte viel kleiner sein als die Dicke der Linie). p>
BEARBEITEN : Die Verwendung eines einzelnen Bezier-Bogens sieht viel schlimmer aus, als ich es selbst für vernünftige Fälle erwartet hätte. Ich habe auch versucht, zwei Bezierbögen für jede Seite zu verwenden und das Ergebnis ist besser, aber immer noch nicht perfekt. Der Fehler ist natürlich viel kleiner als die Dicke der Linie. Wenn die Linien nicht sehr dick sind, könnte es eine vernünftige Option sein. Im folgenden Bild ist eine verdickte Bézier (mit Punktverdickung), eine Approximation mit einem Bezierbogen für jede Seite und eine Approximation mit zwei Bezierbögen für jede Seite dargestellt.
EDIT 2 : Wie gewünscht, füge ich den Code hinzu, mit dem ich die Bilder erhalten habe; Es ist in Python und erfordert nur Qt. Dieser Code sollte nicht von anderen gelesen werden, also habe ich einige Tricks benutzt, die ich wahrscheinlich nicht in echtem Produktionscode verwenden würde. Der Algorithmus ist auch sehr ineffizient, aber mir war die Geschwindigkeit egal (das sollte ein One-Shot-Programm sein, um zu sehen, ob die Idee funktioniert).
%Vor%