玖叶教程网

前端编程开发入门

lua程序在板块模型中的计算机仿真


\documentclass[aspectratio=169]{beamer}
\usepackage{luacode}
\usepackage{animate}
\usepackage{tikz}
\usetikzlibrary{decorations.shapes} 
\tikzstyle{cichang}
=[decoration={crosses},decorate]
\newcommand{\lua}[1]{\directlua{tex.sprint(#1)}} 
\begin{luacode}
	--相关函数
	function vec(ax,ay,az)
	local vec={} vec.x=ax vec.y=ay vec.z=az return vec end
	function multi(a,k)
	local multi={} multi.x=a.x*k multi.y=a.y*k multi.z=a.z*k return multi  end
	function div(a,k)
	local div={} div.x=a.x/k div.y=a.y/k div.z=a.z/k return div end
	function add(a,b)
	local add={} add.x=a.x+b.x add.y=a.y+b.y add.z=a.z+b.z return add end
	function sub(a,b)
	local sub={} sub.x=a.x-b.x sub.y=a.y-b.y sub.z=a.z-b.z return sub end
	function cross(a,b)   local cross= {} 
	cross.x=(a.y*b.z-b.y*a.z)  cross.y=(b.x*a.z-a.x*b.z)
	cross.z=(a.x*b.y-b.x*a.y)  return cross  end 
ma=1 mb=2 mu1=0.3 mu2=0.05 vo=5 g=9.8
t=0 n=0 dt=0.0001  
f1=vec(mu1*ma*g,0,0)
f2=vec(mu2*(ma+mb)*g,0,0)
va=vec(5,0,0) vb=vec(0,0,0)
sa=vec(0,0,0) sb=vec(1.9,0,0)
vaa=vec({},{},{})  vbb=vec({},{},{}) 
saa=vec({},{},{})  sbb=vec({},{},{}) 
vtt={}
repeat
n=n+1
t=t+dt
if(va.x>vb.x) then
a1=div(multi(f1,-1),ma)
a2=div(add(f1,f2),mb)
else
a1=div(multi(f2,-1),ma+mb)
a2=div(multi(f2,-1),ma+mb)
end
va=add(va,multi(a1,dt))
vb=add(vb,multi(a2,dt))
sa=add(sa,multi(va,dt))
sb=add(sb,multi(vb,dt))
N=math.ceil(n/500)
vaa.x[N]=va.x
vbb.x[N]=vb.x
saa.x[N]=sa.x
sbb.x[N]=sb.x
vtt[N]=t
until(va.x<0)
NN=table.getn(vtt)
\end{luacode}
\begin{document}
\begin{animateinline}[controls=all,loop]{10}%
\multiframe{\lua{NN}}{rx=1+1}{
\begin{tikzpicture}
\path(-1,-1)rectangle(12,7);
\begin{scope}[yshift=2cm,scale=0.6]
\foreach \i in {1,2,...,\lua{NN}}{
\fill(\lua{vtt[\i]},\lua{vaa.x[\i]})circle(0.8pt);
\fill(\lua{vtt[\i]},\lua{vbb.x[\i]})circle(0.8pt);}
\fill[red](\lua{vtt[\rx]},\lua{vbb.x[\rx]})circle(2pt);
\fill[green](\lua{vtt[\rx]},\lua{vaa.x[\rx]})circle(2pt);
\draw[-stealth](0,0)--(7,0);
\draw[-stealth](0,0)--(0,6);	
\end{scope}
\begin{scope}
\node[draw,minimum width=4ex,minimum height=3ex](a)at(\lua{saa.x[\rx]},4.5ex){$A$};
\node[draw,minimum width=4cm,minimum height=3ex](b)at(\lua{sbb.x[\rx]},1.5ex){$B$};
\draw(-1,0)--(12,0);
\foreach \k in {1,2,...,60}{
\draw(\k ex,0)--++(-135:1ex);}	
\end{scope}
\end{tikzpicture}	
}
\end{animateinline}
\end{document}

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言