Liniensegmente einfügen zwischen 2 Punkten
-
Guten Morgen!
Ich habe folgendes Szenario:
- Zwei 2D-Punkte (P1 und P2)
- An jedem der zwei Punkte habe ich einen Richtungsvektor (d1 und d2).
Hier dazu eine Skizze:
http://picload.org/view/cwgdwgg/curvedconnector.png.htmlIch möchte nun (in C++) zwischen P1 und P2 Liniensegmente einfügen (also eigentlich nur Punkte), die von P1 nach P2 einen einigermaßen "weichen" Verlauf haben. Also eine Art Kurve aus Liniensegmenten von P1 nach P2.
Hat da jemand eine Idee für einen Ansatz, wie ich die Koordinaten der Punkte errechnen könnte?
Danke!
-
Welche Rollen sollen die beiden Richtungsvektoren dabei spielen? Da steht aktuell nur, dass Du sie hast, aber niht was sie mit der akurve am Schluss zu tun haben sollen.
-
Jester schrieb:
Welche Rollen sollen die beiden Richtungsvektoren dabei spielen? Da steht aktuell nur, dass Du sie hast, aber niht was sie mit der akurve am Schluss zu tun haben sollen.
Nun ja, die 2 Punkte sind die Endpunkte zweier längerer Liniensegment-Listen und die Richtungsvektoren zeigen die Richtung der letzten 2 Liniensegmente. Es wäre schon wichtig, dass die erzeugte "Kurve" am Anfang und Ende in etwa die Richtung der Endpunkte hat.
-
Dann würde ich es mit Bezierkurven versuchen; du könntest die beiden Geraden, die durch die Punkte und die Richtungen definiert werden miteinander schneiden und dort den Kontrollpunkt einer quadratischen Bezierkurve hinlegen. Siehe [url]http://de.wikipedia.org/wiki/Bézierkurve#Quadratische_B.C3.A9zierkurven_.28n.3D2.29[/url] für ein Beispiel. Mit den entsprechenden Bernsteinpolynomen ist es auch recht einfach die Kurve zu samplen.
Wenn Du auch S-förmige Verbindungskurven brauchst, musst Du eventuell kubische Beziersplines nehmen. Dann ist natürlich die Frage wo man da am besten die Kontrollpunkte hinlegt.
-
Jester schrieb:
Dann würde ich es mit Bezierkurven versuchen; du könntest die beiden Geraden, die durch die Punkte und die Richtungen definiert werden miteinander schneiden und dort den Kontrollpunkt einer quadratischen Bezierkurve hinlegen. Siehe [url]http://de.wikipedia.org/wiki/Bézierkurve#Quadratische_B.C3.A9zierkurven_.28n.3D2.29[/url] für ein Beispiel. Mit den entsprechenden Bernsteinpolynomen ist es auch recht einfach die Kurve zu samplen.
Wenn Du auch S-förmige Verbindungskurven brauchst, musst Du eventuell kubische Beziersplines nehmen. Dann ist natürlich die Frage wo man da am besten die Kontrollpunkte hinlegt.
Danke für die Antwort!
Mein 1. Ansatz war sogar mit Splines: Ich habe aus den 4 Eingangsdaten eine Hermite-Spline gelegt. Nur leider war das Ergebnis nahezu eine Gerade zwischen P1 und P2. Ich glaube das Problem war, dass die "Tangentenvektoren" d1 und d2 bei mir normalisiert sind. Deren Länge hat bei Hermite Splines wohl Einfluss auf die Kurve.
Das Problem ist nur, dass ich ja nicht weiß um wieviel ich d1 und d2 strecken muss, damit die Kurve gut aussieht. Manuell per Auge seh ich das sofort, aber das programmieren ist schwierig.
-
Deswegen schlug ich ja vor, die beiden Geraden, die jeweils durch einen Punkt und den zugehörigen Richtungsvektor definiert sind, miteinander zu schneiden und dort den Kontrollpunkt einer quadratischen Bezierkurve zu platzieren. Ob das gut aussieht musst Du dann natürlich selber entscheiden. Wenn Du kubische Bezierkurven nimmst, hast Du halt wieder das Problem, dass Du die Länge selber einstellen musst (aber auch darfst). Aber vielleicht genügen ja quadratische Splines und Du brauchst den zusätzlichen Freiheitsgrad gar nicht?