Matlab生成散射点间的平滑曲线

Matlab生成散射点间的平滑曲线,matlab,interpolation,curve-fitting,normals,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]) 注意:沿y轴的两个点是连接的 我想创建一条平滑的曲线,而不是点之间的直线。当x和y中的点重复时,我不确定如何做到这一点。尝试使用样条曲线失败。知道曲线后,我需要找到每个点的单位

我需要在分散点之间生成一条曲线,然后确定每个点处曲线的单位法线。下面是一个点云的示例

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轴的两个点是连接的

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

编辑:
基本上,我想做的是在中显示的
polyfit
。假设x在我的例子中是唯一的,这不会是一个问题。我可以确定多项式,然后,我相信,通过在该点计算的多项式函数确定单位法线。但在我的例子中,x和y数据重复,因此直接的应用程序无法工作。

获得平滑路径的一种方法是将其视为参数函数,分别插值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;
n=0(2,numel(x));
对于tidx=1:numel(t)
tt=t(tidx);
idx1=查找(tq 0
n1=[yq(idx1)-yq(idx0);xq(idx0)-xq(idx1)];
n(:,tidx)=n(:,tidx)+n1/常模(n1);
结束

如果idx2我不确定你在问什么,但基本上是从一个端点开始,用平滑曲线而不是直线连接点。然后我需要在点位置找到该曲线的单位法线。我怀疑我需要知道的是如何定义这样的函数,然后做一些导数来得到单位法线.哈…好笑!我刚刚复习完这个答案:看看它是否能提供解决方案,我发现你或多或少遵循了相同的概念。我将尝试实施你的解决方案,看看它是否有效。