Matlab在散点之间生成平滑曲线

时间:2017-08-03 03:25:03

标签: matlab interpolation curve-fitting normals

我需要在散点之间生成曲线,然后在每个点识别曲线的单位法线。这是一个点云的例子

figure
x = [1 2 0 0 1 1 2 3 4 2];
y = [4 6 9 1 1 2 4 9 2 3];
scatter(x,y)
hold on
line(x,y)
xlim([0 4])
ylim([0 10])

enter image description here

注意:沿y轴的2个点已连接

而不是点之间的线,我想创建一个平滑的曲线。当x和y中的点重复时,我不确定如何做到这一点。使用spline的尝试失败。在我知道曲线之后,我需要在每个点找到单位法线。我该怎么做?

编辑: 基本上我想在matlab docs中为polyfit显示此处显示的内容。假设x在我的情况下是唯一的,这不是问题。我可以识别多项式,然后,我相信,从该点评估的多项式函数确定单位法线。但在我的情况下,x和y数据重复,因此直接应用程序不起作用。

1 个答案:

答案 0 :(得分:2)

获得平滑路径的一种方法是将其视为参数函数并分别插入x和y。

x = [1 2 0 0 1 1 2 3 4 2];
y = [4 6 9 1 1 2 4 9 2 3];
t = 1:numel(x);

tq = 1:0.1:t(end);
xq = interp1(t,x,tq,'v5cubic');
yq = interp1(t,y,tq,'v5cubic');

plot(x,y,' ob',xq,yq,'-r');

要估算法线,可以采用样本点周围两条线段的平均法线。这段代码有点难看,但它完成了工作。

n = zeros(2,numel(x));
for tidx = 1:numel(t)
    tt = t(tidx);
    idx1 = find(tq <= tt,1,'last');
    idx0 = idx1 - 1;
    idx2 = idx1 + 1;
    if idx0 > 0
        n1 = [yq(idx1) - yq(idx0); xq(idx0) - xq(idx1)];
        n(:,tidx) = n(:,tidx) + n1/norm(n1);
    end
    if idx2 <= numel(tq)
        n2 = [yq(idx2) - yq(idx1); xq(idx1) - xq(idx2)];
        n(:,tidx) = n(:,tidx) + n2/norm(n2);
    end
    n(:,tidx) = n(:,tidx) / norm(n(:,tidx));
end

plot(x,y,' ob',xq,yq,'-r',[x.' x.'+n(1,:).'].', [y.' y.'+n(2,:).'].',' -k');
axis equal;

enter image description here

如果您使用pchip代替v5cubic进行插值方法,那么您可以在采样点周围获得更多对称性。但是,似乎任何急转弯(90度或更大)都不会平滑。

enter image description here