c# – 如何用几点绘制贝塞尔曲线?

c# – 如何用几点绘制贝塞尔曲线?,第1张

概述我有几点,我试图用下面的代码绘制贝塞尔曲线 PathFigure pf = new PathFigure(points.From, ps, false); //ps - list of Bezier segments PathFigureCollection pfc = new PathFigureCollection(); pfc.Add(pf); var pge = n 我有几点,我试图用下面的代码绘制贝塞尔曲线
Pathfigure pf = new Pathfigure(points.From,ps,false); //ps - List of BezIEr segments    PathfigureCollection pfc = new PathfigureCollection();    pfc.Add(pf);    var pge = new PathGeometry();    pge.figures = pfc;    Path p = new Path();    p.Data = pge;    p.stroke = new SolIDcolorBrush(color.Fromrgb(244,111,011));

我的贝塞尔区段看起来像这样

> 1,2,3分 – 第一段
> 3,4,5分 – 秒
> 5,6,7 .. ..

但是我得到了这个奇怪的曲线(这里有3个大节点)和7个小椭圆(是我的分数)):

解决方法 你得到的线是三个不同的贝塞尔曲线的联合 – 每三组一个. (每个“BezIEr segment”一个?)

如果你想要一个单一的平滑曲线,你需要把你的9点(或更多)点作为一个单一的点集合(单个“BezIEr segment”?),而不是三分组.

编辑:显然BezierSegment只支持三点,所以难怪这不行.即使‘PolyBezierSegment’只是给出一个BezIEr段的集合,而不是一个平滑的BezIEr …

所以,因为WPF并没有给你任何有用的东西,所以我用数学here一起敲了一下.这是一个数字解决方案,但是即使有足够的观点看起来很好又顺利,它似乎是很好的表现:

polylinesegment GetBezIErApproximation(Point[] controlPoints,int outputSegmentCount){    Point[] points = new Point[outputSegmentCount + 1];    for (int i = 0; i <= outputSegmentCount; i++)    {        double t = (double)i / outputSegmentCount;        points[i] = GetBezIErPoint(t,controlPoints,controlPoints.Length);    }    return new polylinesegment(points,true);}Point GetBezIErPoint(double t,Point[] controlPoints,int index,int count){    if (count == 1)        return controlPoints[index];    var P0 = GetBezIErPoint(t,index,count - 1);    var P1 = GetBezIErPoint(t,index + 1,count - 1);    return new Point((1 - t) * P0.X + t * P1.X,(1 - t) * P0.Y + t * P1.Y);}

使用这个,

private voID GrID_Loaded(object sender,RoutedEventArgs e){    Point[] points = new[] {             new Point(0,200),new Point(0,0),new Point(300,new Point(350,new Point(400,0)        };    var b = GetBezIErApproximation(points,256);    Pathfigure pf = new Pathfigure(b.Points[0],new[] { b },false);    PathfigureCollection pfc = new PathfigureCollection();    pfc.Add(pf);    var pge = new PathGeometry();    pge.figures = pfc;    Path p = new Path();    p.Data = pge;    p.stroke = new SolIDcolorBrush(color.Fromrgb(255,0));    ((GrID)sender).Children.Add(p);}

总结

以上是内存溢出为你收集整理的c# – 如何用几点绘制贝塞尔曲线?全部内容,希望文章能够帮你解决c# – 如何用几点绘制贝塞尔曲线?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1261129.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存