Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка з програмування (школа).doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.36 Mб
Скачать

Задача № 638 (1)

Умова: «Баскетбол». Зобразити на екрані відбивання від підлоги, стін та стелі м'яча, що зображається зафарбованим кругом. Для спрощення алгоритму траєкторію руху м'яча вважати ламаною лінією. Силою тертя повітря знехтувати.

Розв'язування: У наведеній нижче програмі описані наступні константи: R—радіус м'яча; Time - час затримки зображення на екрані (підбирається емпіричним шляхом залежно від типу комп'ютера).

Крім того використовуються наступні змінні: х та у вказують на координати області екрана, куди виводиться, а потім звідки витирається зображення; Size та BitMap — використовуються для збереження зображення в оперативній пам'яті (дивись вище); Step_xта Step_y-задають крок, на який пересувається об'єкт при кожному наступному перемальовуванні (теж підбирається емпірично в залежності від типу ПЕОМ).

Перший раз м'яч малюється в лівому верхньому кутку екрану і напрямок його руху - зверху вниз, зліва направо, тому початкові координати області зображення х та у дорівнюють 0, а обидва кроки додатні. Далі, якщо об'єкт долітає до границі екрана, то крок змінюється на протилежний за знаком, і об'єкт починає рухатись у зворотному напрямку. Програма, що реалізує запропонований алгоритм, має наступний вигляд:

Program Example_638_l;

uses crt,graph;

const R=20;

Time = 1000;

Var gd,gm:integer;

X,у:integer; Size:integer;

Step_x,Step_y:integer;

BitMap:pointer;

begin

x:=0; y:=0; Step_x:=5; Step_y:=5;

gd:=VGA; gm:=VGAHi;

XnitGraph (gd,gm,'');

SetColor(brown);

SetFillStyle(1,brown);

FillEllipse(R,R,R,R);

Size :- ImageSize(0,0,2*R,2*R);

GetMeM(BitMap,Size); GetImage(0,0,2*R,2*R,BitMap^);

repeat

delay(Time);

Putlmage(x,y,BitMap^,1);

x:=x+Step_x; y:=y+Step_y;

if (x+2*R >= getmaxx) or (x<=0) then Step_x:=-Step_x;

if (y+2*R >= getmaxy) or (y<=0) then Step_y:=-Step_y;

Putlmage(x,y,BitMap^,1);

until keypressed;

readkey;

CloseGraph;

end.

Третій метод, що дозволяє ще зменшити миготіння мультиплікаційного об'єкта на екрані, це використання графічних сторінок. Відомо, що при ініціалізації графічного режиму ми задаємо два параметри:

Gd - тип графічного адаптера (CGA, EGA, VGA і т.д.);

Gm - режим роботи графічного адаптера.

Залежно від цих параметрів на екран можна виводити зображення з різною роздільною здатністю та палітрою. Крім того, існують деякі режими, що підтримують кілька графічних сторінок, кожна з яких може містити різні зображення. В один момент часу ми можемо бачити тільки одну сторінку, але в той самий момент можемо готувати складне зображення на інших сторінках і потім миттєво виводити їх на екран, зменшуючи таким чином миготіння (людина не бачить малювання окремих деталей пейзажу). Один з таких режимів Gm=VGAMed дозволяє програмісту виводити 16-кольорове зображення з роздільною здатністю 640 на 350 пікселів, при цьому він підтримує дві графічних сторінки.

Для того, щоб скористатися цими сторінками, ми можемо в програмі застосувати дві процедури:

SetActivePage (Page) - задається номер активної сторінки (Page), тобто сторінки, на якій у даний момент буде будуватися зображення;

SetVisualPage (Page) - задається номер візуальної сторінки, тобто тієї сторінки, що являється видимою в даний момент.

У запропонованому режимі існує тільки дві сторінки, що мають номера 0 та 1, тому зміну сторінок можна виконувати змінною Page, що буде змінюватись за наступним законом: Page := 1 - Page, причому активна сторінка стає видимою тільки після того, як на ній повністю побудовано нове зображення.

Покажемо застосування цього прийому на задачі.