如何为单个传播脉冲设置动画,而不显示其整个范围,并且仅显示脉冲本身,因为其x轴动态变化?

问题描述

here中找到的代码实现了MATLAB脚本,该脚本求解并绘制边界为x = 0和x = 90的一维波动方程。当您在MATLAB中运行脚本时,它会显示单个脉冲从x = 0传播到x = 90并来回反弹。

即使脉冲本身在x方向上只有约20个单位长,该脚本也会显示x的整个范围(即从x = 0到90)。参见下图:

enter image description here

我的问题:如何构造一个如上图所示的假想绿色框,该框仅显示脉冲沿移动的方向,而不显示整个范围?假想的绿色框随脉冲移动。因此,在播放电影时,您看到的只是脉冲和不断变化的x轴限制(例如x = 0到20,然后x = 20到40,然后x = 40到60,依此类推)。

我认为这个问题的答案与camera positionview有关,但我不确定如何。

代码如下:

% 1D wave equation using boundary condition
% Mohammad Ismail Hossain
% Jacobs University Bremen
clc
clear all
c = 1;
l = 4.5;
dt = 0.06;
dx = 0.05;
ldx = 4.5/dx;
x = 1:ldx;
tm = 300;
N = 0.4/dt;
n = 1:8*N;
n0 = 4*N;
En = zeros(tm,ldx);
En0 = zeros(tm,1);
En0(1:8*N) = exp(((-(n-n0).^2)/(2*N^2)));
Ent(1:tm) = 0;
En(1,1) = En0(1);
for p = 2:tm-1
   En(p,1) = En0(p);
   for q = 2:ldx-1
       
       if (q == (ldx/9)*4)||(q == (ldx/9)*5)
           c = sqrt(0.4);
       end
       if ((q > (ldx/9)*4) && (q < (ldx/9)*5))
           c = 0.5;
       end
       if ((q < (ldx/9)*4) || (q > (ldx/9)*5))
           C = 1;
       end
       En(p+1,q) = ((c*dx)/dt)^2*(En(p,q+1)-2*En(p,q)+En(p,q-1)) + 2*En(p,q) - En(p-1,q); 
   end
   plot(En(p,:))
   title(['Time = ',num2str(p+1)]);
   YLIM([-1.5 1.5])
   pause(0.03);
   
end

解决方法

您只需要动态更改func getUserToken() -> String { var userToken = String() let lock = DispatchSemaphore(value: 0) SKCloudServiceController().requestUserToken(forDeveloperToken: developerToken) { (receivedToken,error) in guard error == nil else { return } if let token = receivedToken { userToken = token lock.signal() } } lock.wait() return userToken } 。理想情况下,它应该与波的速度和方向同步,但是很难知道代码在做什么(没有注释,不是很有用的变量名)。

更“自动”的方法是找到波的绝对最大值的位置,并在该位置周围定义xlim。为此,只需在外部循环的末尾添加以下行。另外,将xlim更改为YLIM以避免发生错误:

ylim