【问题标题】:How to connect points in a 3D space? (Matlab)如何连接 3D 空间中的点? (Matlab)
【发布时间】:2017-11-17 12:59:41
【问题描述】:

我尝试在 Matlab 的 3D 空间中连接多个点(有时是数千点)。轨迹可以沿任何方向前进,在任何维度上向前和向后。我希望得到五阶的结果,因为轨迹的二阶导数在其二阶导数中不能有任何故障。

matlab spline() 函数的问题是,每个 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 个点,如果连接起来应该看起来像双纽线。

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)

Forward going half of the lemniscate

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

  1. Matlab 样条函数是否完全适合我的问题?关于它需要在五阶导数中是连续的这一事实,是否可以解决有时我需要在各个方向的每个维度上进行的问题?

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

感谢您的帮助!

【问题讨论】:

标签: matlab interpolation spline polynomials cubic-spline


【解决方案1】:

我在以下代码的帮助下解决了这个问题(感谢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

【讨论】:

    猜你喜欢
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    相关资源
    最近更新 更多