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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



де x1, y1 – координати лівого верхнього кута, x2, y2 - координати правого нижнього кута прямокутника.

Область всередині прямокутника не зафарбована і співпадає за кольором з фоном.

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

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

яка малює зафарбований прямокутник. Колір зафарбовування встановлюється за допомогою SetFillStyle. Ще одна ефектна процедура:

Bar3D (x1, y1, x2,y2, d: integer, а:boolean)

викреслює тривимірний закрашений прямокутник (паралелепіпед). При цьому використовуються тип і колір зафарбовування, встановлений за допомогою SetFillStyle. Параметр d є числом пікселів, задаючих глибину тривимірного контура. Частіше всього його значення рівне четверті ширини прямокутника (d:=(x2-x1)div4). Параметр а визначає, будувати над прямокутником вершину (а:=True) чи ні (а:=False).

Приклади використовування:

1. SetColor(Green);

Rectangle (200, 100, 250,300);

2. SetFillStyle(1,3);

Bar(10,10,50,100);

3. SetFillStyle(1,3);

Bar3D(10,10,50,100,10,True);

 

Побудова багатокутників.

Багатокутники можна малювати самими різними способами, наприклад за допомогою процедури Line. Проте в Турбо Паскалі є процедура DrawPoly, яка дозволяє будувати будь-які багатокутники лінією поточного кольору, стилю і товщини. Вона має формат

DrawPoly(а: word, var PolyPoints).

Параметр PolyPoints є параметром, який містить координати кожного перетину в багатокутнику, що не типізується. Параметр а задає число координат в PolyPoints. Необхідно пам'ятати, що для креслення замкнутої фігури з N вершинами потрібно передати при зверненні до процедури DrawPoly N+1 координату, де координата вершини з номером N буде рівна координаті вершини з номером 1.

Проілюструємо на прикладі:

Pogram tr; {Програма креслить всередині екрану трикутник червоною лінією}

uses crt, graph;

var gd, gm: integer;

pp: array[1..4] PointType;

xm, ym, xmaxD4, ymaxD4:word;

Begin

gd:= detect;

Initgraph(gd, gm, ‘ с/bp’);

xm:=GetmaxX;

ym:=GetmaxY;

xmaxD4:=xm div 4;

ymaxD4:= ym div 4;

{визначення координат вершин}

pp[1].x:= xmaxD4;

pp[1].y:= ymaxD4;

pp[2].x:= xm - xmaxD4;

pp[2].y:= ymaxD4;

pp[3].x:= xm div 2;

pp[3].y:= ym - ymaxD4;

pp[4]:=pp[1];

SetColor(4); {колір для креслення}

DrawPoly(4,pp); {4 – кількість перетинів +1}

readln;

CloseGraph

End.

В результаті роботи програми на екрані з'явиться червоний трикутник на чорному фоні. Змінити фон усередині трикутника можна за допомогою процедури

FillPoly(а: word, var PolyPoints).

Значення параметрів ті ж, що і в процедурі DrawPоly. Дія теж аналогічна, але фон усередині багатокутника зафарбовується.

Як приклад намалюємо в лівій верхній частині екрану чотирикутну зірку зеленого кольору:

program g;

uses crt, graph;

Const

Star:array[1..18]integer=(75,0,100,50,150,75,100,100,75,150,50,100,0,75,50,50,75,0);

Var

gd, gm: integer;

Begin

gd:= detect;

initgraph(gd, gm, ‘ с/bp’);

SetFillStyle(1,2);

FillPoly(9,Star); {9 – кількість перетинів + 1}

CloseGraph;

End.

Побудова дуг і кіл.

Процедура креслення кола поточним кольором має наступний формат:

Cicrle(x, у, r: word),

де x, у – координати центру кола, r – її радіус.

Наприклад, фрагмент програми забезпечить виведення яскраво-зеленого кола з радіусом 50 пікселів і центром в точці (450,100):

SetColor(LightGreen);

Circle(450, 100, 50);

