【问题标题】:Interpolating a cardinal curve in C#在 C# 中插值基数曲线
【发布时间】:2018-12-08 04:39:12
【问题描述】:

我需要手动插入一条基数曲线/样条曲线——由 System.Drawing 的 DrawCurve 方法创建的曲线类型。我找到了一个很好的 DeCastelJau 算法的 C 示例,可以用贝塞尔曲线来做到这一点。遗憾的是,我为这种曲线找到的所有示例都是纯数学符号,对我来说也可能是楔形文字。

谁能给我一个插值(并且所有点都经过)这种曲线的例子,用我知道如何阅读的编程语言演示?

编辑:

有人问我一个纯数学方法的例子,这对我来说是陌生的。这是我能找到的最冗长的一个,我想它会给你最多的工作:https://www.sciencedirect.com/science/article/pii/0021904569900409

【问题讨论】:

  • 请附上参考链接,以便我们了解您所查看的内容。
  • @Aldert - 你是指曲线类型的例子,还是我无法理解的数学符号?
  • 你无法理解的数学
  • all the points crossed by 什么意思?无限,全是 x,全是 y,还是只是很多? (对于后者,创建并展平图形路径。)
  • @TaW - 好吧,DeCastelJau 总是给你 1,000 个坐标点。我会对此感到满意,因为从那时起它们都会产生可预测的范围。我试图让一个图形路径来转储它的点,但显然现代 dotnet 不会这样做?

标签: c# math interpolation gdi+ curve


【解决方案1】:

Microsoft 基数样条曲线是一种立方Hermite spline

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

对于点集基数样条的插值,给出一阶连续性(相邻样条片段的值和切线是同步的)。为此,需要在k-th 点设置切线

 m(k) = (1-c) * (P(k+1) - P(k-1)) / (t(k+1)-t(k-1))

其中c是张力,P(k)k-数据集的第一个点,t(k)是一些标准化参数。有时使用索引(参见更一般的 Kochanek-Bartels 样条使用分母 2 作为索引差异),有时使用点之间的累积距离 - 我怀疑 MS 可能会使用这种方法等等。

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

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

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

【讨论】:

  • 这实际上清除了很多东西。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 2022-08-09
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
相关资源
最近更新 更多