hedgewars/uLand.pas
changeset 173 004493dd60e4
parent 161 d8870bbf960e
child 183 57c2ef19f719
equal deleted inserted replaced
172:5294ada3910b 173:004493dd60e4
   327       yd:= yu - 1;
   327       yd:= yu - 1;
   328     until yd < 0;
   328     until yd < 0;
   329     end;
   329     end;
   330 end;
   330 end;
   331 
   331 
       
   332 function rndSign(num: Double): Double;
       
   333 begin
       
   334 if getrandom(2) = 0 then Result:=   num
       
   335                     else Result:= - num
       
   336 end;
       
   337 
       
   338 
   332 procedure PointWave(var Template: TEdgeTemplate; var pa: TPixAr);
   339 procedure PointWave(var Template: TEdgeTemplate; var pa: TPixAr);
   333 const MAXPASSES = 32;
   340 const MAXPASSES = 32;
   334 var ar: array[0..MAXPASSES, 0..5] of Double;
   341 var ar: array[0..MAXPASSES, 0..9] of Double;
   335     i, k: integer;
   342     i, k: integer;
   336     rx, ry, oy: Double;
   343     rx, ry, ox, oy: Double;
   337     PassesNum: Longword;
   344     PassesNum: Longword;
   338 begin
   345 begin
   339 with Template do
   346 with Template do
   340      begin
   347      begin
   341      PassesNum:= PassMin + getrandom(PassDelta);
   348      PassesNum:= PassMin + getrandom(PassDelta);
   348          ar[i, 1]:= ar[i - 1, 1] + (getrandom * 0.7 + 0.3) * WaveFreqDelta;
   355          ar[i, 1]:= ar[i - 1, 1] + (getrandom * 0.7 + 0.3) * WaveFreqDelta;
   349          ar[i, 2]:= getrandom * pi * 2;
   356          ar[i, 2]:= getrandom * pi * 2;
   350          ar[i, 3]:= WaveAmplMin + getrandom * WaveAmplDelta;
   357          ar[i, 3]:= WaveAmplMin + getrandom * WaveAmplDelta;
   351          ar[i, 4]:= ar[i - 1, 4] + (getrandom * 0.7 + 0.3) * WaveFreqDelta;
   358          ar[i, 4]:= ar[i - 1, 4] + (getrandom * 0.7 + 0.3) * WaveFreqDelta;
   352          ar[i, 5]:= getrandom * pi * 2;
   359          ar[i, 5]:= getrandom * pi * 2;
   353          {$IFDEF DEBUGFILE}
   360          ar[i, 6]:= ar[i, 1] * (getrandom * 2 - 1);
   354          AddFileLog('Wave params ¹' + inttostr(i) + ':');
   361          ar[i, 7]:= ar[i, 1] * rndSign(sqrt(1 - sqr(ar[i, 6])));
   355          AddFileLog('X: ampl = ' + floattostr(ar[i, 0]) + '; freq = ' + floattostr(ar[i, 1]) + '; shift = ' + floattostr(ar[i, 2]));
   362          ar[i, 8]:= ar[i, 4] * (getrandom * 2 - 1);
   356          AddFileLog('Y: ampl = ' + floattostr(ar[i, 3]) + '; freq = ' + floattostr(ar[i, 4]) + '; shift = ' + floattostr(ar[i, 5]));
   363          ar[i, 9]:= ar[i, 4] * rndSign(sqrt(1 - sqr(ar[i, 8])));
   357          {$ENDIF}
       
   358          end;
   364          end;
   359      end;
   365      end;
   360 
   366 
   361 for k:= 0 to Pred(pa.Count) do  // apply transformation
   367 for k:= 0 to Pred(pa.Count) do  // apply transformation
   362     begin
   368     begin
   363     rx:= pa.ar[k].x;
   369     rx:= pa.ar[k].x;
   364     ry:= pa.ar[k].y;
   370     ry:= pa.ar[k].y;
   365     for i:= 1 to PassesNum do
   371     for i:= 1 to PassesNum do
   366         begin
   372         begin
       
   373         ox:= rx;
   367         oy:= ry;
   374         oy:= ry;
   368         ry:= ry + ar[i, 0] * sin(ar[i, 1] * rx + ar[i, 2]);
   375         ry:= ry + ar[i, 0] * sin(ox * ar[i, 6] + oy * ar[i, 7] + ar[i, 2]);
   369         rx:= rx + ar[i, 3] * sin(ar[i, 4] * oy + ar[i, 5]);
   376         rx:= rx + ar[i, 3] * sin(ox * ar[i, 8] + oy * ar[i, 9] + ar[i, 5]);
   370         end;
   377         end;
   371     pa.ar[k].x:= round(rx);
   378     pa.ar[k].x:= round(rx);
   372     pa.ar[k].y:= round(ry);
   379     pa.ar[k].y:= round(ry);
   373     end;
   380     end;
   374 end;
   381 end;