Дуги можна креслити за допомогою процедури

Arc(x, у: integer, а, b, R:integer),

де x, y- центр кола, а, b - початковий і кінцевий кути в градусах, R – радіус. Для задання кутів використовується полярна система координат.

Колір для креслення встановлюється процедурою SetColor. У разі a=0 і b=360, креслимо повне коло.

Наприклад, виведемо дугу червоного кольору від 0 до 90° в уже накресленій за допомогою Circle(450, 100, 50) кола:

SetColor(Red);

Arc(450, 100, 0, 90,50);

Для побудови еліптичних дуг призначена процедура

Ellipse (x, у: integer, а, b, Rx, Ry: integer),

де x, у – центр еліпса, Rx, Ry - горизонтальна і вертикальна вісі. У разі a=0 і b=360 креслимо повний еліпс. Наприклад побудуємо голубий еліпс:

SetColor(9);

Ellipse(100, 100, 0, 360, 50,50);

Фон всередині еліпса співпадає з фоном екрану. Щоб створити зафарбований еліпс, використовується спеціальна процедура

FillEllipse (x, у: integer, Rx, Ry: integer).

Зафарбовування еліпса здійснюється за допомогою процедури

SetFillStyle (а, b: word)

де а – стиль зафарбовування (таблиця 4), b – колір зафарбовування (таблиця 1). Наприклад, намалюємо яскраво-червоний еліпс, заповнений рідко точками зеленого кольору:

SetFillStyle(WideDotFill, Green); { установка стилю заповнення}

SetColor(12); {колір креслення еліпса}

FillEllipse(300, 150, 50, 50);

Таблиця 7.5

Стандартні стилі заповнення

Константа Значення Маска
Emptyfill   Заповнення кольором фону
Solidfill   Заповнення поточним кольором
Linefill   Заповнення символами --, колір – color
Ltslashfill   Заповнення символами // нормальної товщини, колір – color
Slashfill   Заповнення символами // подвоєної товщини, колір – color
Bkslashfill   Заповнення символами \\ подвоєної товщини, колір – color
Ltbkslahfill   Заповнення символами \\ нормальної товщини, колір – color
Hatchfill   Заповнення вертикально-горизонтальним штрихуванням тонкими лініями, колір – color
Xhatchfill   Заповнення штрихуванням навхрест по діагоналі «рідкісними» тонкими лініями, колір – color
Interleavefill   Заповнення штрихуванням навхрест по діагоналі «частими» тонкими лініями, колір – color
Widedotfill   Заповнення «рідкісними» точками
Closedotfill   Заповнення «частими» точками
Userfill   Заповнення по певній, визначегній користувачем масці заповнення, колір – color

 

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

1) PieSlice (x, у: integer, а, b, R: word), яка малює і заповнює сектор круга. Координати x, у – центр кола, сектор малюється від початкового кута а до кінцевого кута b, а зафарбовування відбувається при використовуванні спеціальних процедур;

2) Sector (x, у: integer, а, b, Rx, Ry: word), яка створює і заповнює сектор в еліпсі. Координати x, у – центр, b, Rx, Ry – горизонтальний і вертикальний радіуси, і сектор креслиться від початкового кута а до кінцевого кута b.

Приклад використовування PieSlice:

SetFillStyle(10, 10); {установка стилю}

SetColor(12); {колір викреслювання}

PieSlice(100, 100, 0, 90, 50);

Приклад використовування Sector:

SetFillStyle(11, 9); {установка стилю}

SetColor(LightMagenta); {колір викреслювання}

Sector(300, 150, 180, 135, 60, 70);

 

Робота з текстом.

Виведення тексту.

Зображення, що виводяться на екран, краще всього супроводжувати текстом пояснення. В графічному режимі для цього використовуються процедури OutText і OutTextXY.

Процедура OutText(Textst: string) виводить рядок тексту, починаючи з поточного положенням покажчика. Наприклад,

OutText(‘натисніть будь-яку клавішу”);

