基于MATLAB的NURBS曲线生成与可视化程序
%% NURBS曲线生成与可视化
clc; clear; close all;
%% 基本参数设置
degree = 3; % 曲线阶数 (degree = k-1, k为控制点数)
numCtrlPts = 6; % 控制点数量
weights = ones(1, numCtrlPts); % 权重向量(可调整)
%% 定义控制点(二维示例)
ctrlPts = [
0 0;
1 3;
3 5;
5 4;
6 2;
8 0
];
%% 定义节点向量(均匀分布)
knots = [0 0 0 0 1 1 1 1]; % 节点向量长度 = numCtrlPts + degree + 1
%% 创建NURBS曲线
curve = spapi(knots, ctrlPts, 'rational', weights);
%% 生成曲线点
numSamples = 100; % 采样点数
u = linspace(knots(degree+1), knots(end-degree), numSamples)';
curvePoints = fnval(curve, u);
%% 绘制结果
figure;
hold on;
plot(ctrlPts(:,1), ctrlPts(:,2), 'ro-', 'LineWidth', 2); % 控制点
plot(curvePoints(:,1), curvePoints(:,2), 'b-', 'LineWidth', 2); % 曲线
axis equal;
grid on;
title('NURBS Curve Visualization');
xlabel('X');
ylabel('Y');
legend('Control Points', 'NURBS Curve');
%% 交互式调整控制点(GUI)
% 创建图形窗口句柄
hFig = figure('Name','NURBS Curve Editor','NumberTitle','off');
% 创建滑块控制
s = 0.5; % 初始位置比例
uicontrol('Style','slider','Position',[20 20 200 20],...
'Min',0,'Max',1,'Value',s,...
'Callback',{@updateCurve,s,hFig});
% 创建文本显示
uicontrol('Style','text','Position',[250 25 50 20],...
'String',['Position: ',num2str(s)]);
% 主绘图区域
ax = axes('Parent',hFig,'Position',[0.3 0.3 0.6 0.6]);
hPlot = plot(ctrlPts(:,1), ctrlPts(:,2),'ro-','LineWidth',2);
hold(ax,'on');
curvePlot = plot(curvePoints(:,1), curvePoints(:,2),'b-','LineWidth',2);
axis(ax,'equal');
grid(ax,'on');
%% 回调函数:更新曲线
function updateCurve(src,callbackdata,s,hFig)
% 获取滑块位置
pos = get(src,'Value');
% 更新控制点位置(示例:水平移动最后一个控制点)
ctrlPts(end,:) = [pos*10, 0];
% 重新计算曲线
curve = spapi(knots, ctrlPts, 'rational', weights);
curvePoints = fnval(curve, linspace(knots(degree+1), knots(end-degree), 100)');
% 更新图形
set(hPlot,'XData',ctrlPts(:,1),'YData',ctrlPts(:,2));
set(curvePlot,'XData',curvePoints(:,1),'YData',curvePoints(:,2));
set(findobj(hFig,'Tag','positionText'),'String',['Position: ',num2str(pos)]);
drawnow;
end
代码说明:
-
NURBS曲线定义:
- 使用MATLAB内置的
spapi函数创建NURBS曲线 - 支持任意阶数和控制点数量
- 包含权重参数(可调整局部形状)
- 使用MATLAB内置的
-
核心功能:
- 控制点可视化(红色标记)
- NURBS曲线生成(蓝色曲线)
- 交互式控制点编辑(通过滑块)
-
交互功能:
- 滑块控制最后一个控制点的水平位置
- 实时更新曲线形状
- 显示当前控制点位置
-
参数可调性:
- 修改
degree改变曲线阶数 - 调整
weights数组改变曲线形状 - 修改
ctrlPts矩阵定义不同控制点配置
- 修改
nurbs曲线的matlab程序 youwenfan.com/contentcsc/63827.html
扩展应用建议:
-
三维曲线扩展:
% 添加第三维坐标 ctrlPts = [ 0 0 0; 1 3 1; 3 5 2; 5 4 1; 6 2 0; 8 0 0 ]; -
打开文件功能:
% 从文件加载控制点 ctrlPts = load('control_points.txt'); -
高级功能扩展:
- 添加曲率可视化
- 实现曲线/曲面拟合功能
- 添加节点向量编辑器
- 实现曲线细分功能
注意事项:
-
需要MATLAB Curve Fitting Toolbox
-
节点向量必须满足:
- 长度 = 控制点数 + 阶数 + 1
- 节点向量必须是非递减序列
-
权重参数注意事项:
- 权重为0时该控制点无效
- 权重大于1会增强该点的影响
可以通过调整控制点位置、权重值和节点向量来观察曲线形状的变化,这对于理解NURBS曲线的数学特性非常有帮助。