2010-09-03 4 views
2

J'ai un chemin qui est composé de plusieurs points - par exemple 0,0 0,50 50,50 70,20Algorithme de courbes de Bézier - peut-être des cannelures canoniques?

Si je dessine juste cette ligne sur l'écran, il semble assez dur car il met un angle vif à la jonction de chaque point.

Par conséquent, je me demandais à quoi ressembleraient l'algorithme/la méthode des courbes de Bézier que je pourrais appeler pour changer automatiquement les angles vifs en courbes «serrées»?

Je ne voudrais pas que la courbe soit trop grande ou qu'elle affecte généralement la chute du chemin principal, adoucissez simplement la jonction. Si vous jetez un oeil à ci-dessous voici un échantillon rapide que j'ai mis ensemble. La ligne à gauche est ce que j'ai maintenant, celle du milieu est la ligne que je veux.

L'image sur la droite représente ce que je pense que j'ai besoin de l'algorithme à faire. Essentiellement, j'ajoute un point supplémentaire à chaque arc qui constitue la jointure à un point éloigné de 10% de la jointure, puis je supprime le point de jointure et j'ajuste les poignées pour qu'elles soient là où le point était (pas dans le diagramme sont légèrement séparés, c'est juste pour que vous puissiez voir). C'est ce que je dois être capable de faire.

alt text

Répondre

3

Er .... il suffit d'ajouter un BezierSegment à votre PathSegmentCollection.

+0

Merci ... mais je pense que vous avez manqué le point de la question ... je besoin d'un algorithme qui fonctionne comment faire. Je savais d'avance que j'avais besoin d'un BézierSegment mais c'est le calcul et l'algorithme. –

+0

Alors qu'est-ce que vous voulez faire? Calculer les points d'ancrage? Ou dessiner la spline? Attention, il y a des maths très sérieux impliqués dans le dessin des splines;) –

+0

Eh bien je suppose que ses deux parties ... l'une calcule les splines en fonction d'une liste de points qui alimentent et la seconde est en virant le résultat et dessine le ligne. Notez, s'il y a un composant qui fera ceci pour moi je suis plus qu'heureux pour cela, faites le moi savoir mais je n'ai pas pu trouver encore un. –

1

Vous devez donc identifier 2 points supplémentaires par point de "coin". Un "coin" point étant n'importe quel point intérieur le long du chemin.

Voici un début:

public List<Point> AddControlPoints(List<Point> path) 
{ 
    // arbitrary minimum length to use to make a corner 
    double segmentLengthThreshold = 10.0; 
    double cornerDistance = 2.0; 

    if (path.Count < 3) return path.ToList(); // arbitrarily a copy 

    var newPath = new List<Point>(); 
    newPath.Add(path[0]); 
    for (int ii = 1; ii < path.Count - 1; ii += 2) 
    { 
     // walk each "corner" point and do line interpolation for the point 
     double m = (path[ii].Y - path[ii-1].Y)/(path[ii].X - path[ii-1].X); 
     double b = (path[ii].Y - m * path[ii].X); 

     // above we setup the equation to move along the line 
     // find the new X value and move along it 
     double xi = path[ii].X - cornerDistance/m; 
     newPath.Add(new Point(xi, m * xi + b)); 
     newPath.Add(path[ii]); 

     // repeat for the next side 
     m = (path[ii+1].Y - path[ii].Y)/(path[ii+1].X - path[ii].X); 
     b = (path[ii].Y - m * path[ii].X); 

     xi = path[ii].X + cornerDistance/m; 
     newPath.Add(new Point(xi, m * xi + b)); 

     // this will likely fail in many ways, 0 slopes etc 
     // but throwing the equations some test values shows it makes 
     // decent control points. If you'd like them to be length based 
     // just find the distance of the two points and multiply by a 
     // factor 
    } 

    return newPath; 
} 
+0

Ok c'est génial ... Je pense que c'est juste dans le sens de ce que je cherche. Avec ceci, je peux enlever le point d'angle si je veux, mais j'ajouterais dans les "Splines" (je pense que c'est la terminologie correcte) de sorte que l'ancre des noeuds de chaque côté du point d'angle soit réglée à l'endroit du point d'angle. Voir l'image la plus à droite dans l'exemple que j'ai fourni pour voir le résultat final de la configuration des splines. –

Questions connexes