2016-05-21 2 views
0

J'ai un problème d'écriture de la fonction beizer. J'ai écrit un simple code en C#:Comment créer un stylo pour que la courbe se déroule correctement à l'aide de la fonction beizer

public static PointF[] BeizerFunction (int interval, PointF point0, PointF point1, PointF point2) { 
     //x = (1 - t) * (1 - t) * p[0].x + 2 * (1 - t) * t * p[1].x + t * t * p[2].x; 
     //y = (1 - t) * (1 - t) * p[0].y + 2 * (1 - t) * t * p[1].y + t * t * p[2].y; 
     var Points = new PointF[interval]; 
     var time = 1.0f/(float) interval; 

     for (var i=0; i<Points.Length; i++) { 
      var point = Points [i]; 

      point = new PointF(); 
      point.X = (1 - time) * (1 - time) * point0.X 
       + 2 * (1 - time) * time * point1.X 
       + time * time * point2.X; 
      point.Y = (1 - time) * (1 - time) * point0.Y 
       + 2 * (1 - time) * time * point1.Y 
       + time * time * point2.Y; 

      Points [i] = point; 
      time ++; 
     } 

     return Points; 
    } 

Par l'application est d'écouter déplacement de la souris, donc je suppose que le pointeur de la souris serait les points de contrôle pour cette fonction. Le code ci-dessus, s'il est correct, devrait me donner une courbe de beverage de trois points.

En réalité, il y a plusieurs courbes donc il y aurait plus de 3 points. Pour rejoindre la courbe de beize ensemble, je fais quelque chose comme ça.

Bezier(p0.5, p1, p1.5); 
Bezier(p1.5, p2, p2.5); 
Bezier(p2.5, p3, p3.5); 

Le code C# pour dessiner seulement 3 points est ce

var p0 = new PointF (50, 50); 
     var p1 = new PointF (100, 100); 
     var p2 = new PointF (150, 50); 

     var points = QuadraticBezierFunction.BeizerFunction (100, p0, p1, p2); 

     for (var i=0; points != null && i<points.Length-1; i=i+1) 
      canvas.DrawLine (points[i].X, points[i].Y, points[i+1].X, points[i+1].Y, new Android.Graphics.Paint()); 

Lorsque je tente de tracer la courbe, il ne semble pas une courbe.

+0

Que vous ciblez: Winforms, WPF, ASP ..? __Always__ étiquote correctement ta question! - En outre: J'espère que vous n'utilisez pas __all__ ces nombreux points que vous obtenez de mousemove pour construire une courbe bezier, comme le point entier (ou un principal) est que vous n'avez besoin que de ___très peu__ pour créer de belles courbes. – TaW

+0

n'utilisez pas BEZIER quadratique mais cubique à la place (4 points de contrôle). Le BEZIER quadratique (3 points de contrôle) est vraiment difficile à joindre avec des résultats agréables (vous aurez besoin d'ajustement). Avec les cubics, vous n'avez pas besoin d'utiliser les points dans le bon ordre. Voir http://stackoverflow.com/a/30438865/2521214 aussi je pense que c'est votre but http://stackoverflow.com/a/30750626/2521214 – Spektre

+0

Merci Spektre. Voulez-vous dire avec Cubics j'ai seulement besoin d'appliquer quelque chose comme ceci: Cubique (p0, p1, p2, p3) puis cubique (p3, p4, p5, p6). Désolé ma compréhension des mathématiques est assez limitée. – LittleFunny

Répondre

1

Selon l'observation de @ fang, n'utilisez pas time ++; car vous ne voulez pas passer de 0.xyz à 1.xyz, vous voulez incrémenter par petites fractions. Le Bézier fonctionne seulement "travailler" (c'est-à-dire, comme prévu pour les buts graphiques habituels) pour un paramètre de temps entre 0 et 1 (inclus), donc vous voulez commencer à time=0;, itérez un certain nombre de fois time += step;, et arrêtez une fois time>=1+step.

(et sauf si vous êtes une chance extraordinaire que vous avez probablement besoin d'ajouter manuellement un point final pour time=1 qui vous garantit le point final correct)