«Изобразить периодически движущийся по спирали небольшой закрашенный шарик» - программы на 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-консультирование по программированию
Скайп-консультации

Акция !!!
исходный код комментарии цена минимальная


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


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

Program code