在MATLAB中计算闭合曲线(或多边形)的曲率 [英] Calculating the curvature of a closed curve ( or polygon) in matlab
本文介绍了在MATLAB中计算闭合曲线(或多边形)的曲率的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
考虑以下几点
x = [1.34, 0.92, 0.68, 0.25, -0.06, -0.34, -0.49, -0.72, -0.79, -0.94, -1.35, -0.35, 0.54, 0.68, 0.84, 1.20, 1.23, 1.32, 1.34];
y = [0.30, 0.43, 0.90, 1.40, 1.13, 1.08, 1.14, 1.23, 0.52, 0.21, -0.20, -0.73, -0.73, -0.82, -0.71, -0.76, -0.46, -0.13, 0.30];
给出一条闭合的曲线(或多边形):
figure(1)
hold on
plot(x,y,'k');
scatter(x,y,'r');
xlim([-2 2]);
ylim([-2 2]);
axis equal
我希望计算曲线上各点的曲率(尽可能准确)。
到目前为止,我只有一个简单的计算切向(一阶导数)和曲率(二阶导数)的方法:
dsx = diff(x);
dsy = diff(y);
ds = sqrt(dsx.^2+dsy.^2);
Tx = dsx./ds;
Ty = dsy./ds;
ds2 = 0.5*(ds(1:end-1)+ds(2:end));
Hx = diff(Tx)./ds2;
Hy = diff(Ty)./ds2;
但我得到的曲率非常不准确:
figure(1)
quiver(x(1:end-2),y(1:end-2),Hx,Hy,'b','autoscalefactor',1.2);
xlim([-2 2]); ylim([-2 2]);
axis equal
这应该是一个简单的计算,但它不起作用,请注意:如何才能在最简单的近似中找到曲率,并在方向和大小上具有合理的精度?
推荐答案
曲率计算正确,关闭的是绘制。请注意,diff
计算后续元素之间的差异,从而产生一个具有较少一个元素的向量。它估计样本对之间的导数。如果重复此操作,您将在样本处获得二阶导数,但不会在第一个或最后一个样本处得到二阶导数(您现在少了两个元素)。
您确实注意到了这一点,因为您绘制的曲率只有一个顶点。
因此,您所需要做的就是在第一个导数之后复制一个点(我将最后一个点添加到开头,这样元素的顺序就与输入数组中的顺序相同)。索引语句Tx([end,1:end])
就是这样做的。
在下面的代码中,我还用黑色绘制法线(Ty,-Tx)。
x = [1.34, 0.92, 0.68, 0.25, -0.06, -0.34, -0.49, -0.72, -0.79, -0.94, -1.35, -0.35, 0.54, 0.68, 0.84, 1.20, 1.23, 1.32, 1.34];
y = [0.30, 0.43, 0.90, 1.40, 1.13, 1.08, 1.14, 1.23, 0.52, 0.21, -0.20, -0.73, -0.73, -0.82, -0.71, -0.76,-0.46, -0.13, 0.30];
% First derivative
dsx = diff(x);
dsy = diff(y);
ds = sqrt(dsx.^2+dsy.^2);
Tx = dsx./ds;
Ty = dsy./ds;
% Second derivative & curvature
ds2 = 0.5*(ds([end,1:end-1])+ds);
Hx = diff(Tx([end,1:end]))./ds2;
Hy = diff(Ty([end,1:end]))./ds2;
% Plot
clf
hold on
plot(x,y,'ro-');
x = x(1:end-1);
y = y(1:end-1); % remove repeated point
quiver(x+dsx/2,y+dsy/2,Ty,-Tx,'k','autoscalefactor',0.3);
quiver(x,y,Hx,Hy,'b','autoscalefactor',1.2);
set(gca,'xlim',[-2 2],'ylim',[-1.5 2]);
axis equal
这篇关于在MATLAB中计算闭合曲线(或多边形)的曲率的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文