82 lines
2.1 KiB
ObjectPascal
82 lines
2.1 KiB
ObjectPascal
//Программа "Щупальца". Порт с midletPascal :)
|
||
|
||
uses
|
||
GraphABC;
|
||
|
||
const
|
||
S = 14; // Кол-во щупалец
|
||
N = 18; // Кол-во звеньев в каждом из них
|
||
W = 2; //Ширина щупалец
|
||
|
||
var
|
||
i, j: Integer;
|
||
x, y: Real;
|
||
tx, ty: Real;
|
||
k, d: Real;
|
||
|
||
// Углы поворота звеньев относительно друг-друга
|
||
a: array [1..N] of Real;
|
||
|
||
// Длина одного звена
|
||
len: Real;
|
||
|
||
begin
|
||
Pen.Width := W;
|
||
SetWindowSize(320, 320);
|
||
SetWindowTitle('Щупальца');
|
||
|
||
if Window.Width > Window.Height then
|
||
len := Window.Height / 1.8 / N
|
||
else
|
||
len := Window.Width / 1.8 / N;
|
||
k := random(360) * pi / 180;
|
||
d := pi * 2 / S;
|
||
|
||
var k1 := 1;
|
||
|
||
// Главный цикл
|
||
repeat
|
||
|
||
if Window.Width > Window.Height then
|
||
len := Window.Height / 1.8 / N
|
||
else
|
||
len := Window.Width / 1.8 / N;
|
||
|
||
LockDrawing(); //Блокируем рисование(для оптимизации)
|
||
ClearWindow(ClBlack); // Стираем всё
|
||
|
||
// Расчёт коэфицента поворота
|
||
if random(50) = 0 then
|
||
k := random(360) * pi / 180;
|
||
|
||
// Поворот всех щупалец
|
||
a[1] := a[1] + sin(k) / 15;
|
||
|
||
// Интерполяция углов между щупальцами
|
||
for i := 2 to N do
|
||
a[i] := a[i] + (a[i - 1] - a[i]) * 0.1;
|
||
for j := 0 to S - 1 do
|
||
begin
|
||
x := 0.5 * Window.Width;
|
||
y := 0.5 * Window.Height;
|
||
for i := 2 to N do
|
||
begin
|
||
SetPenColor(Color.FromArgb(255, trunc(255 - 255 * i / N), 255));
|
||
|
||
// Немного школьной тригонометрии :)
|
||
tx := x + cos(j * d + a[i]) * len;
|
||
ty := y + sin(j * d + a[i]) * len;
|
||
Line(trunc(x), trunc(y), trunc(tx), trunc(ty));
|
||
x := tx;
|
||
y := ty;
|
||
end;
|
||
end;
|
||
Redraw(); //Перерисуем изображение
|
||
|
||
k1 += 1;
|
||
SetWindowTitle('Щупальца( Средн. FPS ' + Format('{0,5:f2}',k1/Milliseconds*1000)+')');
|
||
|
||
sleep(5);
|
||
until false;
|
||
|
||
end. |