当前位置: 首页 > ds >正文

贝塞尔曲线的切矢量

贝塞尔曲线的切矢量(切线向量)表示曲线在某一点处的方向导数,即曲线在该点的瞬时变化方向。切矢量的计算依赖于贝塞尔曲线的参数方程及其导数。

贝塞尔曲线的定义

一个 n 阶贝塞尔曲线的参数方程为:
B ( t ) = ∑ i = 0 n P i ⋅ B i , n ( t ) , t ∈ [ 0 , 1 ] \mathbf{B}(t) = \sum_{i=0}^n \mathbf{P}_i \cdot B_{i,n}(t), \quad t \in [0,1] B(t)=i=0nPiBi,n(t),t[0,1]
其中:

  • P i \mathbf{P}_i Pi 是控制点,
  • B i , n ( t ) = ( n i ) t i ( 1 − t ) n − i B_{i,n}(t) = \binom{n}{i} t^i (1-t)^{n-i} Bi,n(t)=(in)ti(1t)ni 是伯恩斯坦基多项式。

切矢量的计算

切矢量是贝塞尔曲线的一阶导数 B ′ ( t ) \mathbf{B}'(t) B(t),其表达式为:
B ′ ( t ) = d d t B ( t ) = ∑ i = 0 n P i ⋅ B i , n ′ ( t ) \mathbf{B}'(t) = \frac{d}{dt} \mathbf{B}(t) = \sum_{i=0}^n \mathbf{P}_i \cdot B'_{i,n}(t) B(t)=dtdB(t)=i=0nPiBi,n(t)
其中,伯恩斯坦基多项式的导数为:
B i , n ′ ( t ) = n [ B i − 1 , n − 1 ( t ) − B i , n − 1 ( t ) ] B'_{i,n}(t) = n \left[ B_{i-1,n-1}(t) - B_{i,n-1}(t) \right] Bi,n(t)=n[Bi1,n1(t)Bi,n1(t)]
因此,贝塞尔曲线的切矢量可表示为:
B ′ ( t ) = n ∑ i = 0 n − 1 ( P i + 1 − P i ) B i , n − 1 ( t ) \mathbf{B}'(t) = n \sum_{i=0}^{n-1}(\mathbf{P}_{i+1} - \mathbf{P}_i) B_{i,n-1}(t) B(t)=ni=0n1(Pi+1Pi)Bi,n1(t)

