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

What is a generic data structure for bezier curves or b-splines?

我想知道您将如何建模任意复杂的模型 Bézier curves. I am not quite understanding the underlying abstraction yet of what a bezier curve is fundamentally composed of, as there are too many equations. I would like to have a generic struct that defines a bezier curve. The SVG path 提供了许多您可以创建的曲线类型的示例。它们包括线性、三次和二次贝塞尔曲线。

如果一个B-spline is a better generic model, then that would be fine to use too. I am not familiar with those yet tho. Difference between bezier segment and b-spline。我想“B 样条曲线是由贝塞尔曲线作为线段组成的曲线”,所以这就是我要找的。

SVG 文档说:

Cubic Béziers take in two control points for each point.

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

Several Bézier curves can be stringed together to create extended, smooth shapes. Often, the control point on one side of a point will be a reflection of the control point used on the other side to keep the slope constant. In this case, a shortcut version of the cubic Bézier can be used, designated by the command S (or s).

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

The other type of Bézier curve, the quadratic curve called with Q, is actually a simpler curve than the cubic one. It requires one control point which determines the slope of the curve at both the start point and the end point. It takes two parameters: the control point and the end point of the curve.

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

Arcs and NURBS(非均匀有理 B 样条曲线)比普通的贝塞尔曲线更复杂,但如果模型可以足够泛化以包含这些曲线,那就太好了。基本上我想在 drawing/graphics 框架中使用贝塞尔 curves/b-splines/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 种贝塞尔曲线(线性、三次和二次)的通用模型是什么?如果有可能使它们成为理想的同一通用模型的所有方面(因为这意味着 classes 的数量最少),但如果它需要 class-特定的其他 classes(就像那些特定于三次贝塞尔曲线的那些),那也很好。

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

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

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

这仅适用于 2D 图形。

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

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

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

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

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

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

参考资料:

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