2010-04-20 10 views
1

Projetez un bezier cubique p1, p2, p3, p4 sur la ligne p1, p4. Lorsque p2 ou p3 ne se projette pas sur le segment de droite entre p1 et p4, la courbe va bomber à partir des points d'ancrage. Existe-t-il un moyen de calculer la valeur T lorsque la tangente de la courbe est perpendiculaire à la ligne d'ancrage? Cela peut également être indiqué comme trouvant les valeurs T où la courbe projetée est la plus éloignée du centre du segment de ligne p1, p4. Lorsque p2 et p3 projettent sur le segment de droite, les solutions sont respectivement 0 et 1. Existe-t-il une équation pour résoudre le cas le plus intéressant?Calculer la valeur du bezier T cubique où la tangente est perpendiculaire à la ligne d'ancrage

La valeur T ne semble dépendre que de la distance entre les points de contrôle mappés et le segment de ligne d'ancrage.

Je peux déterminer la valeur en raffinant des suppositions, mais j'espère qu'il y a 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'échantillon que j'ai regardé, t2 a dû être soustrait de 1.0 avant d'être correct.

+0

Vous pouvez également essayer http://mathoverflow.net/ –

Répondre

1

Supposons que vous avez obtenu une courbe de Bézier cubique 1D 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 

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

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 

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

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

Sinon, il est:

t = 3P1/(6P1 - 2) 

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

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

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

(je n'ai pas vérifié cela, donc s'il vous plaît confirmer qu'il n'y a rien de mal dans mon raisonnement.)

+0

sqrt (... P2 * 2) devrait be P2^2 – drawnonward

+0

Merci, cela fonctionne comme prévu. Lorsque vous obtenez deux valeurs valides du +/- le résultat + doit être soustrait de 1.0 dans mes essais. C'est peut-être l'inverse parfois. – drawnonward

+0

Cela pourrait provenir de la façon dont vous calculez 'proj()'. Il doit être la distance signée de «P0 *», ce qui signifie que s'il projette sur le côté de «P0 *» loin de «P3 *», il devrait être négatif. –