2010-10-28 3 views
1

J'ai posté une question précédente sur la génération d'une courbe de Bézier basée uniquement sur les points de début et de fin, et j'ai pu grâce aux réponses créer une courbe de Bézier en utilisant les informations que j'ai.Comment retourner tous les points le long d'une courbe de Bézier?

Ceci est le code qui me permet de dessiner les types de courbes que je veux sur un formulaire.

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) 
{ 
    Random rnd = new Random(); 
    Point startp = new Point(rnd.Next(0, this.Width), rnd.Next(0, this.Height)); 
    Point endp = new Point(rnd.Next(0, this.Width), rnd.Next(0, this.Height)); 
    int xMod = 0; 
    int yMod = 0; 
    if (startp.X > endp.X) { 
     xMod = -1; 
    } else { 
     xMod = 1; 
    } 
    if (startp.Y > endp.Y) { 
     yMod = 1; 
    } else { 
     yMod = -1; 
    } 
    Point control1p = new Point(endp.X + (rnd.Next(20, 50) * xMod), endp.Y + (rnd.Next(20, 50) * yMod)); 
    Point control2p = new Point(endp.X + (rnd.Next(5, 20) * xMod), endp.Y + (rnd.Next(5, 20) * yMod)); 
    Point[] pts = { 
     startp, 
     control1p, 
     control2p, 
     endp 
    }; 
    Pen dashed_pen = new Pen(Color.Black, 0); 
    dashed_pen.DashStyle = Drawing2D.DashStyle.Dash; 
    for (int i = 0; i <= 2; i++) { 
     e.Graphics.DrawLine(dashed_pen, pts(i), pts(i + 1)); 
    } 
    e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality; 
    Pen bez_pen = new Pen(Color.Black, 3); 
    e.Graphics.DrawBezier(bez_pen, pts(0), pts(1), pts(2), pts(3)) 
} 

Y at-il un moyen, ou quelqu'un peut-il m'aider à retourner tous les points qui forment la courbe? Je voudrais que chaque point d'une courbe calculé à partir de ces points soit retourné dans un tableau de points, mais je n'ai aucune chance de le trouver, et je n'ai pas été capable de trouver une solution similaire sur stackoverflow ou google in général.

Merci.

+0

Veuillez ne pas utiliser d'étiquettes dans l'en-tête. –

Répondre

2

Qu'est-ce que vous voulez faire est de convertir une courbe Bézier (cubique de l'apparence de celui-ci) dans un Polyline

Utilisez l'équation sur cette page ... Valeur de t devrait être entre 0 to 1 ... Calculer toutes les valeurs de Bx(t) et By(t) en utilisant l'équation pour les valeurs de t par incréments de "0, 0.01, 0.02....1" (Convertissez-les en integers bien sûr) Plus vos incréments sont petits, plus vos points seront précis.

Voici un échantillon C du DeCasteljau Algorithm (presque la même procédure, mais son je crois un peu Optimized) :)

1

algorithme parfait pour créer la courbe de Bézier lisse avec un nombre optimal de points est décrit par Maxim Shemanarev sur Anti Géométrie du grain page: Adaptive Subdivision of Bezier Curves.

0

Il peut être utile si vous utilisez un dérivé de lerp ou de float t entre les bezier. J'ai trouvé que cela aide à la précision; compte tenu du nombre de calcats flottants.

Questions connexes