如何连接3D空间中的点? (Matlab的)

时间:2017-11-17 12:59:41

标签: matlab interpolation spline polynomials cubic-spline

我尝试在Matlab中的3D空间中连接几个点(有时数千个)。轨迹可以在任何方向上,向前和向后进入任何方向。我想将结果放在第5顺序中,因为轨迹的二阶导数在其二阶导数中不得有任何毛刺。

matlab样条()函数的问题是,每个x值必须始终只有一个y值。我尝试了一个简单的2D示例,即无穷大符号(Lemniscate)。

t = pi*[0:.1:2]; a = 1;
for i=1:size(t,2)
    x(i) = a*sqrt(2)*cos(t(i))/(sin(t(i)).^2+1);
    y(i) = a*sqrt(2)*cos(t(i))*sin(t(i))/(sin(t(i))^2+1);
end

这产生了21分,如果连接的话,它应该看起来像lemniscate。

The 21 points plotted

现在更改第一行,计算样条曲线并添加绘图

t = pi*[-1:.1:0];
 [..]
xx = x(1):.1:x(end);
yy = spline(x,y,xx);
plot(x,y,'o',xx,yy)

这导致以下图表。正如你所看到的,这非常有用。但是如上所述,问题在于,这仅适用于x(i)< X(I + 1)

Forward going half of the lemniscate

所以现在这导致了以下问题:

  1. Matlab样条函数是否适用于我的问题?关于这个事实,它需要在五阶导数中是连续的,并且有可能解决我需要在每个方向的每个方向进行的问题吗?

  2. 如果没有,该怎么办?关于B样条的问题是,它们不是通过输入点。一位朋友提到我应该使用五阶的多项式并连接它们。他说我需要分别为每个维度做这件事。有人能解释一下吗?

  3. 感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我借助以下代码解决了这个问题(归功于this post in a different forum

n=100; [x_t, y_t, tt] = ParametricSpline(x, y, n); 
xref = ppval(x_t, tt); yref = ppval(y_t, tt); 

具有功能

function [ x_t, y_t, t_t ] = ParametricSpline(x,y,n) 
  m = length(x); 
  t = zeros(m, 1); 
  for i=2:m 
    arc_length = sqrt((x(i)-x(i-1))^2 + (y(i)-y(i-1))^2); 
    t(i) = t(i-1) + arc_length; 
  end
  t=t./t(length(t)); 
  x_t = spline(t, x); 
  y_t = spline(t, y); 
  t_t = linspace(0,1,n); 
end