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; |