在matlab中计算闭合曲线(或多边形)的曲率

时间:2018-03-27 18:13:02

标签: matlab computational-geometry

考虑以下一组要点

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

enter image description here

我希望计算曲线上的曲率(尽可能准确)。

我到目前为止只是简单计算切向量(第一个导数)然后是曲率(第二个导数):

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

enter image description here

这是一个简单的计算,但它不起作用,请建议:如何在最简单的近似中找到曲率并在方向和幅度上具有合理的精度?

2 个答案:

答案 0 :(得分:1)

曲率计算是正确的,它是关闭的绘图。请注意, public static void Register(HttpConfiguration config) { config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } 计算后续元素之间的差异,产生的元素少一个。它估计样本对之间的导数。如果你重复这一点,你将得到样本的二阶导数,但不是第一个或最后一个样本(你现在有2个元素)。

你确实注意到了这一点,因为除了一个顶点之外,你正在绘制一个曲率。

所以你需要做的就是在一阶导数之后复制一个点(我将最后一个点添加到开头,所以元素的顺序与输入数组中的顺序相同)。索引语句diff就是这样做的。

在下面的代码中,我还绘制了黑色的法线(Ty,-Tx)。

Tx([end,1:end])

output of plotting commands above

答案 1 :(得分:-1)

严格地说,这个问题没有意义。

多边形在顶点处没有曲率,沿边缘没有零曲率。

您需要更具体地了解您要评估的数量,例如通过解释目的。