Frage

Projekt eine kubische Bezier-P1, P2, P3, P4 auf die Linie p1, p4. Wenn P2 oder P3 nicht auf das Liniensegment zwischen p1 und p4 projiziert, wird die Kurve von den Ankerpunkten ausbeulen. Gibt es eine Möglichkeit, den T-Wert, wo die Tangente der Kurve senkrecht zur Ankerlinie zu berechnen?

Dies könnte auch als Suche nach den T-Werten angegeben werden, wo die projizierte Kurve am weitesten von der Mitte des Liniensegment p1, p4. Wenn p2 und p3 Projekt auf das Liniensegment, dann sind die Lösungen 0 bzw. 1. Gibt es eine Gleichung, die den interessanten Falles für die Lösung?

Der T-Wert scheint nur von der Entfernung der abgebildeten Kontrollpunkt von dem Ankerliniensegment abhängig zu sein.

Ich kann den Wert bestimmen, indem Vermutungen zu verfeinern, aber ich hoffe, es gibt einen besseren Weg.

Edit:

Beginnend mit p1, .., p4 in 2d mit Werten x1, y1, ..., x4, y4 Ich verwende den folgenden Code auf der Grundlage der Antwort von Philippe:

dx = x4 - x1;
dy = y4 - y1;
d2 = dx*dx + dy*dy;
p1 = ( (x2-x1)*dx + (y2-y1)*dy ) / d2;
p2 = ( (x3-x1)*dx + (y3-y1)*dy ) / d2;
tr = sqrt( p1*p1 - p1*p2 - p1 + p2*p2 );
t1 = ( 2*p1 - p2 - tr ) / ( 3*p1 - 3*p2 + 1 );
t2 = ( 2*p1 - p2 + tr ) / ( 3*p1 - 3*p2 + 1 );

In der Probe ich sah, t2 hatte von 1,0 abgezogen werden, bevor es richtig war.

War es hilfreich?

Lösung

Nehmen wir an, Sie haben ein 1D kubische Bézier-Kurve mit P0 = 0 und P3 = 1 dann die Kurve:

P(t) = b0,3(t)*0 + b1,3(t)*P1 + b2,3(t)*P2 + b3,3(t)*1

Wo bi,3(t) sind die Bernstein-Polynome vom Grad 3. Dann suchen wir die Wert von t wo diese P(t) minimal und maximal ist, so dass wir ableiten:

P'(t) = b1,3'(t)*P1 + b2,3'(t)*P2 + b3,3'(t)
      = (3 - 12t + 9t^2)*P1 + (6t - 9t^2)*P2 + 3t^2
      = 0

Dies hat eine geschlossene Form, aber nicht triviale Lösung. Nach Wolframalpha, wenn 3P1 - 3P2 +1 != 0 es ist:

t = [2*P1 - P2 +/- sqrt(P1^2-P1*P2-P1+P2^2)] / (3*P1 - 3*P2 + 1)

Ansonsten ist es:

t = 3P1 / (6P1 - 2)

Für einen allgemeinen n-dimensionale kubischen Bezier-P0 *, P1 *, P2 *, P3 * berechnen:

P1 = proj(P1*, P03*) / |P3* - P0*|
P2 = proj(P2*, P03*) / |P3* - P0*|

Wo proj(P, P03*) ist der unterzeichnete Abstand von P0* bis zu dem Punkt P projizierte auf den Geraden durch P0* und P3* vorbei.

(Ich habe nicht geprüft, so bitte bestätigen es ist nichts falsch in meiner Argumentation.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top