«Изобразить периодически движущийся по спирали небольшой закрашенный шарик» - программы на Pascal (графический режим) и Delphi

Задание:
Изобразить периодически движущийся по спирали небольшой закрашенный шарик. Движение прерывается после нажатия клавиши “F9”.

Решение:

В Паскале необходимо инициализировать графический режим…

Поэтому резервируются две переменные:

Var GraphDriver, GraphMode : integer;

А далее в отдельной процедуре, которая будет вызываться в самом начале программы, выполним две команды:

GraphDriver := detect; {автоопределение типа драйвера }
InitGraph(GraphDriver, GraphMode, ''); {Инициализация графического режима}

Определяем центр экрана в декартовых координатах (для начального расположения шара):

x0:=round(GetMaxX/2);
y0:=round(GetMaxY/2);

Выделение памяти под изображения шара и фона и привязка к указателям выглядит следующим образом:

siz:=ImageSize(x0-rs,y0-rs,x0+rs,y0+rs); {определение размера массива}
   GetMem(ps,siz); { выделение памяти под шар }
siz:=ImageSize(x0-2*rs,y0-2*rs,x0+2*rs,y0+2*rs); {определение размера}
   GetMem(pf,siz); { выделение памяти под фон}

Запись изображений шара и фона (участков экрана) в выделенные диапазоны памяти:
(на момент выполнения этих команд, в центре экрана изображен шар, а левый верхний угол чист - фон)

GetImage(x0-rs,y0-rs,x0+rs,y0+rs,ps^);
GetImage(0,0,4*rs,4*rs,pf^);

Конечно, вращение шара по спирали легче осуществить в полярных координатах
(R,V – полярные радиус и угол поворота), а затем преобразовать полярные координаты к декартовым…

Так моделируется вращение по спирали в полярных координатах:

inc(v,3); {полярный угол получает постоянное приращение в цикле}

if ( R<1 ) and (zn=false) then zn:=true;
if ( R>GetMaxY ) and (zn=true) then zn:=false;
if zn then inc(R) else dec(R); {полярный радиус попеременно то растет, то убывает}

А это, собственно, преобразование полярных координат к декартовым

x:=round(x0+R*Cos(v/36)*0.5);
y:=round(y0+R*Sin(v/36)*0.5);

Контроль нажатия клавиши «F9» осуществляется по следующему условию

if keypressed then ch:=readkey; {чтение символа нажатой клавиши в переменную}
if ch=#67 then {F9}
    begin
       mov:=not mov; {остановка или запуск. mov – флаг (логич.переменная) движения}
       …
       ch:=#0;
    end;

Все в сборе скачивайте и смотрите        код на Паскале…

Внимание! Для работы программы на компьютере должны быть установлены драйвера графического режима.


Часть 2. На Delphi.
программа Движение по спирали

Разместим на форме элементы – изображение и таймер:

Image1: TImage;
Timer1: TTimer;

Определим несколько констант:

const rs=25;                    {радиус шара}
const colF=clBlack;        {цвет фона}
const colS=clRed;           {цвет шара}
const dR=1;                    {скорость изменения полярного радиуса}
const dV=3;                    {скорость изменения полярного угла в десятках градусов}

Определим (необходимые, на мой взгляд) переменные модуля:

var
Fon, Shar, Shot :TBitMap;     // битовые матрицы изображений кадра, шара и фона
mov : boolean;                         //показатель-флаг движения
zn_rad, zn_rot : integer;        //знаки полярного радиуса и направления вращения
x0, y0, x, y : integer;               //центр экрана, текущие координаты
R,V :integer;                            //полярные координаты

Суть работы алгоритма проста:
Процедура Movetion формирует кадр и включает таймер… По срабатыванию таймера снова вызывается процедура Movetion. Остановить движение, можно только установив флаг mov:=false;

Для разнообразия, решил использовать два режима вращения.
Один с постоянной линейной скоростью, а второй с постоянной угловой скоростью.
Их переключение возможно только программно (константой).

    Пункты меню понятны интуитивно…
  • Первый:       Запуск - Останов движения.
  • Второй:       Изменение направления вращения (останавливает предыдущий цикл).
  • Третий:       Выход из программы.

Все в сборе скачивайте и смотрите        код на Делфи…

Другие примеры на языке «Delphi»

Другие примеры на языках «Pascal», «PascalABC»




Если на этой странице не нашлось того, что Вы так искали...

         Не расстраивайтесь, не все потеряно... Смело щелкайте...

исходный код на заказ. orenstudent.ru исходный код на заказ. orenstudent.ru Помогите найти и устранить ошибку в исходном коде программы. orenstudent.ru Skype-консультирование по программированию
Скайп-консультации

Акция !!!
Весь код по 49 руб


требуются
школьники!


и СТУДЕНТЫ!
Кому не плевать
на деньги!
Сайт помощи студентам по программированию и информатике

Program code