计算nurbs曲率NURBS曲线的曲率计算
https://download.csdn.net/download/yishang44/10383324
NURBS曲线的计算和求导
,主要看的书籍是《The NURBS book》,代码主要参考nurbs工具箱-M语言,下面将计算曲率的相关代码贴出并加以注释。主要算法参考《The NURBS book》P127,ALGORITHM A4.2
脚本函数,用半径为1的圆测试
ut = linspace(0.0,1.0,50);
crv = nrbcirc();
crv.order
crv.coefs
crv.knots
[p, w] = nrbeval(crv,ut);
p = p./repmat(w,[3,1])
tem = [];
for i=1:50
tem = [tem;norm(p(:,i))];
end
plot(p(1,:),p(2,:))
axis equal
grid on
curvature = clcCurvature(crv,ut)
clcCurvature()函数用于计算曲率
function curvature = clcCurvature(nurbs,ut)
%clcCurvature - 计算NURBS曲率
%
% Syntax: curvature = clcCurvature(nurbs,ut)
% input:
% nurbs:nurbs曲线的表达式,来源于nrbmak.m
% ut:需要计算的曲率的点
%
% Description:
% 该算法来源于 The nurbs book 算法:A4.2
dnurbs = nrbderiv(nurbs);
ddnurbs = nrbderiv(dnurbs);
[p w] = nrbeval(nurbs,ut);
[p1 w1] = nrbeval(dnurbs,ut);
[p2 w2] = nrbeval(ddnurbs,ut);
tem_w = w(ones(3,1),:);
tem_w1 = w1(ones(3,1),:);
tem_w2 = w2(ones(3,1),:);
C1 = (p1 - tem_w1.*p./tem_w)./tem_w;
C2 = (p2-2*tem_w1.*C1-tem_w2.*p./tem_w)./tem_w;
Cross_result = cross(C1,C2);
curvature = [];
np = size(C1);
for i = 1:np(2)
curvature = [curvature,norm(Cross_result(:,i))/(norm(C1(:,i))^3)];
end