当前位置:网站首页 / WPF / 正文

[ay的wpf]写给自己的wpf高级教程 [16]-弧-贝塞尔-BezierSegment[3/3]

时间:2016年07月12日 | 作者 : aaronyang | 分类 : WPF | 浏览: 2245次 | 评论 0

【由于AY只是高中毕业,所以对于数学知识,对自己的能力不是太信任,所以有错误,还请指出,一切知识只是自己临时学的】

严厉抵制推酷,未经授权,抓取AY的文章:AYUI已经免费了,AYUI,AYUI,快来买DEMO咯 ,我打个广告

维基百科上有很赞但不推荐细看的Gif动画:

线性贝塞尔曲线演示动画,t在[0,1]区间


二次贝塞尔曲线演示动画,t在[0,1]区间

三次贝塞尔曲线演示动画,t在[0,1]区间

四次贝塞尔曲线演示动画,t在[0,1]区间

五次贝塞尔曲线演示动画,t在[0,1]区间


2014-06-12_101433.png

A罩杯

我们可以看到,上面图片有4个点出现,曲线的两个端点,以及两个控制点,这就是典型的三次贝塞尔曲线。

杯罩曲线是我们实际存在的路径(描边就可见),而两个控制点是看不见的(虚的),只是用来确定曲线的弧度等。

一般而言,“三次贝塞尔曲线”的指令是:

   <Path Stroke="Black" Data="M20 20 C90,40 130,40 180,20" Canvas.Left="120" Canvas.Top="152"/>


写法1:   每个坐标x和y逗号隔开

M20 20 C90,40 130,40 180,20

写法2:每个坐标逗号隔开(推荐)

M20 20 C90 40, 130 40, 180 20

写法3:没有逗号

M20 20 C90 40 130 40 180 20


====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

传说中的气体,贝塞尔毒气

关于S

ShortCut_Cubic_Bezier.png

大家要把关注点放在蓝线上面。S指令会自动补出一个对称的控制点(蓝线部分)。于是,就会有连续的平滑曲线啦!

C指令有三个坐标参数,而S指令自动对称一个控制点,因此,跟在C指令之后的S指令,只需要2个参数哦,如下:

S 控制点 结束点 或 s 控制点 结束点

C指令+S指令:  传说(CS)组合,S用来给C添加辅助功能。

            <Path Stroke="Black" Data="M20 20 C90 40 130 40 180 20 S250 60 280 20" Canvas.Left="120" Canvas.Top="152"/>

blob.png


同样的 QT 后面的T也是对Q的辅助: (QT 气体)


下面我列出Q

2014-06-12_161557.png

T

Shortcut_Quadratic_Bezier.png

Q 控制点 结束点 或 q 控制点 结束点

S和T 专门做平滑补刀

           <Path Stroke="Black" Data="M20 10 Q140 40 180 20 T280 30" Canvas.Left="120" Canvas.Top="152"/>

blob.png

四次,五次的就不说了,玩好2,3次就不错了。

参考文章:


====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========



下面是我在网上找的一段代码,自己摘记。以防用到

Path path;
        public void UpdateRoad()
        {
            MapCanvas.Children.Remove(path);
            if (ScenePoint.roadPoint.Count > 0)
            {
                List<Point> list = new List<Point>();
                foreach (ScenePoint sp in ScenePoint.roadPoint)
                {
                    list.Add(new Point((sp.position.X + Shift.X) * Zoom, (sp.position.Y + Shift.Y) * Zoom));
                }
                PathFigure pf = new PathFigure();
 
                pf.StartPoint = list[0];
                List<Point> controls = new List<Point>();
                for (int i = 0; i < list.Count; i++)
                {
                    controls.AddRange(Control1(list, i));
                }
                for (int i = 1; i < list.Count; i++)
                {
                    BezierSegment bs = new BezierSegment(controls[i * 2 - 1], controls[i * 2], list[i], true);
                    bs.IsSmoothJoin = true;
 
                    pf.Segments.Add(bs);
                }
                PathFigureCollection pfc = new PathFigureCollection();
                pfc.Add(pf);
                PathGeometry pg = new PathGeometry(pfc);
 
                path = new Path();
                path.Stroke = Brushes.Black;
                path.Data = pg;
                MapCanvas.Children.Add(path);
            }
        }
        public void UpdateHeightCanvas()
        {
            HeightCanvas.Children.Clear();
            foreach (ScenePoint sp in ScenePoint.listPoint)
            {
                HeightCanvas.Children.Add(sp.Ellipseh);
            }
        }
        public List<Point> Control1(List<Point> list, int n)
        {
            List<Point> point = new List<Point>();
            point.Add(new Point());
            point.Add(new Point());
            if (n == 0)
            {
                point[0] = list[0];
            }
            else
            {
                point[0] = Average(list[n - 1], list[n]);
            }
            if (n == list.Count - 1)
            {
                point[1] = list[list.Count - 1];
            }
            else
            {
                point[1] = Average(list[n], list[n+1]);
            }
            Point ave = Average(point[0], point[1]);
            Point sh = Sub(list[n], ave);
            point[0] = Mul(Add(point[0], sh),list[n],0.6);
            point[1] = Mul(Add(point[1], sh),list[n],0.6);
            //Line line = new Line();
            //line.X1 = point[0].X;
            //line.Y1 = point[0].Y;
            //line.X2 = point[1].X;
            //line.Y2 = point[1].Y;
            //line.Stroke = Brushes.Red;
            //MapCanvas.Children.Add(line);
            return point;
        }
        public Point Average(Point x, Point y)
        {
            return new Point((x.X+y.X)/2,(x.Y+y.Y)/2);
        }
        public Point Add(Point x, Point y)
        {
            return new Point(x.X + y.X, x.Y + y.Y);
        }
        public Point Sub(Point x, Point y)
        {
            return new Point(x.X - y.X, x.Y - y.Y);
        }
        public Point Mul(Point x, Point y,double d)
        {
            Point temp = Sub(x, y);
            temp = new Point(temp.X * d, temp.Y * d);
            temp = Add(y, temp);
            return temp;
        }


推荐您阅读更多有关于“WPF4.5,”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

抖音:wpfui 工作wpf,目前主maui

目前在合肥市中安创谷A1科大智联就职,5月底离职

AYUI8全源码 Github地址:前往获取

杨洋(AaronYang简称AY,安徽六安人)AY唯一QQ:875556003和AY交流

高中学历,2010年开始web开发,2015年1月17日开始学习WPF

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

标签列表