Matlab 使用';设置';用于更新同一绘图中的任意扩展数据向量
首先是一点背景知识,希望能更容易理解我要做的事情: 我在计算粒子对光子的散射。到目前为止,这一部分一切正常。但是为了可视化结果,我想做以下工作:我展示一个被光子“击中”的3d粒子。光子由正弦波表示,正弦波首先直接传播到它们消失的粒子(这部分工作正常)。同时,当第一个光子的波“进入”粒子时,必须出现一个新的散射(意思是在任意3d方向旋转)波。这也很好,但一次只适用于一个散射波。为此,我将plot3功能与set功能结合使用,以更新for循环中的波位置 但是我想要的是:当n个波的“波列”进入粒子时,n个散射波应该离开粒子,下一个波开始出现,因为前一个波模式已经完全可见。所以我看到越来越多的正弦波从粒子上飞走。以不同的x、y和z增量沿不同方向移动 问题是每个散射波在x、y和z方向上的速度都不同。因此,对于每个波,我需要一个循环来更新每个时间步的位置。此外,“set”仅允许我更新plot3函数的矢量数据,因此一次只能更新一个光子波的数据 我在这个问题上陷得很深。因此,我们高度赞赏任何新的意见或建议:) 我知道附加的代码不是最短的,但这是我能得到的最短的代码,同时仍然正确地显示了所有内容。目前,代码工作正常,但散射波一次只显示一个(发生在“散射波发射”部分,靠近底部)。我已经尝试过几种不同的方法,但结果总是更糟/Matlab 使用';设置';用于更新同一绘图中的任意扩展数据向量,matlab,Matlab,首先是一点背景知识,希望能更容易理解我要做的事情: 我在计算粒子对光子的散射。到目前为止,这一部分一切正常。但是为了可视化结果,我想做以下工作:我展示一个被光子“击中”的3d粒子。光子由正弦波表示,正弦波首先直接传播到它们消失的粒子(这部分工作正常)。同时,当第一个光子的波“进入”粒子时,必须出现一个新的散射(意思是在任意3d方向旋转)波。这也很好,但一次只适用于一个散射波。为此,我将plot3功能与set功能结合使用,以更新for循环中的波位置 但是我想要的是:当n个波的“波列”进入粒子时,n
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
?