如何连接 3D space 中的点? (Matlab)
How to connect points in a 3D space? (Matlab)
我尝试在 Matlab 中的 3D space 中连接几个点(有时几千个)。轨迹可以在任何方向上,在任何维度上向前和向后移动。我想得到五阶的结果,因为轨迹的二阶导数在其二阶导数中不能有任何毛刺。
matlab spline() 函数的问题是,每个 x 值必须始终只有一个 y 值。我尝试了一个简单的二维示例,无穷大符号 (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) < x(i+1)
Forward going half of the lemniscate
所以现在这会导致以下问题:
Matlab 样条函数是否完全适合我的问题?关于它需要在五次导数中连续的事实,是否可以解决有时我需要在各个方向的各个维度上进行的问题?
如果不行,怎么走? B 样条曲线的问题在于,它们不通过输入点。一位朋友提到我应该使用五阶多项式并将它们连接起来。他说我需要分别为每个维度做这件事。有谁能向我解释一下吗?
感谢您的帮助!
我借助以下代码解决了这个问题(归功于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
我尝试在 Matlab 中的 3D space 中连接几个点(有时几千个)。轨迹可以在任何方向上,在任何维度上向前和向后移动。我想得到五阶的结果,因为轨迹的二阶导数在其二阶导数中不能有任何毛刺。
matlab spline() 函数的问题是,每个 x 值必须始终只有一个 y 值。我尝试了一个简单的二维示例,无穷大符号 (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) < x(i+1)
Forward going half of the lemniscate
所以现在这会导致以下问题:
Matlab 样条函数是否完全适合我的问题?关于它需要在五次导数中连续的事实,是否可以解决有时我需要在各个方向的各个维度上进行的问题?
如果不行,怎么走? B 样条曲线的问题在于,它们不通过输入点。一位朋友提到我应该使用五阶多项式并将它们连接起来。他说我需要分别为每个维度做这件事。有谁能向我解释一下吗?
感谢您的帮助!
我借助以下代码解决了这个问题(归功于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