用C#实现基数曲线的插补

Interpolating a cardinal curve in C#(用C#实现基数曲线的插补)
本文介绍了用C#实现基数曲线的插补的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要手动插补一条基本曲线/样条线--这是由System.Drawing的DrawCurve方法创建的曲线类型。我已经找到了DeCastelJau算法的一个很好的C示例,可以用Bezier来实现这一点。遗憾的是,我找到的这类曲线的所有例子都是纯粹的数学符号,对我来说可能是楔形的。

谁能给我举一个插补(所有的点都相交)这种曲线的例子,用编程语言演示,这就是我所知道的阅读方法?

编辑:

我被要求举一个我不熟悉的纯数学方法的例子。这是我能找到的最冗长的一个,我想它会给您提供最多的工作:https://www.sciencedirect.com/science/article/pii/0021904569900409

推荐答案

Microsoft基数样条线是一种三次Hermite spline。

Hermite样条线由这些点的端点和切线向量P0, P1, m0, m1描述。

对于点集的内插,基数样条线提供一阶连续性(相邻样条线的值和切线是同步的)。为此,需要在第k点处设置切线

 m(k) = (1-c) * (P(k+1) - P(k-1)) / (t(k+1)-t(k-1))
其中c是张力,P(k)是数据集的第[2-1]点,t(k)是用于归一化的某些参数。有时使用索引(c.f.更一般的Kochanek-Bartels样条使用分母2作为指数差),有时点之间的累积距离-我怀疑MS可能会使用这种方法等。

这样您就可以计算数据集每个点的切线m(k)(不包括开始和结束点-这里只基于单个邻居应用切线),并以Hermite形式(基础)构建样条线。

但是对于Bezier曲线有相当简单的De Casteljau方法,所以我们可以用Bezier形式(将基改为Bernstein多项式)来表示相同的曲线。被引用的维基页面展示了简单的方法:起点和终点保持不变,Bezier的控制点是

p0 (Bezier) = p0 (Hermite)
p3 (Bezier) = p1 (Hermite)
p1(Bezier) = p0(Hermite) + m0/3
p2(Bezier) = p1(Hermite) - m1/3

这篇关于用C#实现基数曲线的插补的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)