Matlab 使用';设置';用于更新同一绘图中的任意扩展数据向量

Matlab 使用';设置';用于更新同一绘图中的任意扩展数据向量,matlab,Matlab,首先是一点背景知识,希望能更容易理解我要做的事情: 我在计算粒子对光子的散射。到目前为止,这一部分一切正常。但是为了可视化结果,我想做以下工作:我展示一个被光子“击中”的3d粒子。光子由正弦波表示,正弦波首先直接传播到它们消失的粒子(这部分工作正常)。同时,当第一个光子的波“进入”粒子时,必须出现一个新的散射(意思是在任意3d方向旋转)波。这也很好,但一次只适用于一个散射波。为此,我将plot3功能与set功能结合使用,以更新for循环中的波位置 但是我想要的是:当n个波的“波列”进入粒子时,n

首先是一点背景知识,希望能更容易理解我要做的事情:

我在计算粒子对光子的散射。到目前为止,这一部分一切正常。但是为了可视化结果,我想做以下工作:我展示一个被光子“击中”的3d粒子。光子由正弦波表示,正弦波首先直接传播到它们消失的粒子(这部分工作正常)。同时,当第一个光子的波“进入”粒子时,必须出现一个新的散射(意思是在任意3d方向旋转)波。这也很好,但一次只适用于一个散射波。为此,我将plot3功能与set功能结合使用,以更新for循环中的波位置

但是我想要的是:当n个波的“波列”进入粒子时,n个散射波应该离开粒子,下一个波开始出现,因为前一个波模式已经完全可见。所以我看到越来越多的正弦波从粒子上飞走。以不同的x、y和z增量沿不同方向移动

问题是每个散射波在x、y和z方向上的速度都不同。因此,对于每个波,我需要一个循环来更新每个时间步的位置。此外,“set”仅允许我更新plot3函数的矢量数据,因此一次只能更新一个光子波的数据

我在这个问题上陷得很深。因此,我们高度赞赏任何新的意见或建议:)

我知道附加的代码不是最短的,但这是我能得到的最短的代码,同时仍然正确地显示了所有内容。目前,代码工作正常,但散射波一次只显示一个(发生在“散射波发射”部分,靠近底部)。我已经尝试过几种不同的方法,但结果总是更糟/

clc
clear all
close all

%-------------------------------------------------------
%Variablen für Animationslänge und Scatter-Frequenz
%-------------------------------------------------------
%Anzahl der Photonen (hat direkten Einfluss auf Animationslänge)
Photons = 3; 
%-------------------------------------------------------
%Background Photowand
%-------------------------------------------------------
a=1.0;
x=-5:0.01:0;
background(1,:) = cosh(x); 
for i =1:80
Background(i,:) = background(:);
end
%--------------------------------------------------------
%Wave Pattern
%--------------------------------------------------------
y_w = (-1*pi:0.01:1*pi);
x_w = 40*ones(length(y_w),1);
x_w(1:length(y_w)) = 0.5*(sin(9*y_w)+sin(10*y_w));
z_w = zeros(length(y_w),1);