特殊情况

  1. 起点 t = 0 t=0 t=0 的切矢量
    B ′ ( 0 ) = n ( P 1 − P 0 ) \mathbf{B}'(0) = n(\mathbf{P}_1 - \mathbf{P}_0) B(0)=n(P1P0)
    即切矢量方向为 P 1 − P 0 \mathbf{P}_1 - \mathbf{P}_0 P1P0

  2. 终点 ( t = 1 (t=1 (t=1) 的切矢量
    B ′ ( 1 ) = n ( P n − P n − 1 ) \mathbf{B}'(1) = n(\mathbf{P}_n - \mathbf{P}_{n-1}) B(1)=n(PnPn1)
    方向为 P n − P n − 1 \mathbf{P}_n - \mathbf{P}_{n-1} PnPn1

几何意义

  • 切矢量 B ′ ( t ) \mathbf{B}'(t) B(t) 表示曲线在参数 (t$ 处的运动方向。
  • 如果 B ′ ( t ) = 0 \mathbf{B}'(t) = \mathbf{0} B(t)=0(零矢量),则该点可能是尖点或曲线在该点停滞(需进一步分析高阶导数)。

示例(二次贝塞尔曲线)

对于二阶贝塞尔曲线:
B ( t ) = ( 1 − t ) 2 P 0 + 2 t ( 1 − t ) P 1 + t 2 P 2 \mathbf{B}(t) = (1-t)^2 \mathbf{P}_0 + 2t(1-t) \mathbf{P}_1 + t^2 \mathbf{P}_2 B(t)=(1t)2P0+2t(1t)P1+t2P2
其切矢量为:
B ′ ( t ) = 2 ( 1 − t ) ( P 1 − P 0 ) + 2 t ( P 2 − P 1 ) \mathbf{B}'(t) = 2(1-t)(\mathbf{P}_1 - \mathbf{P}_0) + 2t(\mathbf{P}_2 - \mathbf{P}_1) B(t)=2(1t)(P1P0)+2t(P2P1)
t = 0 t=0 t=0 t = 1 t=1 t=1 处:
B ′ ( 0 ) = 2 ( P 1 − P 0 ) , B ′ ( 1 ) = 2 ( P 2 − P 1 ) \mathbf{B}'(0) = 2(\mathbf{P}_1 - \mathbf{P}_0), \quad \mathbf{B}'(1) = 2(\mathbf{P}_2 - \mathbf{P}_1) B(0)=2(P1P0),B(1)=2(P2P1)

Matlab实现

% 定义控制点(示例:3 阶贝塞尔曲线)
P = [0, 0; 1, 2; 3, 1; 4, 3]; % 4 个控制点 → 3 阶贝塞尔曲线% 参数 t 的采样点
t = linspace(0, 1, 100)';% 计算贝塞尔曲线和切矢量
[B, dB] = bezier_curve(P, t);% 绘制初始图形
figure;
hold on;
plot(P(:,1), P(:,2), 'ro-'); % 控制点及控制多边形
% h_curve = plot(B(:,1), B(:,2), 'b-', 'LineWidth', 2); % 贝塞尔曲线
h_tangent = quiver(B(1,1), B(1,2), dB(1,1)/10, dB(1,2)/10, 'r', 'LineWidth', 2, 'MaxHeadSize', 1); % 初始切矢量
title('贝塞尔曲线及其切矢量动画');
xlabel('x');
ylabel('y');
grid on;
axis equal;% 动画显示切矢量
for k = 1:length(t)% 更新切矢量位置set(h_tangent, 'XData', B(k,1), 'YData', B(k,2), 'UData', dB(k,1)/10, 'VData', dB(k,2)/10);% 可选:绘制切矢量的轨迹plot(B(k,1), B(k,2), 'bo', 'MarkerSize', 5);pause(0.05); % 控制动画速度drawnow;
endfunction [B, dB] = bezier_curve(P, t)% P: 控制点矩阵,大小为 (n+1) x 2(二维情况)% t: 参数 t ∈ [0,1]% B: 曲线上的点% dB: 切矢量n = size(P, 1) - 1; % 阶数 = 控制点数 - 1B = zeros(length(t), 2);dB = zeros(length(t), 2);for k = 1:length(t)tk = t(k);% 计算贝塞尔曲线上的点 B(t)B(k, :) = [0, 0];for i = 0:nB(k, :) = B(k, :) + P(i+1, :) * nchoosek(n, i) * tk^i * (1-tk)^(n-i);end% 计算切矢量 dB(t)if n >= 1dB(k, :) = [0, 0];for i = 0:n-1dB(k, :) = dB(k, :) + n * (P(i+2, :) - P(i+1, :)) * nchoosek(n-1, i) * tk^i * (1-tk)^(n-1-i);endendend
end

运行结果:
在这里插入图片描述

应用

  • 曲线平滑性:若相邻贝塞尔曲线段在连接点的切矢量共线,则曲线在该点光滑(G1 连续)。
  • 运动控制:在动画或路径规划中,切矢量可用于确定物体的运动方向。

通过计算切矢量,可以分析贝塞尔曲线的局部几何性质,并用于优化设计、插值和碰撞检测等场景。

http://www.xdnf.cn/news/14541.html

相关文章:

  • 分割数据集 - 足球运动员分割数据集下载
  • 关于 使用 GPT 自动生成反调试代码详解
  • 手机SIM卡通话中随时插入录音语音片段(Windows方案)
  • NLP语言发展路径分享
  • Good Start/Smilo and Minecraft
  • 大数据集群架构hadoop集群、Hbase集群、zookeeper、kafka、spark、flink、doris、dataease(四)
  • Oracle 逻辑结构与性能优化(上)
  • Softhub软件下载站实战开发(三):平台管理模块实战
  • 第9章:Neo4j集群与高可用性
  • SpringBoot学习day3-SpringBoot注解开发(新闻项目后段基础)
  • Java中的CAS与ABA
  • Leetcode 刷题记录 14 —— 回溯
  • 什么是装饰器?
  • UE5错误 Linux离线状态下错误 circular dependency detected;includes/requires
  • chapter06-针对分类的微调
  • 实战指南:部署MinerU多模态文档解析API与Dify深度集成(实现解析PDF/JPG/PNG)
  • 【RAG文档解析】深度剖析 PDF 解析的痛点与方案
  • springboot集成dubbo
  • LangChain调用本地modelscope下载的Deepseek大模型
  • Python打卡第54天
  • 13分钟讲解主流Linux发行版
  • origin绘制双Y轴柱状图、双Y轴柱状点线图和双Y轴点线图
  • Node.js验证码:从生成到验证的趣味之旅
  • 条件收敛的级数中项必须趋于 0,正负项抵消,但趋于 0 的速度不需要“足够快”
  • 【学习笔记】深入理解Java虚拟机学习笔记——第9章 类加载及执行子系统的案例与实战
  • 深度学习进化史:从神经元的诞生到万亿参数的觉醒
  • 掌握这些 Python 函数,让你的代码更简洁优雅
  • Git基本使用
  • npm install报错
  • Hudi 与 Hive 集成