Рисуем щупальца (функции sin и cos)

Сделаем программу, которая рисует под музыку вращающиеся "щупальца".

Добавим в проект файл music.mid.

Взять music.mid ("Правая кнопка" -> "Сохранить как").

Приступим к написанию кода:

program vis;

 const
   S = 12; // Кол-во щупалец
   N = 8;  // Кол-во звеньев в каждом из них

 var
   i, j   : Integer;
   x, y   : Real;
   tx, ty : Real;
   k, d   : Real;
 // Углы поворота звеньев относительно друг-друга
   a      : array [1..N] of Real;
 // Длина одного звена
   len    : Real;
  
 begin
 // Инициализация звука
   if not OpenPlayer('/music.mid', 'audio/midi') then // загрузка музыки
     Halt; // ошибка при загрузке (не поддерживается midi формат или звук отключен)
   if not SetPlayerCount(-1) then // проигрывать бесконечное число раз  
     Halt; 
   if not StartPlayer then // начать проигрывание
     Halt;

 // Нам необходимо создать что-то графическое...
 // Расчёт длины звена, в зависимости от размеров экрана
   if GetWidth > GetHeight then
     len := GetHeight/2/N
   else
     len := GetWidth/2/N;
   randomize;
   k := random(360) * pi / 180;
   d := pi * 2 / S; // просто оптимизиация
 // Главный цикл
   repeat
   // Расчёт коэфицента поворота
     if random(50) = 0 then
       k := random(360) * pi / 180;
   // Поворот всех щупалец
     a[1] := a[1] + sin(k)/10;
   // Интерполяция углов между щупальцами
     for i := 2 to N do 
       a[i] := a[i] + (a[i - 1] - a[i]) * 0.1;
   // Рисуем результат (под музыку ;)
      SetColor(0, 0, 0);
      FillRect(0, 0, GetWidth, GetHeight); // Стираем всё
      for j := 0 to S - 1 do
      begin
        x := 0.5 * GetWidth;
        y := 0.5 * GetHeight;
        for i := 2 to N do 
        begin
          SetColor(255, trunc(255 - 255 * i/N), 255);
        // Немного школьной тригонометрии :)           
          tx := x + cos(j * d + a[i]) * len;
          ty := y + sin(j * d + a[i]) * len;
          DrawLine(trunc(x), trunc(y), trunc(tx), trunc(ty));
          x  := tx;
          y  := ty;
        end;
      end;
   // Вывод на дисплей
     repaint;
   until GetKeyClicked = KE_KEY0; // Закрыть приложение при нажатии "0"
   StopPlayer;
 end.

Самыми медленными операциями в этой программе являются вызовы тригонометрических функций (sin и cos). Существует возможность их оптимизации при помощи использования заранее рассчитанных таблиц значений. Помимо этого, скорость работы данного приложения на различных телефонах может быть различной...





 
К содержанию

 
Скачать новую версию данного учебника в одном архиве

Курс находится в процессе разработки, поэтому архив постоянно обновляется!




 
Hosted by uCoz