Недолік цієї процедури – не можна вказати довільну точку початку виведення.

В цьому випадку зручніше користуватися процедурою

OutTextXY(x, у: integer, Textst: string),

де x, у – координати точки початку виведення тексту, Textst – константа або змінна типа String. Наприклад,

OutTextXY(60, 100, ‘натисніть будь-яку клавішу”)

 

Виведення чисельних значень.

В модулі Graph немає процедур, призначених для виведення чисельних даних. Тому для виведення чисел спочатку потрібно перетворити їх в рядок за допомогою процедури Str, а потім підключити за допомогою ‘+’ до рядка, що виводиться.

Наприклад:

Max:=34.56;

Str(Max:6:2,Smax) ;{результат перетворення знаходиться в Smax}

OutTextXY(400, 40, ‘Максимум=’ + Smax);

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

1) function IntSt(Int: integer): string;

var Buf: string[10];

Begin

Str(Int, Buf);

IntSt:= Buf;

end;

2) function RealSt(R: real, Dig, Dec: integer): string;

var Buf: string[20];

Begin

Str(R: Dig: Dec, Buf);

RealSt:= Buf;

end;

Ці функції вказуються як параметри в процедурах OutText і OutTextXY. Наприклад:

x:= 5.295643871;

OutTextXY(20, 20, ‘x=’+RealSt(x,11,9));

В результаті на екрані з'явиться x=5.29564443871

 

Шрифти.

Виведення тексту в графічному режимі може здійснюватися різними стандартними (таб. 7.6) і призначеними для користувача шрифтами.

Розрізняють два типи шрифтів: растрові і векторні. Растровий шрифт задається матрицею точок, а векторний – рядом векторів, що становлять символ.

За замовчуванням після ініціалізації графічного режиму встановлюється растровий шрифт DefaultFont, який, як правило, є шрифтом, драйвером клавіатури, що використовується.

Більшість стандартних шрифтів не містить російських символів. Розробка ж власних шрифтів – досить складний і трудомісткий процес. Він може бути прискорений, якщо скористатися спеціалізованими пакетами TurboFont, BgiToolKit.

Встановити потрібний шрифт можна процедурою

SetTextStyle(Font,d,c:word),

де Font – вибраний шрифт, d – напрям (горизонтальне або вертикальне), с – розмір символів, що виводяться. Можливі значення двох перших параметрів представлені в Таблиці 7.6.

Таблиця 7.6

Стандартні шрифти

Шрифт Файл
Triplexfont Trip.chr
Smallfont Litt.chr
Sansseriffont Sans.chr
Gothicfont Goth.ch

 

При організації вертикального виведення необхідно враховувати, що якщо не встановити точку початку виведення за допомогою MoveTo, то текст починається з нижнього рядка екрану і продовжується вгору. Величина символів встановлюється коефіцієнтом с. Якщо с=1, то символ будується в матриці 8х8, якщо с= 2, то матриця 16х16 і т.д. до 10-кратного збільшення.

Наприклад виведемо 2 рядки (вертикальний і горизонтальний) шрифтом DefaultFont різної величини:

SetTextStyle(0,11); {букви стандартної величини}

OutTextXY(200,200, ‘Вертикальний рядок’);

SetTextStyle(0,0,2); {розмір букв збільшений}

OutTextXY(200,220, ‘Горизонтальний рядок’);

Вирівнювання тексту.

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

SetTextJustify(Horiz, Vert: word)

