在C#-二次贝塞尔三点插值中,当给定起点、终点和沿贝塞尔的1点时,查找二次贝塞尔线段的控制点
这类似于我之前问的关于立方贝塞尔的问题。我有一个起点,一个终点,还有一个沿着二次贝塞尔曲线的点。给定这三个点,我希望能够在WPF中绘制一个二次Bezier段,但我需要一个控制点值(在二次Bezier段中,它是点1)来绘制它 是否有一种计算方法或手段,我可以确定该值,从而绘制出我的二次贝塞尔曲线在C#-二次贝塞尔三点插值中,当给定起点、终点和沿贝塞尔的1点时,查找二次贝塞尔线段的控制点,c#,wpf,bezier,pathgeometry,C#,Wpf,Bezier,Pathgeometry,这类似于我之前问的关于立方贝塞尔的问题。我有一个起点,一个终点,还有一个沿着二次贝塞尔曲线的点。给定这三个点,我希望能够在WPF中绘制一个二次Bezier段,但我需要一个控制点值(在二次Bezier段中,它是点1)来绘制它 是否有一种计算方法或手段,我可以确定该值,从而绘制出我的二次贝塞尔曲线 谢谢 最佳二次拟合比最佳三次拟合简单。下面是一些代码: static class DrawingUtility { static void bez3pts1(double x0, double y
谢谢 最佳二次拟合比最佳三次拟合简单。下面是一些代码:
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 } );
}
}
对于x1和Y1,这似乎总是返回Double.NaN是的,旧的解决方案被误导了。我已经修好了。