7 3 2 Заповнення (зафарбовування) довільної замкненої фігури

7.3.2. Заповнення (зафарбовування) довільної замкненої фігури

Процедура FloodFill (X, Y, border) заповнює довільну замкнуту фігуру, використовуючи поточний стиль і колір заповнення. Координати точки (X, Y) вказують, починаючи з якої точки області буде проводитися заливка. Якщо точка знаходиться всередині замкнутої фігури, то буде зафарбована внутрішня область. Якщо фігура не замкнута, то заливка розіллється по всьому екрану. Параметр border вказує колір граничної лінії. Наприклад, зображення деякої замкнутої фігури можна зафарбувати за допомогою двох операторів: SetFillStyle (5, Red); FloodFill (320, 310, Cyan). Тут кольором Red фігура заповнюється символами \\ подвоєною товщини, а межа - кольором Cyan. Точка (320, 310) є деякою внутрішньою точкою цієї області.

7.3.3. Побудова найпростіших геометричних фігур

Лінії і точки. Для побудови зображень часто буває необхідно ставити стартову точку цієї побудови. Для цієї мети в графіку Паскаля передбачено поняття «Поточний покажчик» (CP - CURRENT POINTER), який визначає положення «невидимого курсору». Для переміщення СР в межах екрану монітора, який, як ми знаємо, є першою чверть декартової системи координат, є ряд процедур і функцій. В першу чергу це процедура MoveTo (X, Y), яка переміщує поточний покажчик (CP) в точку з координатами X, Y. Наприклад, процедура MoveTo (200,100) перемістить поточний (невидимий) покажчик в точку екрану з координатами (200, 100).

Для малювання прямих ліній застосовуються три процедури:

Line (X, Y, X1, Y1: integer) малює лінію від точки з координатами (X, Y) до точки (X1, Y1);

LineTo (X, Y) будує лінію з точки поточного положення покажчика в точку з координатами X, Y;

LineRel (dX, dY) будує лінію від точки з поточним становищем покажчика в точку (CpX + dX, CpY + dY), де CpX і CpY - поточні координати Cp. Колір лінії задається оператором SetColor (колір).

TurboPascal дозволяє викреслювати лінії самого різного стилю: тонкі, широкі, штрихові, пунктирні і т.д. Установка стилю проводиться процедурою SetLineStyle (Стиль: word; pattern: word; Товщина: word). Стилі ліній представлені в таблиці 3.

Таб.3. стилі ліній

Які б зображення не виводилися на екран, всі вони побудовані з точок. Для виведення на екран точки використовується процедура РutPixel (X, Y, Колір), яка малює на дисплеї точку (піксель) з координатами X, Y і кольором "Колір".

Нижче слід програма, яка заповнює екран монітора точками, колір яких і їх розташування задається датчиком випадкових чисел Randomize:

Var X, Y, c, d, m: Integer;

d: = Detect; InitGRAPH (d, m, '');

while not keypressed do

Прямокутники. Для побудови прямокутних фігур є кілька процедур. Перша з них - процедура Rectangle (X1, Y1, X2, Y2) креслення прямокутника кольором, заданим попередньо оператором SetColor. Для побудови закрашеного прямокутника використовується процедура: Bar (X1, Y1, X2, Y2). Крім прямокутників можлива побудова і просторових прямокутних фігур за допомогою процедури Bar3D (X1, Y1, X2, Y2. Integer, Depth: Word; Top: Boolean), де X1, Y1, X2, Y2 визначають положення прямокутника, що є «передній» гранню просторової фігури, а параметр Depth визначає "глибину" 3-х мірного прямокутника, який зазвичай дорівнює (X2 - X1 + 1) div 4. (Куб). Параметр Top визначає положення вершини прямокутника відносно передньої межі. Колір заповнення для Bar і Bar3D встановлюється процедурою SetFillStYle.

