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