什么是贝塞尔曲线或 b 样条的通用数据结构?

问题描述

我想知道您将如何模拟任意复杂的 Bézier curves。我还不太了解贝塞尔曲线的基本组成部分的底层抽象,因为 equations 太多了。我想要一个定义贝塞尔曲线的通用结构。 SVG path 给出了您可以创建的曲线类型的许多示例。它们包括线性、三次和二次贝塞尔曲线。

如果 B-spline 是更好的通用模型,那么也可以使用它。我还不熟悉那些。 Difference between bezier segment and b-spline。我猜“B 样条曲线是由贝塞尔曲线作为线段组成的曲线”,所以这就是我要找的。​​p>

SVG 文档说:

三次贝塞尔曲线为每个点取两个控制点。

<path d="M 10 10 C 20 20,40 20,50 10" stroke="black" fill="transparent"/>

可以将多条贝塞尔曲线串在一起以创建扩展的平滑形状。通常,一个点一侧的控制点将反映另一侧使用的控制点,以保持斜率不变。在这种情况下,可以使用三次贝塞尔曲线的快捷版本,由命令 S(或 s)指定。

<path d="M 10 80 C 40 10,65 10,95 80 S 150 150,180 80" stroke="black" fill="transparent"/>

另一种贝塞尔曲线,称为 Q 的二次曲线,实际上是比三次曲线更简单的曲线。它需要一个控制点来确定曲线在起点和终点的斜率。它需要两个参数:控制点和曲线的终点。

<path d="M 10 80 Q 95 10 180 80" stroke="black" fill="transparent"/>

Arcs and NURBS(非均匀有理 B 样条)比单纯的贝塞尔曲线更复杂,但如果模型可以泛化到足以包含这些曲线,那就太好了。基本上,我希望在绘图/图形框架中使用贝塞尔曲线/b-样条/nurbs 的通用模型,但不确定那会是什么。

  • 每个贝塞尔类必须单独实现,还是可以组合成一个通用类?
  • 如果分开,它们是否基本上只是一组控制点?

所以基本上我开始思考:

class CubicBezierCurve
  include ActiveModel::Model

  has_many :control_points
end

class ControlPoint
  include ActiveModel::Model

  attr_accessor :x,:y
end

但这似乎不太对。例如,原始三次贝塞尔曲线由每个点的 2 个控制点组成。所以也许(虽然,开始迷路):

class CubicBezierCurve
  include ActiveModel::Model

  has_many :control_points,class_name: 'CubicBezierCurveControlPoint'
end

class CubicBezierCurveControlPoint
  include ActiveModel::Model

  attr_accessor :x,:y
end

class Point
  include ActiveModel::Model

  attr_accessor :x,:y
end

基本上,对于这 3 种类型的贝塞尔曲线(线性、三次和二次),什么是好的通用模型?如果有可能使它们成为理想的相同通用模型的所有方面(因为这意味着类的数量最少),但是如果它需要特定于类的其他类(例如特定于三次贝塞尔曲线的类),那也可以。

可以使用任何语言实现,例如 C 结构、打字稿或 Ruby 模型、Python 类等。

这个问题的原因是我可以构建一个 DSL 来在它上面创建曲线,就像 SVG 路径语法一样。但底层数据模型将成为编译目标。

为了进一步参考,我将研究这些:

这仅适用于 2D 图形。

解决方法

贝塞尔曲线最通用的数据结构就是包含一组控制点的简单数据结构。 Bezier 曲线的度数是控制点的数量 - 1。所以,线性、二次和三次 Bezier 曲线都可以使用相同的数据结构,但控制点数量不同。

对于 B 样条曲线,通用数据结构将包含

  • 学位 (D)
  • 控制点数(N)
  • 控制点阵列
  • 结序列。

结序列只是一个长度 = N+D+1 的“double[]”。节点值必须按非递减顺序排列。

,

n 的贝塞尔曲线只是 d 个多项式,每个维度一个。

每个多项式都以Bernstein 形式 编写,并且具有n 加一个系数(通常称为控制点)。这些系数单独确定多项式。因此,单独处理每个维度(多项式)可能会有所帮助,因为伯恩斯坦基是描述多项式的一种相当直观的方式。另请参阅下面引用的论文。

参考:

  • Farouki,R.T.,2012 年。伯恩斯坦多项式基础:百年回顾。计算机辅助几何设计,29(6),第 379-419 页。