2010-10-27 32 views
1

J'ai d'abord posté une question beaucoup plus simple (et moins utile), et j'ai modifié cela pour être plus précis.Comment calculer une courbe de Bézier avec seulement des points de début et de fin?

Cette animation de wikipedia montre à la base ce que je veux accomplir, cependant - j'espère le faire tourner, où il commence à progresser vers la destination et "up" (dans cette image), puis arcs plus directement au point final. Cependant, je n'ai accès qu'à un point de départ et à un point final, ce que j'espère faire est de pouvoir déterminer les autres points en spécifiant une "hauteur" (ou largeur, peu importe comment vous voulez l'appeler), pour déterminer la hauteur l'arc va réellement. http://en.wikipedia.org/wiki/File:Bezier_3_big.png

Je voudrais être en mesure d'appeler une fonction avec les points de début et de fin et une hauteur, et lui faire retourner tous les points sur le chemin de la courbe .

Aide ou direction serait appréciée.

+0

C'est une question mathématique plus qu'une C# .net. http://maths.stackoverflow.com: D –

+0

Cherchez-vous à dessiner une courbe? –

+0

son http://mathoverflow.net/ – Cipi

Répondre

1

Sans perte de généralité, supposons que le point final se trouve sur l'axe des x et que le point de départ se trouve au-dessus et à gauche du point final.Imaginez que le point de départ se trouve au sommet d'une falaise et que le point d'arrivée se trouve au bas d'une falaise. Imaginez que vous lancez une balle horizontalement depuis le point de départ, de sorte que la gravité la tire vers le bas de sorte qu'elle se trouve exactement dans le point final.

Cette courbe semble avoir les propriétés que vous voulez. Il commence peu profond et augmente ensuite vers la verticale lorsque la balle accélère.

En changeant l'angle auquel vous lancez la balle au début, vous pouvez rendre la courbe plus superficielle au début. En changeant la force de la gravité, vous pouvez le rendre plus raide à la fin.

Est-ce que cette courbe correspond à vos besoins? Trouver cette courbe est un problème de physique assez basique.

+0

Cette courbe correspond exactement à mes besoins. J'ai trouvé plusieurs exemples qui se rapportent aux courbes de Bézier, mais mon problème est seulement d'avoir un point de départ et de fin. Je ne suis pas sûr s'il y a un moyen de calculer les autres points nécessaires de seulement ces deux pour obtenir le type de courbe désiré. –

+0

@FrustratedGuy Généralement, vous avez besoin de 4 points minimum pour une courbe de Bézier. Puisque vous connaissez votre forme, vous pouvez calculer l'emplacement des deux points de contrôle p1, p2. P1 repose sur la tangente avec le point de départ P0 et votre «hauteur» détermine la distance à P0 le long de la tangente. P2 est un calcul similaire. La fonction B (t) où t est la variable temporelle ressemblerait à: B (t) = (1 - t)^3 x P0 + 3t x (1-t)^2 x P1 + 3t^2 x (1-t) x P2 + t^3 x P3. – MandoMando

+0

@Frustrated Guy: @MandoMando a raison; vous allez avoir besoin d'au moins quatre paramètres pour définir votre courbe. Dans mon exemple, les quatre paramètres sont les deux extrémités, l'angle initial et la force de gravité. –

0

A part pour le démarrage point et le point final, vous devez décrire le « angle » ou la courbure de l'arc. Une courbe de Bézier peut être bonne mais elle est généralement implémentée avec des séquences de points plus longues (la courbure de l'arc étant définie par les autres points de la ligne). Jetez un oeil à http://en.wikipedia.org/wiki/B%C3%A9zier_curve, en bas, vous pouvez trouver des informations sur les "courbes quadratiques". Je parie qu'une recherche google rapide vous donnera quelques exemples de mise en œuvre.

0

Vous voulez essentiellement une courbe de Bézier avec trois points de contrôle - le point de départ, le point final et un autre point quelque part entre les deux.

Si le point de départ 1 est (x1, y1) et le point final 2 est (x2, y2), le vecteur du point 1 au point 2 est (dx = x2-x1, dy = y2-y1).

Un point le long de la ligne d'un montant along entre zéro et un est (x1 + along * dx, y1 + along * dy).

Le vecteur (-dy, dx) est perpendiculaire à la ligne, donc si vous voulez quitter la ligne d'un montant above, le point central sera (x1 + along * dx - above * dy, y1 + along * dy + above * dx). Variez les valeurs de long et de haut jusqu'à ce que vous trouviez le type de courbe asymétrique souhaité.

2

J'ai enveloppé un blog pour le calcul de la courbe de Bézier Angle et de déterminer ses différents points dans mon blog http://johnexalt.wordpress.com/2011/05/21/bezier-curve-angle-calculation-silverlight/

le code ci-dessous montre comment calculer les points de la courbe de Bézier à une valeur donnée de t (où les plages t de 0 à 100% et est représenté en 0-1.

x = ((1 - t) * (1 - t) * p0.X) + (2 * t * (1 - t) * p1. X) + (t * t * p2.X). // cette instruction est utilisée pour déterminer la coordonnée x de la courbe

y = ((1 - t) * (1 - t) * p0.Y) + (2 * t * (1 - t) * p1.Y) + (t * t * p2.Y); 
//this statement is used to determine the y coordinate of the curve. 

x = Math.Round(x, 3); 
y = Math.Round(y, 3); 
angle = Math.Round(Angle(xold, yold, x, y), 3); 

Il y avait un article précédent donné par Carlos Femmer qui aide dans le calcul de l'angle entre 2 points. http://www.carlosfemmer.com/post/2006/02/Calculate-Angle-between-2-points-using-C.aspx.