【发布时间】:2018-03-27 18:13:02
【问题描述】:
考虑以下一组点
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计算后续点之间的差异,从而得出点之间的范围。如果你应用它两次,你会得到样本的二阶导数,但结果会移动一个样本。 -
@CrisLuengo,tnx 为您解答。你能提供一个解决方案吗?我会接受,请使用我提供的示例。
标签: matlab computational-geometry