ViewDesignEngine  3.1.0
高性能 CAD 计算几何引擎
vde::curves::BezierCurve类 参考

任意阶 Bézier 曲线 更多...

#include <bezier_curve.h>

Public 成员函数

 BezierCurve (std::vector< Point3D > control_points)
 构造 Bézier 曲线 更多...
 
Point3D evaluate (double t) const
 在参数 t 处求值曲线点 更多...
 
Vector3D derivative (double t, int order=1) const
 在参数 t 处求导数 更多...
 
int degree () const
 曲线阶次 更多...
 
std::pair< double, double > domain () const
 参数定义域 更多...
 
const std::vector< Point3D > & control_points () const
 控制点访问 更多...
 
std::pair< BezierCurve, BezierCurvesplit (double t) const
 在 t 处将曲线一分为二 更多...
 
BezierCurve degree_elevate (int times=1) const
 升阶操作 更多...
 

详细描述

任意阶 Bézier 曲线

通过 de Casteljau 递推算法定义的参数多项式曲线。 控制点 cp_ 的数量 = p+1(p 为次数)。 参数域 t ∈ [0, 1],端点插值首末控制点。

在文件 bezier_curve.h18 行定义.

构造及析构函数说明

◆ BezierCurve()

vde::curves::BezierCurve::BezierCurve ( std::vector< Point3D >  control_points)
explicit

构造 Bézier 曲线

参数
control_points控制点序列,点数 = degree + 1,最少 2 个
注解
控制点数量决定了曲线阶次;点数越多,曲线越灵活但计算越昂贵
BezierCurve curve({p0, p1, p2, p3}); // 三次 Bézier
BezierCurve(std::vector< Point3D > control_points)
构造 Bézier 曲线

成员函数说明

◆ control_points()

const std::vector<Point3D>& vde::curves::BezierCurve::control_points ( ) const
inline

控制点访问

返回
控制点向量的只读引用

在文件 bezier_curve.h64 行定义.

◆ degree()

int vde::curves::BezierCurve::degree ( ) const
inline

曲线阶次

返回
阶次 = 控制点数 - 1

在文件 bezier_curve.h52 行定义.

◆ degree_elevate()

BezierCurve vde::curves::BezierCurve::degree_elevate ( int  times = 1) const

升阶操作

参数
times升阶次数,≥ 1
返回
升阶后的 Bézier 曲线(控制点数增加 times,形状不变)
注解
通过反复应用公式 P_i' = i/(n+1) P_{i-1} + (1 - i/(n+1)) P_i 升阶不仅增加自由度,也用于不同阶曲线间的兼容操作
参见
split

◆ derivative()

Vector3D vde::curves::BezierCurve::derivative ( double  t,
int  order = 1 
) const

在参数 t 处求导数

参数
t参数值,范围 [0, 1]
order导数阶数,1 = 一阶(切向量),2 = 二阶(曲率相关)
返回
导数向量
注解
高阶导数通过降阶 Bézier 曲线计算: P^{(k)}(t) = n(n-1)...(n-k+1) Σ Δ^k P_i · B_i^{n-k}(t)

◆ domain()

std::pair<double, double> vde::curves::BezierCurve::domain ( ) const
inline

参数定义域

返回
固定为 [0, 1]

在文件 bezier_curve.h58 行定义.

◆ evaluate()

Point3D vde::curves::BezierCurve::evaluate ( double  t) const

在参数 t 处求值曲线点

参数
t参数值,范围 [0, 1]
返回
曲线上对应 t 的点坐标
注解
使用 de Casteljau 递推算法,O(n²) 复杂度

◆ split()

std::pair<BezierCurve, BezierCurve> vde::curves::BezierCurve::split ( double  t) const

在 t 处将曲线一分为二

参数
t分割参数,范围 [0, 1]
返回
左段 + 右段两条 Bézier 曲线
注解
使用 de Casteljau 分割算法,分割点为三角阵的对角线
auto [left, right] = curve.split(0.5);
// left: 控制点 = [P0, b1, b2, P(t)]
// right: 控制点 = [P(t), b3, b4, P3]

该类的文档由以下文件生成: