加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

当给定的开始,结束和1点位于C#中的贝塞尔曲线时,找到QuadraticBe

发布时间:2020-12-16 01:34:28 所属栏目:百科 来源:网络整理
导读:这与我之前提到的有关Cubic Bezier的问题类似.我有一个起点,一个终点,以及一个位于Quadratic Bezier的点.鉴于这三点,我希望能够在 WPF中绘制QuadraticBezierSegment,但我需要单个ControlPoint值(在QuadraticBezierSegment中它是Point1)才能绘制它. 是否有计
这与我之前提到的有关Cubic Bezier的问题类似.我有一个起点,一个终点,以及一个位于Quadratic Bezier的点.鉴于这三点,我希望能够在 WPF中绘制QuadraticBezierSegment,但我需要单个ControlPoint值(在QuadraticBezierSegment中它是Point1)才能绘制它.

是否有计算或手段可以确定该值并因此绘制我的QuadraticBezier?

谢谢!

解决方法

最佳二次拟合比最佳立方拟合更简单.这是一些代码:

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 } );
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读