Lansdscape
Waves
How to make nice wave animations on a landscape terrain.
The code is from Paulo R. T. Britto (secneb@hotmail.com, abritto@svn.com.br).
waves.zip (6kb) - demo DOS executable. Use mouse buttons to change wave parameters.
The original pascal source:
Uses Virt_Memory,crt;
{Eu mapiei um trapezio e subtrair dele uma altura que e dada pelo
somatorio de varias funcoes de oscilacao harmonica,
gerando uma sitense de Fourier
Paulo R. T. Britto email :
secneb@hotmail.com
abritto@svn.com.br
P.S.: Qualquer problema com o entendimento(nao acredito que voce tera algum)
pode me contactar.E se sinta a vontade p/ dar o destino que voce bem entender
ao codigo }
Var
buf1,buf2:pointer;
pt,x,y,tz,t:real;
q:integer;
{uma funcao de cosseno comum de oscilacao }
Function z(x,t:real;A,k,c:Real):real;
Begin
z:=((A*cos(pi*(k*(x-c*t))/180)));
End;
{da a altura aos pontos mapeados sobre o trapezio}
Procedure Height(x,y,z:real;c:byte);
Var
Tx,Ty:integer;
Begin
Tx:=Round((x));
Ty:=Round((100+(q)*4)-z);
Mem[s_virscr:320*ty+tx]:=c;
End;
Var
dudx,dudy:real;
lx,rx:real;
f:real;
Begin
Asm
Mov ax,013h
Int 010h
End;
Getmem(buf1,64000);
Cls(buf1,64000);
S_virscr:=seg(buf1^);
T:=1;
While not(Keypressed) do
Begin
dudy:=(320-220)/20; {inclinacao das arestas }
Lx:=100;
Rx:=220;
If mouseleft then
f:=f+0.1;
If mouseright then
f:=f-0.1;
For Q:=0 to 19 do
Begin
dudx:=(Rx-Lx)/20; { distancia entre um ponto e outro ao longo de x}
x:=lx; pt:=t;
While X<(Rx) do
Begin
{sintese de Fourier cada z(..) eh uma funcao cosseno}
tz:=Round(z(x,q,2,-f,-2)+z(x,t,2,5,1)+z(x,t,1,4.5,1)){};
{mapea o ponto sobre o trapezio com a altura tz}
Height(x,y,tz,2);
x:=x+dudx;
t:=t+12.2;{}
End;
t:=pt;
Rx:=Rx+dudy;
lx:=lx-dudy;
T:=T+0.15;
End;
Move_to_video(Buf1);
Cls(Buf1,64000);{}
End;{}
freemem(Buf1,64000);
End.
End.
Start page