як по вертикалі, так і по горизонталі за допомогою задання параметрів Horiz і Vert (можливі значення в таб.і 7.7.

Таблиця 7.7

Параметри вирівнювання.

Параметр Значення Коментарі
Горизонтальне вирівнювання
Lefttext   Вирівняти вліво
Centertext   Центрувати
Righttext   Вирівнятивуправо
Вертикальне вирівнювання
Bottomtext   Перемістити вниз
Centertext   Центрувати
Toptext   Перемістити вгору

Як приклад виведемо x2:

SetTextJustify(1, 1);

OutTextXY(100,100, ‘X’);

SetTextJustify(1, 0);

OutTextXY(108,100, ‘2’);

Побудова графіків функцій.

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

Дотепер при створенні малюнків використовували тільки перший квадрант системи координат. Для побудови більшості функцій в необхідному інтервалі зміни необхідно працювати хоча б в двох квадрантах. В загальному випадку корисно зображати систему координат в будь-якій частині площини, але найбільш наочно розташовувати її в центрі екрану. В таких випадках, встановивши початок координат в точці (x0, y0) на екрані, можна координати (x, у) довільної точки кривої визначати різницею (x-x0, y-y0). Після цього в програмі можна вживати не тільки позитивні, але і від’ємні значення.

Малюнок виходить маленьким, тому вимагається збільшити масштаб зображення. Якщо для функції буде використаний весь екран, треба збільшити малюнок по x і по у залежно від вибраного екрану.

Вибрати масштаб збільшення можна таким чином:

- визначити горизонтальний і вертикальний розміри графіка (для цього вводяться межі області значень і визначаються максимальне і мінімальне значення функції на заданій області визначення, потім обчислюються різниці максимального і мінімального значень аргументів і функції, які і є горизонтальними і вертикальними розмірами графіка відповідно);

- визначити масштаб (спочатку визначаються масштаби зображення по горизонталі і вертикалі з врахуванням розмірів вибраного екрану по формулі:

масштаб(г/в)= розмір екрану (по г/в) / розмір графіка (по г/в),

потім з них вибирається менший, який і приймається за необхідний масштаб. В нашому випадку графічний екран має розміри 640 на 480.

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

Оскільки на екрані можна одержати лише обмежену кількість значень х, то їх перебираємо за допомогою циклу.

Приклад. Побудувати графік функції y=x2

Варіант 1

program f;

uses graph;

var gd, gm: integer;

x, у: real;

Begin

gd:= detect;

initgraph(gd, gm, ‘c/ bp’);

SetColor(5);

Line(0, 240, 640, 240);

Line(320, 0, 320, 480);

x:= -20;

While x<=20 do

Begin

у:= -Sqr(x);

PutPixel(x *5 + 320, y*5 +240, 15);

x:=x + 0.01; end; end.

Варіант 2

program f;

uses graph, crt;

var gd, gm: integer;

x, у, mx, my, m,x1, x2, y1, y2,h: real;

function f(x:real): real;

Begin

f:= Sqr(x);

end;

clrscr;

Write(‘ Введіть межі відрізка’ ); Read(x1, x2);

y1:=f(x1);

y2:=f(x2);

mx:=640 /(x2 –x1);

my:=480 / (y2 – y1);

If mx< my Then m:=mx else m:= my;

h:= 1/m; x:=x1;

gd:= detect;

initgraph(gd, gm, ‘c/ bp’);

SetColor (5);

Line(0, 240, 640, 240);

Line(320, 0, 320, 480);

While x<= x2 do

Begin

у:= -f(x);

PutPixel(x *m +320, y*m +240, 15);

x:= x+ h;

end;

End.

Розглянемо побудову графіка функції, заданої параметрично. На відміну від функції, заданої в явному виді y=f(x), параметр х в цьому випадку також є функцією, залежною від деякого значення.

Приклад. Побудувати графік функції (кардіоїда).

x = а cos t (1+ cost), у = а sin t(1+cost), а > 0, t I [0, 2p)

Приведемо фрагмент програми:

SetColor (5);

Line(0, 240, 640, 240);

Line(320, 0, 320, 480);

t:=0;

а:=3;

While t<= 3.1415 do

Begin

x:=a*cos(t)*(1+cos(t));

у:= - а sin(t)*(1+cos(t));

PutPixel(x*5 +320, y*5 +240, 15);

x:= x+ 0.01;

end;

 



Поделиться:


Последнее изменение этой страницы: 2016-04-26; просмотров: 86; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.117.158.47 (0.087 с.)