Matlab中一个物体的螺旋形运动

时间:2018-01-05 04:09:51

标签: matlab math geometry

我在一篇论文中发现了这个等式,它代表了一个物体的螺旋形运动:     enter image description here

当我在Matlab中绘制S向量时,我得到了不同的结果,而不是螺旋形状。

问题出在哪里,是等式还是代码?

l是[-1,1]

中的随机数

r是[0,1]

中的随机向量

b是用于定义对数螺线形状的常数。

Matlab代码:

dim =3;
Max_iter =10;
X_star=zeros(1,dim);
ub = 100;
lb = -100;
X=rand(1,dim).*(ub-lb)+lb;
S = [];
t=0;
while t<Max_iter
    a=-1+t*((-1)/Max_iter);
    r=rand();   
    b=1;              
    l=(a-1)*rand + 1;   
     for j=1:size(X,2)
          D= abs(X_star(j) - X(1,j));    
          X(1,j)= D * exp(b.*l).* cos(l.*2*pi) + X_star(j);
     end
     X_star=X(1,:);

     S = [S X];
     plot(S); 

     t = t+1;
end

1 个答案:

答案 0 :(得分:0)

方程看起来根本不像螺旋。让我们为 3D 做这件事。首先是一些定义:

  • p0,p1 - 螺旋3D点开始和结束的中心
  • r - 螺旋的标量半径
  • m - 标量螺钉(如果不是整数而不是螺钉将不会以相同的角度位置开始和结束)

我们首先需要TBN载体:

n = p1-p0
t = (1,0,0)
if (|dot(n/|n|,t)|>0.9) t = (0,1,0)
b = cross(n,t)
b = r*b / |b|
t = cross(b,n)
t = r*t / |t|

现在我们可以使用TBN作为基础载体进行螺旋运算:

//                 x'                y'         z'
p(a) = p0 + t*cos(2*Pi*m*a) + b*sin(2*Pi*m*a) + n*a

其中a = <0.0,1.0>是您想要的螺旋上的参数。如果您离开此间隔,则会在p0之前和p1之后推断螺旋线。你可以考虑a是时候......

正如您所看到的,方程只是 2D 参数圆(x',y') +线性运动(z'),并通过基矢量转换为p0,p1方向和位置。< / p>

如果您需要 3D 向量的点,交叉和abs值的公式/代码,请参阅:

他们是我的答案的底部。