Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_Паскал.doc
Скачиваний:
2
Добавлен:
21.09.2019
Размер:
1.21 Mб
Скачать

2. Побудова елементарних зображень

Система координат при роботі з графікою має початок (точку (0,0)) у лівому верхньому куті екрана. Вісь x спрямована вправо, вісь y униз. Очевидно, що всі точки екрана мають цілочисельні додатні координати.

При побудові найпростіших елементів зображень використовуються наступні процедури і функції:

Назва

Призначення

PutPixel(x,y: integer; c: word);

Поставити точку (x,y), використовуючи колір c. Значення кольору звичайно міняється від 0 до 15, замість номера кольору можна вживати колірні константи модуля Graph.

SetColor(c: word);

Установити поточний колір для малювання відрізків, окружностей і т.п. Усі лінії після вживання цього оператора будуть малюватися встановленим кольором.

SetBkColor(c: word);

Установити поточний колір для фону (тобто колір всього екрана).

GetMax; GetMax;

Ці функції повертають максимальні припустимі значення координат x і y, відповідно.

Line(x1,y1,x2,y2: integer);

Малювати відрізок з (x1,y1) у (x2,y2) поточним кольором.

Rectangle(x1,y1,x2,y2: integer);

Малює поточним кольором прямокутник, лівий кут якого – (x1,y1), а правий нижній – (x2,y2).

Circle(x,y: integer; r: word);

Малює поточним кольором коло з центром у точці (x,y) радіуса r.

Arc (x,y: integer; a1,a2,r: word);

Малює дугу кола a1 і a2 – початковий і кінцевий кути (у градусах), відповідно. Кут відраховується традиційно, проти годинникової стрілки, кут величиною 0 відповідає променю y=0, x>0.

Ellipse(x,y: integer; a1,a2,xr,yr: word);

Малює дугу еліпса з півосями xr і yr від кута a1 до a2.

DrawPoly(n: word; P);

Малює багатокутник, кількість сторін у якого – n, а інформація про вершини зберігається в нетипізованому параметрі P. У якості P зручніше за усе використовувати масив із записів, кожна з який містить поля x,y: integer;

MoveTo(x,y: integer);

Ця процедура спирається на поняття поточної позиції. Вона «запам'ятовує» позицію (x,y) на екрані, а надалі з цієї позиції можна малювати відрізки.

LineTo(x,y: integer);

Малює відрізок з поточної позиції в точку (x,y). При цьому поточна позиція переміщається в кінець намальованого відрізка.

MoveRel(dx,dy: integer);

Переміщає поточний покажчик з колишнього положення (x,y) у точку (x+dx,y+dy).

LineRel(dx,dy: integer);

Те ж, що і попередня процедура, але при переміщенні малює відрізок від (x,y) до (x+dx,y+dy).

Get; Get;

Повертають координати поточного покажчика (окремо).

ClearDevice;

Очищає екран.

Усі приведені вище процедури для малювання виконують тільки контурні малюнки (не зафарбовуючи прямокутник, коло чи еліпс усередині). За замовчуванням малювання відбувається з використанням тонкої суцільної лінії, однак товщину і вид лінії можна змінювати за допомогою процедури SetLineStyle(style,pattern,width: word). Розглянемо призначення параметрів цієї процедури.

  1. style ( вид лінії). Тут зручно задавати не конкретні числа, а константи: SolidLn, DottedLn, CenterLn, DashedLn, UserBitLn. Перша позначає суцільну лінію, три наступні – різні види переривчастих ліній, остання — лінію, вид якої визначається користувачем (див. нижче).

  2. pattern – зразок для виду лінії, обумовленого користувачем. Цей параметр вступає в дію лише тоді, коли в попередньому зазначене UserBitLn. Зразок – це фрагмент лінії, заданий у виді числа. Перехід від конкретного фрагмента до числа виконується, наприклад, так:

Зручніше за все переводити отримане число в шістнадцятьковий вид, у нашому прикладі вийде $999C. При зображенні лінії закодований нами фрагмент буде повторюватися стільки разів, скільки потрібно.

  1. width ( товщина лінії. Можна використовувати числа, однак визначені 2 константи: NormWidth і ThickWidth (нормальна і товста лінії).

Перейдемо тепер до малювання зафарбованих фігур. За замовчуванням внутрішня область фігури буде зафарбовуватися білим кольором, причому зафарбування буде суцільним. Для керування кольором і видом зафарбування використовується процедура SetFillStyle(style, color: word); Також як і для стилю лінії, для style передбачені константи: EmptyFill, SolidFill, LineFill, LtSlashFill, SlashFill, BkSlashFill, LtBkSlashFill, HatchFill, XHatchFill, InterleaveFill, WideDotFill, CloseDotFill, UserFill. Перша позначає відсутність зафарбування, друга — суцільне, наступні — різні специфічні види зафарбування, сама остання — афарбування, що задається користувачем. Щоб задати користувальницький зразок зафарбування, потрібно використовувати процедуру SetFillPattern(Pattern: FillPatternType; Color: Word); FillPatternType визначається як array[1..8] of byte, кожен елемент масиву кодує один рядок зразка зафарбування (як і для ліній), а всього таких рядків 8. У результаті зафарбування виконується за допомогою однакових квадратиків 8x8.

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

Назва

Призначення

Bar(x1,y1,x2,y2: integer);

Малює зафарбований прямокутник.

FillEllipse(x,y: integer; xr,yr: word);

Зафарбований еліпс.

FillPoly(n: word; P);

Зафарбований багатокутник.

PieSlice(x,y: integer; a1,a2,r: word);

Зафарбований круговий сектор.

Sector (x,y: integer; a1,a2,xr,yr: word);

Зафарбовує еліптичний сектор.

FloodFill(x,y: integer; Cborder: word);

Виливає фарбу в точку (х,у), звідки вона розтікається в усі сторони, поки не досягне границі кольору Cborder. Якщо такої границі немає чи вона незамкнута, то фарба може залити весь екран.