我需要在散点之间生成曲线,然后在每个点识别曲线的单位法线。这是一个点云的例子
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])
注意:沿y轴的2个点已连接
而不是点之间的线,我想创建一个平滑的曲线。当x和y中的点重复时,我不确定如何做到这一点。使用spline
的尝试失败。在我知道曲线之后,我需要在每个点找到单位法线。我该怎么做?
编辑:
基本上我想在matlab docs中为polyfit
显示此处显示的内容。假设x在我的情况下是唯一的,这不是问题。我可以识别多项式,然后,我相信,从该点评估的多项式函数确定单位法线。但在我的情况下,x和y数据重复,因此直接应用程序不起作用。
答案 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;
如果您使用pchip
代替v5cubic
进行插值方法,那么您可以在采样点周围获得更多对称性。但是,似乎任何急转弯(90度或更大)都不会平滑。