Построить алгоритм имитации флюида. Используя функцию синуса, мы считаем изменения насыщенности цвета, которая меняется в каждой точке на каждом шаге, в зависимости от значений синуса и косинуса угла. Угол изменяется в зависимости от направления движения. SinTab[i] := Round( 60 * Sin( i * Pi / 128)); ... dX := Round( DistX * Sin( Angle)); dY := Round( DistY * Cos( Angle)); ... Палитра. 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.
|
|||||||