2015-12-28 14:25:15 +03:00
|
|
|
|
//Программа "Щупальца". Порт с midletPascal :)
|
2015-05-14 22:35:07 +03:00
|
|
|
|
|
|
|
|
|
|
uses
|
|
|
|
|
|
GraphABC;
|
|
|
|
|
|
|
|
|
|
|
|
const
|
2015-12-28 14:25:15 +03:00
|
|
|
|
S = 14; // Кол-во щупалец
|
|
|
|
|
|
N = 18; // Кол-во звеньев в каждом из них
|
|
|
|
|
|
W = 2; //Ширина щупалец
|
2015-05-14 22:35:07 +03:00
|
|
|
|
|
|
|
|
|
|
var
|
|
|
|
|
|
i, j: Integer;
|
|
|
|
|
|
x, y: Real;
|
|
|
|
|
|
tx, ty: Real;
|
|
|
|
|
|
k, d: Real;
|
|
|
|
|
|
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// Углы поворота звеньев относительно друг-друга
|
2015-05-14 22:35:07 +03:00
|
|
|
|
a: array [1..N] of Real;
|
|
|
|
|
|
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// Длина одного звена
|
2015-05-14 22:35:07 +03:00
|
|
|
|
len: Real;
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
|
Pen.Width := W;
|
|
|
|
|
|
SetWindowSize(320, 320);
|
2015-12-28 14:25:15 +03:00
|
|
|
|
SetWindowTitle('Щупальца');
|
2015-05-14 22:35:07 +03:00
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// Главный цикл
|
2015-05-14 22:35:07 +03:00
|
|
|
|
repeat
|
|
|
|
|
|
|
|
|
|
|
|
if Window.Width > Window.Height then
|
|
|
|
|
|
len := Window.Height / 1.8 / N
|
|
|
|
|
|
else
|
|
|
|
|
|
len := Window.Width / 1.8 / N;
|
|
|
|
|
|
|
2015-12-28 14:25:15 +03:00
|
|
|
|
LockDrawing(); //Блокируем рисование(для оптимизации)
|
|
|
|
|
|
ClearWindow(ClBlack); // Стираем всё
|
2015-05-14 22:35:07 +03:00
|
|
|
|
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// Расчёт коэфицента поворота
|
2015-05-14 22:35:07 +03:00
|
|
|
|
if random(50) = 0 then
|
|
|
|
|
|
k := random(360) * pi / 180;
|
|
|
|
|
|
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// Поворот всех щупалец
|
2015-05-14 22:35:07 +03:00
|
|
|
|
a[1] := a[1] + sin(k) / 15;
|
|
|
|
|
|
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// Интерполяция углов между щупальцами
|
2015-05-14 22:35:07 +03:00
|
|
|
|
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));
|
|
|
|
|
|
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// Немного школьной тригонометрии :)
|
2015-05-14 22:35:07 +03:00
|
|
|
|
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;
|
2015-12-28 14:25:15 +03:00
|
|
|
|
Redraw(); //Перерисуем изображение
|
2015-05-14 22:35:07 +03:00
|
|
|
|
|
|
|
|
|
|
k1 += 1;
|
2015-12-28 14:25:15 +03:00
|
|
|
|
SetWindowTitle('Щупальца( Средн. FPS ' + Format('{0,5:f2}',k1/Milliseconds*1000)+')');
|
2015-05-14 22:35:07 +03:00
|
|
|
|
|
|
|
|
|
|
sleep(5);
|
|
|
|
|
|
until false;
|
|
|
|
|
|
|
|
|
|
|
|
end.
|