Trova punto di controllo per QuadraticBezierSegment quando dato inizio, fine, e 1 punto che giace lungo la bezier in C # - QuadraticBezier 3 punti di interpolazione

StackOverflow https://stackoverflow.com/questions/2320956

  •  22-09-2019
  •  | 
  •  

Domanda

Questo è simile a una domanda precedente ho chiesto il Cubic Bezier. Ho un punto iniziale, un punto finale, e un punto che è destinata a giacere lungo una quadratico di Bezier. Alla luce di questi tre punti voglio essere in grado di tracciare una QuadraticBezierSegment in WPF, ma ho bisogno del valore singolo ControlPoint (nel QuadraticBezierSegment è Point1) al fine di disegnare.

Esiste un calcolo o mezzo tramite il quale è possibile determinare tale valore e attirare la mia QuadraticBezier in tal modo?

Grazie!

È stato utile?

Soluzione

Il miglior fit quadratico è più semplice che la misura migliore cubica. Ecco po 'di codice:

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 } );
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top