xyz_wave = [x_w,y_w',z_w];

%Rotationswinkel für korrekte Darstellung innerhalb des Plots
rotw = 90;

%Rotationsmatrix um Y-Achse
R1 = [cosd(rotw) 0 sind(rotw) ; 0 1 0; -sind(rotw) 0 cosd(rotw)];  

%Rotation um X-Achse
xyz_waveR=xyz_wave*R1;

%Matrix wieder aufspalten in einzelne Vectoren
x_w1 = xyz_waveR(:,1); 
y_w1 = xyz_waveR(:,2);
z_w1 = xyz_waveR(:,3);

%Abhängig von der Anzahl der Photonen wird die Eingangswelle um eine
%weitere Welle verlängert -> Vektor x_w1 wird kopiert und hinten angefügt
y_w2 = reshape(repmat(y_w1',1,Photons)',size(y_w1',1)*1,[]) ;
x_w2 = reshape(repmat(x_w1',1,Photons)',size(x_w1',1)*1,[]) ;
z_w2 = reshape(repmat(z_w1',1,Photons)',size(z_w1',1)*1,[]) ;
d = linspace(-pi*Photons,0,length(y_w2));
%--------------------------------------------------
%coordinates of scatterd photons
x_2r = [0.2823;-0.2565;0.0147];
y_2r = [0.5272; 0.3008; -0.4846];
z_2r = [-0.0756; -0.1863; -0.0930];

%Austrittsvektor wird zunächst mit NaN initialisiert um später mit
%realen Werten zu füllen
x_2rout2(1:length(x_w1),1:Photons)=NaN;
y_2rout2(1:length(x_w1),1:Photons)=NaN;
z_2rout2(1:length(x_w1),1:Photons)=NaN;

for w=1:Photons
 %Calculation of the rotation angles for the scattered wave
    dx(w) = x_2r(w);
    dy(w) = y_2r(w);
    dz(w) = z_2r(w);
    hyp1(w) = sqrt((dy(w)^2)+(dx(w)^2));
    hyp2(w) = sqrt((hyp1(w)^2)+(dz(w)^2));
    alpha(w) = pi-acos(dy(w)/hyp1(w));
    beta(w) = acos(hyp1(w)/hyp2(w));

    %correction of the scattered angles for the rotation of the wave
    %pattern
    if x_2r(w) >=0
        alpha(w)=pi-alpha(w);
    end
    if y_2r(w) >=0 && z_2r(w) <=0
        beta(w)=beta(w)+pi;
    end
    if  y_2r(w) <=0 && z_2r(w) >=0   
        beta(w)=beta(w)+pi;
    end
    if  x_2r(w) >=0 && y_2r(w) >=0 && z_2r(w) >=0
        beta(w)=pi-beta(w);
    end
    if  x_2r(w) >=0 && y_2r(w) <=0 && z_2r(w) >=0
        beta(w)=pi-beta(w)+pi;  
    end
    if  x_2r(w) <=0 && y_2r(w) >=0 && z_2r(w) <=0
        beta(w)=pi-beta(w);
    end
    if  x_2r(w) <=0 && y_2r(w) <=0 && z_2r(w) <=0
        beta(w)=-beta(w); 
    end
    if  x_2r(w) >=0 && y_2r(w) <=0 && z_2r(w) <=0
        beta(w)=beta(w)+pi;
    end
    if  x_2r(w) <=0 && y_2r(w) <=0 && z_2r(w) >=0
        beta(w)=beta(w)+pi; 
    end

    %values used for the shift of the starting position of the scattered
    %wave
    dxx(w)=sin(alpha(w))*pi;
    dyy(w)=cos(alpha(w))*pi;
    dzz(w)=sin(pi-beta(w))*pi;

  %Rotation of the scatterd wave
    R_x = [1 0 0; 0 cos(beta(w)) -sin(beta(w)); 0 sin(beta(w)) cos(beta(w))];
    R_z = [cos(alpha(w)) -sin(alpha(w)) 0; sin(alpha(w)) cos(alpha(w)) 0; 0 0 1 ];

    xyz_wave_1 = xyz_waveR*R_x;
    xyz_wave_2 = xyz_wave_1*R_z;

    %Shift of the starting point of the scattered wave based on the rotation 
    if x_2r(w) >= 0 
         x_2rout(:,w) = xyz_wave_2(:,1)-abs(dxx(w));
    else
         x_2rout(:,w) = xyz_wave_2(:,1)+abs(dxx(w));
    end

    if y_2r(w) >= 0 
        y_2rout(:,w) = xyz_wave_2(:,2)-abs(dyy(w));
    else
        y_2rout(:,w) = xyz_wave_2(:,2)+abs(dyy(w));
    end

    if z_2r(w) >= 0
        z_2rout(:,w) = xyz_wave_2(:,3)-abs(dzz(w));
    else
        z_2rout(:,w) = xyz_wave_2(:,3)+abs(dzz(w));
    end

     if x_2r(w)>=0 && y_2r(w)>=0 && z_2r(w)<=0
     x_2rout(:,w) = xyz_wave_2(:,1)-abs(dxx(w));
     y_2rout(:,w) = xyz_wave_2(:,2)-abs(dyy(w))*0.5;
     z_2rout(:,w) = xyz_wave_2(:,3)+abs(dzz(w));
     end
     if x_2r(w)<=0 && y_2r(w)<=0 && z_2r(w)>=0
      x_2rout(:,w) = xyz_wave_2(:,1)+abs(dxx(w));
      y_2rout(:,w) = xyz_wave_2(:,2)+abs(dyy(w))*0.5;
      z_2rout(:,w) = xyz_wave_2(:,3)-abs(dzz(w));
     end

     %Adding the actual position of the particle to the photon wave
     x_2rout(:,w) = x_2rout(:,w) + 300;
     y_2rout(:,w) = y_2rout(:,w) + 30;
     z_2rout(:,w) = z_2rout(:,w) + 30;

    %scalefunction
     if abs(dy(w)) >= 0.8
    dkk(w) = 11;
    elseif abs(dy(w)) >= 0.95
    dkk(w) = 12;
    elseif abs(dy(w)) <= 0.3
    dkk(w) = 7;
    elseif abs(dy(w)) <= 0.5
    dkk(w) = 8;
    else
    dkk(w) = 10;
    end
end

%-------------------------------------------
%Partikel
%-------------------------------------------
[xs,ys,zs]=sphere(40);
%-------------------------------------------
%Plot
%-------------------------------------------
h_f=figure('color','w');
maximize(h_f);
Ax1=axes;
h_surf = surf(Background,'edgecolor','none','facelighting','gouraud','ambientstrength',0.1);
view(90,0)
colormap(Ax1,gray);
zeta = 0.7;
brighten(zeta)
camlight right 
axis(Ax1,[0 400, 10 75, 2 62])
camzoom(Ax1,2);
axis off
hold on
%----dummyPlots for the wave patterns--------
h_nan = plot3(NaN,NaN,NaN,'LineWidth',1,'color','r');
h_nan2 = plot3(NaN,NaN,NaN,'LineWidth',1,'color','r');

%----Particle--------------------------
h_surf3 = surf(300+xs,30+ys,30+zs);
set(h_surf3,'EdgeColor','none','facecolor','g','facelighting','gouraud','ambientstrength',0.5)
%--------------------------------------
%Zusätzliche Variablen
q = 1;
qq = 1;

dk = 6;
%----------------------

for i = 1 : Photons

pp = 1;
set(h_nan2,'visible','on')

for k = 1:dk:length(x_w)
 vec=ceil((length(x_w2)/(Photons*2*pi))*(0.1*dk));

    if d(length(d))+0.1*k <= 30 && i==1
        set(h_nan,'XData',300+x_w2,'YData',d+0.1*k,'ZData',30+z_w2);

    elseif d(length(d))+0.1*k >= 30 && i == 1  && vec*2*q <= length(x_w2); 
        %let the incomming wave disapear
       x_w2(length(x_w2)-vec*2*q:length(x_w2))=NaN;   
       y_w2(length(x_w2)-vec*2*q:length(x_w2))=NaN;
       z_w2(length(x_w2)-vec*2*q:length(x_w2))=NaN;
        set(h_nan,'XData',300+x_w2,'YData',d+0.1*k,'ZData',30+z_w2);     

        q = q+1;

    end

        if d(length(d))+0.1*k >= 30 && dkk(i)*pp*dk <= length(x_w)  
        %----------------------------------------------------------------
        %----------------------------------------------------------------
        %emitting of scattered wave 
        x_2rout2(1:1+dkk(i)*pp*dk,i)=x_2rout(1:1+dkk(i)*pp*dk,i);
        y_2rout2(1:1+dkk(i)*pp*dk,i)=y_2rout(1:1+dkk(i)*pp*dk,i);
        z_2rout2(1:1+dkk(i)*pp*dk,i)=z_2rout(1:1+dkk(i)*pp*dk,i);
        set(h_nan2,'XData',x_2rout2(:,i)+dx(i)*pp,'YData',y_2rout2(:,i)+dy(i)*pp,'ZData',z_2rout2(:,i)+dz(i)*pp);

        pp = pp + 1;
        qq = pp;
        else 
        set(h_nan2,'XData',x_2rout2(:,i)+dx(i)*qq,'YData',y_2rout2(:,i)+dy(i)*qq,'ZData',z_2rout2(:,i)+dz(i)*qq);
        qq = qq + 3;
        end
        %---------------------------------------------------------------
        %---------------------------------------------------------------
        drawnow 
end
    %Ausblenden der Eingangswelle
    set(h_nan2,'visible','off');
end
clc
清除所有
全部关闭
%-------------------------------------------------------
%可变的für动画Länge和散射频率
%-------------------------------------------------------
%摄影爱好者(hat direkten Einfluss auf Animations Länge)
光子=3;
%-------------------------------------------------------
%背景感光棒
%-------------------------------------------------------
a=1.0;
x=-5:0.01:0;
背景(1,:)=cosh(x);
对于i=1:80
背景(i,:)=背景(:);
结束
%--------------------------------------------------------
%波形
%--------------------------------------------------------
y_w=(-1*pi:0.01:1*pi);
x_w=40*个(长度(y_w),1);
x_w(1:长度(y_w))=0.5*(sin(9*y_w)+sin(10*y_w));
z_w=零(长度(y_w),1);
xyz_波=[x_w,y_w',z_w];
%旋转温克尔für korrekte Darstellung innerhalb des Plots
rotw=90;
%旋转矩阵
R1=[cosd(rotw)0 sind(rotw);0 1 0;-sind(rotw)0 cosd(rotw)];
%旋转um X-Achse
xyz_波=xyz_波*R1;
%einzelne Vectoren中的矩阵wieder-aufspalten
x_w1=xyz_波(:,1);
y_w1=xyz_波(:,2);
z_w1=xyz_波(:,3);
%在这一点上,光照技术的发展是至关重要的
%韦特尔·韦勒·韦勒·韦勒·韦勒·韦勒·韦勒·韦勒·韦勒·韦勒·韦勒·韦勒·韦勒·韦勒·韦克尔·韦勒·韦勒·韦勒·韦勒·韦勒·韦勒·韦勒·韦勒·韦勒·韦勒·韦勒·韦勒·韦勒·韦
y_w2=重塑(repmat(y_w1',1,光子),大小(y_w1',1)*1,[]);
x_w2=重塑(repmat(x_w1',1,光子),大小(x_w1',1)*1,[]);
z_w2=重塑(repmat(z_w1',1,光子),大小(z_w1',1)*1,[]);
d=linspace(-pi*光子,0,长度(y_w2));
%--------------------------------------------------
%散射光子坐标
x_2r=[0.2823;-0.2565;0.0147];
y_2r=[0.5272;0.3008;-0.4846];
z_2r=[-0.0756;-0.1863;-0.0930];
%奥斯特维克托·祖恩·米特(Austrittsvektor wird zunächst)是一名学生
%雷伦·沃滕·祖伦
x_2rout2(1:长度(x_w1),1:光子)=NaN;
y_2rout2(1:长度(x_w1),1:光子)=NaN;
z_2rout2(1:长度(x_w1),1:光子)=NaN;
对于w=1:光子
%散射波旋转角的计算
dx(w)=x_2r(w);
dy(w)=y_2r(w);
dz(w)=z_2r(w);
hyp1(w)=sqrt((dy(w)^2)+(dx(w)^2));
hyp2(w)=sqrt((hyp1(w)^2)+(dz(w)^2));
α(w)=pi-acos(dy(w)/hyp1(w));
beta(w)=acos(hyp1(w)/hyp2(w));
%波旋转时散射角的修正
%图案
如果x_2r(w)>=0
α(w)=πα(w);
结束
如果y_2r(w)>=0&&z_2r(w)=0&&y_2r(w)>=0&&z_2r(w)>=0
β(w)=πβ(w);
结束
如果x_2r(w)>=0&&y_2r(w)=0
β(w)=piβ(w)+pi;
结束

如果x_2r(w)=0&&z_2r(w),请参见:请注意,MCVE中的第一个单词是最小的。试着做一个只有你试图纠正的行为的例子。也就是说,你的动画很酷。我真的不明白。你想有多个散射波,对吗?是什么限制了你让他们进入这个循环?当你画一个。。。。。第二个情节。另外,我很确定你可以很容易地改变速度,只需在每次迭代中移动较少。我面临的问题是“set”只允许我更新一个向量,因此我一次只能显示一个向量的移动,虽然我真的想显示多个单词,但为什么不能多次调用
set
?请参见:请注意,MCVE中的第一个单词是最小的。试着做一个只有你试图纠正的行为的例子。也就是说,你的动画很酷。我真的不明白。你想有多个散射波,对吗?是什么限制了你让他们进入这个循环?当你画一个。。。。。第二个情节。另外,我非常确信,通过在每次迭代中移动较少的向量,可以很容易地改变速度。我面临的问题是,“set”只允许我更新一个向量,因此我一次只能显示一个向量的移动,而我真的想显示多个向量。为什么不能多次调用
set