将.NET模拟通常指的是在非Windows操作系统上运行.NET应用程序。以下是一些常见的方法:1. **Mono**: - Mono是一个开源的.NET框架实现,它允许.NET应用程序在非Windows操作系统上运行,如Linux和macOS。 - 它支

摘要:本文介绍不依赖贝塞尔曲线,如何绘制一条平滑曲线,用于解决无贝塞尔控制点的情况下绘制曲线、但数据点不在贝塞尔曲线的场景。 在上一家公司我做过一个平滑曲线编辑工具,用于轮椅调整加减速曲线。基于几个用户可控制的点,生成一条平滑的曲线,控制点需要保
本文介绍不依赖贝塞尔曲线,如何绘制一条平滑曲线,用于解决无贝塞尔控制点的情况下绘制曲线、但数据点不在贝塞尔曲线的场景。 在上一家公司我做过一个平滑曲线编辑工具,用于轮椅调整加减速曲线。基于几个用户可控制的点,生成一条平滑的曲线,控制点需要保持在曲线上。 今天和小伙伴沟通,白板以自定义形状绘制笔迹,也可以使用到这个数据点模拟的技术,我回顾总结下 贝塞尔平滑曲线 我们先讲贝塞尔曲线GDI+ 中的贝塞尔自由绘制曲线 - Windows Forms .NET Framework | Microsoft Learn。一般情况我们绘制平滑曲线,直接以贝塞尔曲线API将多个点作为参数,直接进行绘制。这种情况下API会自动将第一个点作为控制点,得到贝塞尔曲线,比如下面生成一条平滑Geometry: 1 var geometryTest = new StreamGeometry(); 2 using(var ctx = geometryTest.Open()) 3 { 4 ctx.BeginFigure(_points[0], true, false); 5 if(keyPoints.Count % 2 == 0) 6 { 7 //绘制二阶贝塞尔函数,需要保证为偶数点 8 ctx.PolyQuadraticBezierTo(keyPoints, true, true); 9 } 10 else 11 { 12 //绘制二阶贝塞尔函数,需要保证为偶数点 13 keyPoints.Insert(0, keyPoints[0]); 14 ctx.PolyQuadraticBezierTo(keyPoints, true, true); 15 } 16 } 这里的PolyQuadraticBezierTo函数,塞点集列表进去并设置平滑参数isSmoothJoin=true 1 public abstract void PolyQuadraticBezierTo( 2 IList<Point> points, 3 bool isStroked, 4 bool isSmoothJoin); 5 6 public abstract void PolyBezierTo(IList<Point> points, bool isStroked, bool isSmoothJoin); 官网有介绍,列表中第一个点作为控制点:StreamGeometryContext.PolyQuadraticBezierTo 方法 (System.Windows.Media) |Microsoft 学习 上面是自动设置控制点,这类实现方案会有一个问题:数据点最终可能不在曲线上 基于贝塞尔曲线,我们也可以计算控制点。但计算控制点,也是同样无法保证原始数据点会在拟合后的曲线上。 模拟平滑曲线 以现有数据点,如果直接相连肯定只会生成多个折线。如果我们添加多个点,可以模拟一条类似曲线路径的多边形近似点集,与Geometry下的FlattenedPathGeometry有点类似。 方案一,可以使用MathNet.Numerics生成一条X方向的N阶曲线,然后输入X坐标输出Y坐标,得到曲线上的点。MathNet.Numerics可以参考.NET 白板书写加速-曲线拟合预测 - 唐宋元明清2188 - 博客园。但这方案会生成无数点,曲线绘制性能无法得到保证。所以添加这些曲线路径的点,如何以最小的点集实现?可以对相邻点,对向量角度变化以及相邻间距设置一个最小阈值,最终得到符合的点集 方案二,用我之前实现方案,根据最简多项式代码算出近似样条曲线点集。
阅读全文