2010-02-23 19 views
3

Ceci est similaire à une question précédente, j'ai posé une question sur le Bezier cubique. J'ai un point de départ, un point de terminaison et un point qui doit se situer le long d'un Bézier quadratique. Compte tenu de ces trois points, je veux être en mesure de dessiner un QuadraticBezierSegment dans WPF, mais j'ai besoin de la seule valeur ControlPoint (dans le QuadraticBezierSegment c'est Point1) afin de le dessiner.Trouver point de contrôle pour QuadraticBezierSegment quand donné Start, End, et 1 point allongé le long du bezier en C# - QuadraticBezier Interpolation 3 points

Existe-t-il un calcul ou un moyen par lequel je peux déterminer cette valeur et ainsi dessiner mon QuadraticBezier?

Merci!

Répondre

7

Le meilleur ajustement quadratique est plus simple que le meilleur ajustement cubique. Voici un code:

static class DrawingUtility 
{ 
    static void bez3pts1(double x0, double y0, double x3, double y3, double x2, double y2, out double x1, out double y1) 
    { 
     // find chord lengths 
     double c1 = Math.Sqrt((x3 - x0) * (x3 - x0) + (y3 - y0) * (y3 - y0)); 
     double c2 = Math.Sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2)); 
     // guess "best" t 
     double t = c1/(c1 + c2); 
     // quadratic Bezier is B(t) = (1-t)^2*P0 + 2*t*(1-t)*P1 + t^2*P2 
     // solving gives P1 = [B(t) - (1-t)^2*P0 - t^2*P2]/[2*t*(1-t)] where P3 is B(t) 
     x1 = (x3 - (1 - t) * (1 - t) * x0 - t * t * x2)/(2 * t * (1 - t)); 
     y1 = (y3 - (1 - t) * (1 - t) * y0 - t * t * y2)/(2 * t * (1 - t)); 
    } 

    // pass in a PathFigure and it will append a QuadraticBezierSegment connecting the previous point to int1 and endPt 
    static public void QuadraticBezierFromIntersection(PathFigure path, Point startPt, Point int1, Point endPt) 
    { 
     double x1, y1; 
     bez3pts1(startPt.X, startPt.Y, int1.X, int1.Y, endPt.X, endPt.Y, out x1, out y1); 
     path.Segments.Add(new QuadraticBezierSegment { Point1 = new Point(x1, y1), Point2 = endPt }); 
    } 
} 
+0

Cela semble toujours revenir Double.NaN pour x1 et y1 – softwarequestioneer

+0

Oui, l'ancienne solution était peu judicieuse. Je l'ai réparé. – Gabe