Calculer la valeur de T cubique de Bézier où la tangente est perpendiculaire à la ligne d'ancre

StackOverflow https://stackoverflow.com/questions/2672740

  •  28-09-2019
  •  | 
  •  

Question

Projet de Bézier cubique p1, p2, p3, p4 sur la ligne p1, p4. Lorsque P2 ou P3 ne dépasse pas sur le segment de ligne entre p1 et p4, la courbe se bomber à partir des points d'ancrage. Est-il possible de calculer la valeur de T, où la tangente de la courbe est perpendiculaire à la ligne d'ancrage?

Cela pourrait aussi être indiqué que de trouver les valeurs de T, où la courbe projetée le plus éloigné du centre du segment de ligne p1, p4. Quand p2 et p3 projet sur le segment de ligne, puis les solutions sont respectivement 0 et 1. Y at-il une équation pour résoudre le cas le plus intéressant?

La valeur de T semble dépendre seulement de la distance des points de contrôle mis en correspondance à partir du segment de ligne d'ancrage.

Je peux déterminer la valeur par le raffinage des suppositions, mais j'espère qu'il ya une meilleure façon.

Edit:

A partir de p1, .., p4 en 2D avec des valeurs x1, y1, ..., x4, y4 J'utilise le code suivant en fonction de la réponse de 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 );

Dans l'exemple que je regardais, t2 a dû être soustrait de 1,0 avant qu'il ne soit correct.

Était-ce utile?

La solution

Supposons que vous avez obtenu une courbe Bézier 1D cubique avec P0 = 0 et P3 = 1 alors la courbe est:

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

Où sont les bi,3(t) Bernstein polynômes de degré 3. Ensuite, nous sommes à la recherche de la valeur de t où cette P(t) est minimale et maximale, donc nous obtenons:

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

a une forme fermée, mais la solution triviale. Selon WolframAlpha, quand il est 3P1 - 3P2 +1 != 0:

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

Dans le cas contraire, il est:

t = 3P1 / (6P1 - 2)

Pour un cube à n dimensions générales Bézier P0 *, P1 *, P2 *, P3 * calcul:

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

proj(P, P03*) est la distance signée par P0* au point P projeté sur la ligne passant par P0* et P3*.

(je n'ai pas vérifié cela, veuillez confirmer il est faux de rien dans mon raisonnement.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top