Дуги і кола. Процедура викреслювання кола поточним кольором мають такий вигляд: Circle (X, Y, Radius: word) де X і Y - центр окружності, а Radius - її радіус. У ряді випадків, зокрема для створення псевдооб'емних фігур, використовуються дуги. Їх можна викреслити з допомогою процедури Arc (X, Y: integer; StAngle, EndAngle, Radius: word) де X, Y - центр окружності, StAngle і EndAngle - початковий і кінцевий кут дуги, заданий в градусах, Radius - радіус дуги.

Еліпси і сектора. Для побудови еліптичних дуг призначена процедура Ellipse (X, Y, StAngle, EndAngle, XR, YR), де X, Y - центр еліпса в дисплейних координатах, XR і YR - горизонтальна і вертикальна осі. Дуга еліпса викреслюється від початкового кута StAngle до кінцевого кута EndAngle поточним кольором. Фон всередині еліпса збігається з фоном екрану. Виходячи з математичних фактів зв'язку еліпса з окружністю, можна малювати дуги і кола (а не еліпса), якщо взяти в цій процедурі рівними значення XR і YR. З іншого боку, для побудови повного еліпса в процедурі Ellipse (X, Y, StAngle, EndAngle, XR, YR) потрібно покласти StAngle = 0, EndAngle = 360.

Щоб створити зафарбований еліпс, використовується спеціальна процедура FillEllipse (X, Y, XR, YR), де X, Y - центр еліпса в дисплейних координатах, XR і YR - горизонтальна і вертикальна осі. Заповнювач встановлюється процедурою SetFillStyle. Очевидно, що для креслення НЕ закрашеного еліпса необхідно в процедурі SetFillStyle вказати колір фону.

Можна створити і заповнити сектор в еліпсі. Для цього використовується процедура Sector (X, Y, StAngle, EndAngle, XR, YR), де X, Y - центр, XR, YR - горизонтальний і вертикальний радіуси, StAngle і EndAngle - початковий і кінцевий кут (в градусах).

Нижче представлена ​​програма роботи з різними типами ліній і зафарбовування фігур різними кольорами.

Var i, d: integer;

SetLineStyle (SolidLn, 0, NormWidth);

SetFillStyle (SolidFill, Red);

Sector (100, 200, 45, 135, 80, 80);

початковим кутом 45, кінцевим кутом 135 і радіусом 80>

SetLineStyle (SolidLn, 0, ThickWidth);

SetFillStyle (SolidFill, Yellow);

Rectangle (300, 10, 400, 70);

FloodFill (350, 50, Red);

SetLineStyle (SolidLn, 0, NormWidth);

SetFillStyle (7, Red);

Cercle (500, 250, 50);

FloodFill (500, 250, Cayan);

Виводтекста. Виведені на екран зображення зазвичай супроводжуються пояснювальним текстом. У графічних режимах для цього використовуються процедури OutText і OutTextXY. Процедура OutText (Text) виводить рядок тексту, починаючи з поточного положення Cp. Процедура OutTextXY (X, Y, Text), де X, Y - координати точки початку виведення тексту (лівий верхній кут виведеного тексту), Text - константа або змінна типу string.

Таб. 5. Таблиця шрифтів

Потрібну величину шрифту можна встановити ще одним способом - за допомогою процедури SetUserCharSize (multX, divX, multY, divY: word). Перші два параметри керують горизонтальним розміром, два останніх - вертикальним. Якщо взяти за 1 ширину стандартного шрифту, то ставлення multX / divX буде встановлювати ширину.

В даній таблиці дані шрифти розміром 0 і мають горизонтальну орієнтацію.

Наведемо приклад програми, яка демонструє застосування різних шрифтів і їх розмірів при виведенні тексту.

Var i, d: integer;

SetTextStyle (DefaultFont, HorizDir, 3);

OutTextXY (5, 1, 'DefaultFont розміром 3');

SetTextStyle (TriplexFont, HorizDir, 1);

SetTextStyle (SmaillFont, 0, 4);

SetTextStyle (DefaultFont, VertDir, 3);

