Найти контрольную точку для QuadraticBezierSegment, когда заданы Start, End и 1 Point, лежащие вдоль кривой Безье в C# — 3-точечная интерполяция QuadraticBezier

Это похоже на предыдущий вопрос, который я задавал о кубическом Безье. У меня есть начальная точка, конечная точка и точка, которая должна лежать на квадратичной кривой Безье. Учитывая эти три точки, я хочу иметь возможность рисовать QuadraticBezierSegment в WPF, но мне нужно одно значение ControlPoint (в QuadraticBezierSegment это Point1), чтобы нарисовать его.

Есть ли расчет или средства, с помощью которых я могу определить это значение и, таким образом, нарисовать свой Квадратичный Безье?

Спасибо!


person softwarequestioneer    schedule 23.02.2010    source источник


Ответы (1)


Наилучшая квадратичная аппроксимация проще, чем наилучшая кубическая аппроксимация. Вот код:

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 } );
    }
}
person Gabe    schedule 23.02.2010
comment
Кажется, это всегда возвращает Double.NaN для x1 и y1 - person softwarequestioneer; 23.02.2010
comment
Да, старое решение было ошибочным. Я исправил это. - person Gabe; 24.02.2010