Флюид

Untitled.jpeg

Построить алгоритм имитации флюида.

Используя функцию синуса, мы считаем изменения насыщенности цвета, которая меняется в каждой точке на каждом шаге, в зависимости от значений синуса и косинуса угла. Угол изменяется в зависимости от направления движения.

SinTab[i] := Round( 60 * Sin( i * Pi / 128));
...
dX := Round( DistX * Sin( Angle));
dY := Round( DistY * Cos( Angle));
...

Палитра.
Цветовая палитра RGB задаётся при помощи функции SetRGBColor, с использованием функции синуса и косинуса

for i := 0 to 255 do SetRGBColor( i, Round(Abs(63 * Sin (i*Pi/256))),
                                     Round(Abs(63 * Sin( i * Pi/128))),
                                     Round(Abs(63 * Cos( i * Pi/256))));

Также реализован эффект изменения расстояния до поверхности

  ...
  Inc( DistX, dD);
  Inc( DistY, dD);
  If (DistX < 100) Or (DistX > 2000) Then dD := -dD
  ...

Uses DemoVga,Crt;
 
Var
  SinTab : Array[0..255] Of Byte;
  K,I,J,x,y : Integer;
  Angle : Real;
  A : LongInt;
  DistX,DistY : Integer;
  dD : Integer;
  dX,dY : Integer;
  S,T,O : Word;
 
Begin
 InitDemoPart;  //инициализируем память для хранения изображения
 for i := 0 to 255 do SinTab[I] := Round( 60 * Sin( i * Pi / 128));
 
 for i := 0 to 255 do SetRGBColor( i, Round(Abs(63 * Sin (i*Pi/256))),
                       Round(Abs(63 * Sin( i * Pi/128))),
                       Round(Abs(63 * Cos( i * Pi/256))));
 
 DistY := 1400;  //размер поверхности по Y 
 DistX := 1400;  //размер поверхности по X
 dD := -10;
 S := 0;
 Repeat
  ClearDBuffer;  //на каждом шаге очищаем память
  Angle := 0;  
  For K := 0 To 4 Do Begin  //двигаемся в 4 стороны
   dX := Round( DistX * Sin( Angle));
   dY := Round( DistY * Cos( Angle));
   A := -160 * LongInt( dX) - 100 * LongInt( dY);
   O := 0;
   For x:= 0 To 199 Do Begin
    T := A;
    For y := 0 To 319 Do Begin
     Inc( Byte(Ptr( Seg( DBuffer^), O)^), SinTab[(S + T Div 256) And 255]);  //в соответствующую ячейку                                              
                                                                      //памяти записываем значение цвета
     Inc( T, dX);
     Inc( O);
    End;
    Inc( A, dY);
   End;
   Angle := Angle + 2.5;
   Inc( S);
  End;
  delay(1000);
  DBuff2Video;
  Inc( DistX, dD);
  Inc( DistY, dD);
  If (DistX < 100) Or (DistX > 2000) Then dD := -dD;
  Inc( S, 3);
 Until KeyPressed;
 
End.

ВложениеРазмер
fluid.rar1.12 кб