SetTextStyle (TriplexFont, 1, 1);

OutTextXY (5, 3, 'TriplexFont розміром 1');

SetTextStyle (GothicFont, VertDir, 2);

Засоби роботи з фрагментами. Ефект руху в графічному режимі. На додаток до вже розглянутих раніше графічним засобам побудови і виведення зображень є ще ряд додаткових процедур, що дозволяють зберігати і відновлювати окремі фрагменти зображення. Для маніпулювання фрагментом треба в першу чергу дізнатися його розмір. Це робиться за допомогою функції ImageSize (X1, Y1, X2, Y2), де X1, Y1, X2, Y2 - координати верхнього лівого і правого нижнього кута прямокутної області екрана. Функція повертає розмір вказаного фрагмента в байтах. Потім в пам'яті машини виділяється місце під фрагмент. Для цього користуються процедурою GetMem (BitMap, Size), де BitMap - змінна типу pointer, Size - розмір фрагмента, отриманий за допомогою ImageSize.

Описаними вище процедурами можна користуватися для створення на дисплеї будь-яких рухомих об'єктів. Нижче приведена подібна програма.

Var i, d, Size: integer; p: pointer;

SetFillStyle (1, Red);

Size: = ImageSize (18, 220, 42, 244);

While not KeyPressed do

PutImage (i, 220, р ^, NormalPut);

PutImage (i, 220, р ^, NormalPut);

Ця програма реалізує переміщення червоної кульки від лівого краю екрана до правого і назад. Процес припиняється після натискання будь-якої клавіші.

Лабораторна робота №7

Мета роботи. освоїти графічні процедури і функції; навчитися створювати програми побудови на екрані різних зображень, заповнювати їх кольором; освоїти технологію виведення на екран тексту в графічному режимі; організовувати рух графічних об'єктів по монітору.

Для обробки графічної інформації потрібно вміти форматувати графічний режим роботи монітора, знати всі процедури і функції побудови найпростіших графічних примітивів і вміти їх застосовувати для побудови складових (композиційних) фігур. Рух фігур по екрану грунтується на «заїкання» деякого образу в динамічної пам'яті і подальшого його виклику (як правило, в циклі) на екран монітора в послідовних точках, що створює ілюзію його руху. Слід уважно вивчити порядок виклику для цієї мети відповідних процедур і функцій.

Перед виконанням роботи необхідно ознайомитися з теоретичним матеріалом по темі «Програмування графіки».

Приклад 1. Скласти програму побудови узору, утвореного перетином двох сімейств розходяться відрізків, у яких k1 і k2 - відстані між відрізками зліва і справа, а h - зміщення-нахил вниз (вгору) всього сімейства.

Рішення. Побудова горизонтальної лінії здійснюється процедурою line (0, k, 640, k). Якщо потрібно побудувати n ліній, то цю процедурe треба помістити в цикл: for i: = 1 to n do line (0, i * k, 640, i * k). Нахил ліній виходить додаванням кроку h до другої координаті (h> 0, то нахил вниз, h 2 на відрізку [a, b].

Рішення. Для побудови графіка функції потрібно розбити відрізок [a, b] на n частин (h - крок розбиття (b-a) / n), а потім проводити за допомогою процедур line і lineto відрізки прямої, який і утворюють ламану лінію графіка функції. Можна, звичайно скористатися і виведенням точки (точкове побудова графіка). У програмі побудуємо функцію обчислення її значень в довільній точці і процедуру побудови по точкам ламаної лінії, що представляє собою графік функції.

Var gD, gM, n: integer;

function f (x: real). real;

Procedure graf (x0, x1, y0, y1, n: word; a, b: real);

Var h, m, x, t1, t2: real;

i, u, v, xv, yv: word;

Вивчаючи программірованіенаязикеПаскаль. учні міцніше засвоюють основи алгоритмізації і программірованіянаязике Бейсік (. методичний комплект з елективного курсу «Програмуємо наязикеПаскаль» включає навчальні посібники і практикум. Попов.