Робота з величинами. Введення-виведення виразів. Лінійні алгоритми



Сторінка6/8
Дата конвертації04.12.2016
Розмір1,28 Mb.
1   2   3   4   5   6   7   8

FloodFill (x,y, колiр межi) - заповнення замкненої областi з внутрішньою точкою (x,y) ;
Приклад: SetColor(2);
Circle(320,220,100);
SetFillStyle(1,6);
FloodFill(320,220,2);

CleaDevice – процедура, яка очищає екран зафарбовуючи його кольором фону

GetDеvice – функція, яка повертає максимально допустимі номери кольору для заданого режиму

Існує помилкове твердження, що не можна контури зображення малювати чорним кольором, його просто не видно!

Щоб цього недоліку уникнути в програмі або не використовують процедуру
SetBkColor (колiр), а зафарбовують весь екран дисплея прямокутником потрібного кольору, або використовують SetBkColor ( Black), з параметром
Black, а потім малюють прямокутник на весь екран потрібного кольору.

Приклад програми, що демонструє можливі кольори ( роздатковий матеріал):

USES Graph;


VAR
    GD:integer; {тип адаптера}
    GM:integer; {режим екрану}
BEGIN
    GD:= Detect; {автоматичне визначення типу адаптера}
    InitGraph(GD,GM,''); {автоматичний вибір режиму екрану}
    if GraphResult <> 0 then Halt; {GraphResult - повертає код останньої}
виконаної гафічної операції }
    For i:=0 to GetMaxColor do
        Begin
            SetBkColor(i);
            ClearDevice;
            Readln;
        End;
    CloseGraph;

END.
У мові TURBO Pascal є значна кількість графічних процедур і функцій. Нам знадобляться лише деякі з них. Для того, щоб компілятор "дізнавався" їхньої назви, ми повинні після заголовка програми розмістити рядок наступного виду:

uses Graph;

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

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

Найпростіша програма може мати вигляд:



Приклад 1.

PROGRAM Primer_1;

uses Graph;

var Gd,Gm: Integer;

BEGIN

Gd:=VGA; { Графічний адаптер - VGA }



Gm:=VGAHi; { Графічний режим VGAHi (640x480) }

InitGraph (Gd,Gm,'..\bgi'); { Включити графічний режим }

If GraphResult=grOk

then { Якщо режим включився успішно }

{ Намалювати відрізок прямій }

Line (0,0,639,479); ReadLn

END.
Ми бачимо, що в процедури InitGraph три параметри. У якості перших двох фактичних параметрів повинні стояти імена цілих (integer) змінних. Не будемо вдаватися в подробиці, чому це так; замість цього з'ясуємо їхнє призначення.
Перший параметр є кодом графічного адаптера (тобто електронної схеми, що управляє висновком інформації на екран). (Справа в тому, що на IBM-сумісних комп'ютерах застосовується ряд стандартних графічних адаптерів, що носять назви CGA, EGA, VGA.) По нашій програмі можна догадатися, що у використовувані нами комп'ютерах використається адаптер VGA, і компілятор сам "довідається" слово VGA і замінить його на потрібне ціле число (насправді рівне 9, але ми цього можемо й не запам'ятовувати). Кожен графічний адаптер дозволяє використати кілька графічних режимів, що відрізняються кількістю квітів і розв'язною здатністю (надалі ми довідаємося, що це таке). І другий з параметрів саме призначений для того, щоб указати, який із графічних режимів варто включити. Поки що ми обмежимося лише одним графічним режимом VGAHi. Третій параметр є рядком, що містить шлях до файлу, що називається EGAVGA.BGI. У цьому файлі втримується драйвер (така спеціальна програма), необхідний для роботи з адаптерами EGA й VGA. І, як легко побачити з нашого приклада, файл цей перебуває в підкаталозі TPBGI. Все вищевикладене необхідно знати кожному грамотному користувачеві IBM-сумісних комп'ютерів. Однак у нашій лабораторній роботі досить використати конструкцію, використану в першому прикладі, для включення графічного режиму. (І не страшно, якщо в ній не все зрозуміло.) Для того, щоб ми могли що-небудь намалювати на екрані, нам потрібно вміти задавати положення на екрані того, що ми малюємо. Для цього з екраном зв'язується система координат наступного виду:

(0,0) X


+ -і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і->

|

|



|

Y|
Кожна крапка на екрані насправді являє собою дуже маленький прямокутник (і оскільки це не зовсім крапка, то іноді використають спеціальний термін - "піксел"). Кількість крапок (пікселів), що вміщаються на екрані по вертикалі й горизонталі, називають розв'язною здатністю. Розв'язна здатність екрана в режимі VGAHi - 640x480. Це означає, що по горизонталі на екрані вміщається 640 крапок, а по вертикалі - 480.

Крапка в лівому верхньому куті екрана має координати (0,0). Координата X будь-якої крапки екрана лежить у межах від 0 до 639, а координата Y - у межах від 0 до 479.

Як Ви вже догадалися, процедура Line (x1,y1,x2,y2) малює на екрані пряму, що з'єднує крапки (x1,y1) і (x2,y2).



Приклад 2. Зобразити на екрані прямокутний трикутник з вершинами (320, 10), (120,210), (520,210).
PROGRAM Primer_2;

uses Graph;

var Gd,Gm: Integer;

BEGIN


Gd:=VGA; Gm:=VGAHi; InitGraph (Gd,Gm,'..\bgi');

If GraphResult=grOk

then begin

Line (120,210,520,210); { Горизонтальний відрізок }

Line (120,210,320,10); { Лівий катет }

Line (320,10,520,210); { Правий катет }

ReadLn

end;


END.

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

Black=0-чорний

DarkGray=8-темно^-сірий

Blue=1-синій

LightBlue=9-голубо

Green=2-зелений

LightGreen=10- ясно-зелений

Cyan=3-кольори морської хвилі

LightCyan=11-світло^-ціановий

Red=4-червоний

LightRed=12-рожевий

Magenta=5-бузковий

LightMagenta=13-светлосиреневый

Brown=6-коричневий

Yellow=14- жовтий

LightGray=7-світло^-сірий

White=15-білий


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

Приклад 3.

Зобразити той же трикутник, що й у попередньому прикладі, але зробити сторони трикутника різнобарвним.


PROGRAM Primer_3;

uses Graph;

var Gd,Gm: Integer;

BEGIN


Gd:=VGA; Gm:=VGAHi; InitGraph (Gd,Gm,'..\bgi');

If GraphResult=grOk

then begin

SetColor (LightMagenta); { Кольори - світло^-бузковий }

Line (120,210,520,210); { Горизонтальний відрізок }

SetColor (LightCyan); { Кольори - світло^-ціановий }

Line (120,210,320,10); { Лівий катет }

Set Color (Green); { Кольори - зелений }

Line (320,10,520,210); { Правий катет }

ReadLn


end

END.


Приклад 4

Різнобарвні промені.

PROGRAM Primer_4;

uses Graph;

const Center=320;

Center=240;

Radius=200;

var Gd,Gm: Integer;

i : Integer;

dx,dy: Integer;

BEGIN

Gd:=VGA; Gm:=VGAHi; InitGraph (Gd,Gm,'..\bgi');



If GraphResult=grOk

then begin

For i:=0 to 160 do

begin


dx:=Round (Radius*sin(i*pi/80));

dy:=Round (Radius*cos(i*pi/80));

SetColor (i MOD 16);

Line(Center,Center,Center+dx,Center+dy)

end;

ReadLn


end

END.


Приклад 5
Концентричні окружності. Для малювання окружностей використається процедура Circle із трьома целочисленными параметрами, що задають координати центра окружності й радіус.

PROGRAM Primer_5;

uses Graph;

const Center=320;

Center=240;

var Gd,Gm: Integer;

i : Integer;

BEGIN


Gd:=VGA; Gm:=VGAHi; InitGraph (Gd,Gm,'..\bgi');

If GraphResult=grOk

then begin

For i:=0 to 23 do

Circle (Center,Center,i*10);

ReadLn


end

END.


Приклад 6
Різнобарвні концентричні окружності. Для зафарбування замкнутої області використається процедура FloodFill, три целочисленных параметри якої задають початкову крапку зафарбування й код кольорів обмежуюча область лінії. Кольори, яким буде вироблятися зафарбування, нічого загального не має з кольорами, що задають процедурою SetColor. Кольори зафарбування задається другим параметром процедури SetFillStyle. Перший параметр цієї процедури (задающий візерунок для зафарбування) спочатку будемо задавати рівним одиниці (що відповідає суцільному зафарбуванню).
PROGRAM Primer_6;

uses Graph;

const CX=320;

CY=240;


var Gd,Gm: Integer;

i : Integer;

BEGIN

Gd:=VGA; Gm:=VGAHi; InitGraph (Gd,Gm,'..\bgi');



If GraphResult=grOk

then begin

For i:=0 to 23 do

Circle (CX,CY,i*10);

For i:=0 to 23 do

begin


SetFillStyle (1,i MOD 16);

{ Зафарбовувати до границі білих кольорів }

FloodFill (CX,CY+i*10-5,White)

end;


Readln

end


END.

Приклад 7.
PROGRAM Primer_7;

uses Graph;

var grDriver: Integer;

grMode : Integer;

i,x,y : Integer;

{ -і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і- }

PROCEDURE Rect (x,y,x1,y1: Integer);

{ Малює прямокутник, у якого лівий нижній кут }

{ має координати (x,y), а правий верхній - (x1,y1) }

BEGIN


Line (x,y,x,y1); { Ліва сторона }

Line (x1,y,x1,y1); { Права сторона }

Line (x,y1,x1,y1); { Верхня сторона }

Line (x,y,x1,y) { Нижня сторона }

END;

{ --- }


BEGIN

GrDriver:=VGA; GrMode:=VGAHi;

InitGraph (grDriver,grMode,'..\bgi');

If GraphResult=grOk

then begin

For i:=1 to 15 do

begin

x:=i*30; y:=i*25; SetColor (i);



Rect (x,y,x+50,y+60)

end;


ReadLn

end


END.

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



Приклад 8.
Для малювання "заповнених" прямокутників використається процедура Bar. Так само, як і для процедури Rectangle, ми повинні вказати чотири числа - координати двох протилежних кутів прямокутника. (Для процедури Bar кольори задається не за допомогою SetColor, а за допомогою SetFillStyle!).
PROGRAM Primer_8;

uses Graph;

const Step=35;

var grDriver: Integer;

grMode : Integer;

i,x,y : Integer;

{ -і-і-і-і-і-і-і-і-і-і-і-і-і-і-і- }

PROCEDURE Square (x,y: Integer);

{ Малює квітчастий квадрат, центр якого }

{ має координати (x,y) }

var i,d: Integer;

BEGIN


For i:=15 downto 0 do

begin


SetFillStyle (SolidFill,i); d:=i*3+2;

Bar (x-d,y-d,x+d,y+d)

end

END;


{ -і- }

BEGIN


GrDriver:=VGA; grMode:=VGAHi;

InitGraph (grDriver,grMode,'..\bgi');

If GraphResult=grOk

then begin

For i:=0 to 10 do

{ На "побічній" діагоналі - 11 крапок }

begin

x:=50+i*Step; y:=50+(10-i)*Step;



SetColor(i); Square(x,y)

end;


ReadLn

end


END.
При малюванні складних зображень, що містять багато відрізків, виникає досить противна проблема - обчислювати координати всіх крапок. Якщо використати процедуру LineRel, то досить указувати зсуву по обох координатах щодо поточної крапки. Для відносного переміщення без малювання використається процедура MoveRel Для завдання початкових значень координат поточної крапки використається процедура MoveTo

Приклад 9.

Квадратна спіраль.

PROGRAM Primer_9;

uses Graph;

const Center=320;

Center=240;

d=12;

var grDriver: Integer;



grMode : Integer;

i,L : Integer;

{ -і-і-і-і-і-і-і-і-і-і-і-і-і-і-і- }

PROCEDURE Vitok (L,d: Integer);

{ Починаючи від поточної крапки, малює виток спіралі }

{ із чотирьох відрізків довжини, що збільшується, }

{ L - довжина першого відрізка }

{ d - збільшення довжини для кожного з наступних відрізків }

BEGIN

LineRel (L,0); { Зрушитися вправо }



LineRel (0,-(L+d)); { Зрушитися нагору }

LineRel (-(L+2*d),0); { Зрушитися вліво }

LineRel (0,L+3*d); { Зрушитися вниз }

END;


{ -і- }

BEGIN


grDriver:=VGA; grMode:=VGAHi;

InitGraph (grDriver,grMode,'..\bgi');

If GraphResult=grOk

then begin

{ Зробити поточною крапкою центр екрана }

MoveTo (Center,Center);

L:=1; { Початкова довжина відрізка }
For i:=1 to 10 do { 10 витків спирали }

begin Vitok (L,d); L:=L+4*d end;

ReadLn

end


END.

Приклад 10. Невелике містечко.
PROGRAM Domiki;

uses Graph;

var grDriver: Integer;

grMode : Integer;

i,j : Integer;

{ -і-і-і-і-і-і-і-і-і-і-і-і-і-і-і }

PROCEDURE Domik (x,y: Integer);

{ Малює будиночок, у якого лівий нижній кут }

{ має координати (x,y) }

const dx=60; { Ширина фасаду }

dy=40; { Висота фасаду }

dx2=dx DIV 2;

dy2=dy DIV 2;

wx=16; { Ширина вікна }

wy=22; { Висота вікна }

wx2=wx DIV 2;

wy2=wy DIV 2;

BEGIN


Rectangle (x,y,x+dx,y-dy); MoveTo (x,y-dy);

Linerel (dx2,-dx2); { Лівий скат даху }

Linerel (dx2,dx2); { Лівий скат даху }

Rectangle (x+dx2-wx2,y-dy2-wy2,x+dx2+wx2,y-dy2+wy2); { Вікно }

MoveTo (x+dx2,y-dy2); { Центр фасаду (і вікна) }

LineRel (0,wy2); { Вертикальна частина рами вікна }

MoveTo (x+dx2-wx2,y-dy2); { Центр лівої частини рами вікна }

LineRel (wx,0); { Горизонтальна частина рами вікна }

SetFillStyle (SolidFill,Red);

FloodFill (x+1,y-1,White);

SetFillStyle (SolidFill,Blue);

FloodFill (x+dx2,y-dy-1,White)

END;

{ -і- }


BEGIN

grDriver:=VGA; grMode:=VGAHi;

InitGraph (grDriver,grMode,'..\bgi');

If GraphResult=grOk

then begin

For i:=1 to 6 do

For j:=1 to 5 do

Domik (i*80,j*80);

ReadLn

end


END.

Якщо Вас цікавлять інші графічні процедури або функції, то Вам належить звернутися до системи "допомоги" (Help). Для цього в меню Help виберіть пункт Standard units. Серед усього іншого Ви побачите список назв стандартних модулів (неважливо, що ви не знаєте, що це таке). Якщо встановити курсор на слово Graph (цього можна досягти й за допомогою клавіші Tab) і нажати Enter, те на екрані з'явиться загальна інформація про модуль Graph. Для продовження нам пропонується два вибори:

Go to GRAPH.TPU Functions and Procedures

Go to GRAPH.TPU Constants and Types

Якщо вибрати пункт "Перейти до констант і типів GRAPH.TPU", те Ви зможете добратися до такої корисної інформації, як назви графічних режимів й їхній дозвіл, назви квітів, назви стилів зафарбування й т.п. На випадок, якщо Вам захочеться там що-небудь пошукати, приведемо переклад назв деяких пунктів відповідного меню:

Color Constants Колірні константи

Fill Pattern Constants Константи для зразків зафарбування

Graphics Drivers Графічні драйвери

Graphics Modes for Each Driver Графічні режими для кожного драйвера

Вибравши ж пункт "Перейти до процедур і функцій GRAPH.TPU", ми побачимо значний список назв графічних процедур і функцій. Якщо помістити курсор на назву процедури, що сподобалася Вам, (або функції), і нажати "переклад рядка", то Ви побачите короткий опис цієї процедури (функції), і наприкінці - пропозиція подивитися приклад. (Якщо, скажемо, Ви читаєте інформацію про процедуру Ellipse, те в самому кінці Ви побачите слова

Sample Code:

Ellipse.PAS

Якщо встановити курсор на слова Ellipse.PAS і нажати "переклад рядка", те на екрані Ви побачите текст програми, що ілюструє застосування цієї процедури). Ця інформація може придатися навіть тим, хто не знає жодного англійського слова - Ви побачите, скільки в процедури параметрів й які в цих параметрів типи; Ви можете звичайним образом (клавішами керування курсором при натиснутій клавіші Shift) відзначити текст приклада, скопіювати в порожнє вікно й запустити.

Приклад 11 (Е. В. Баранова, РГПУ ім. А. И. Герцена).

Зобразити графік функцииљ0 y=cos(x). При зображенні графіка функції необхідно мати через, що початок графічних координат перебуває в лівому верхньому куті екрана й що графічні координати приймають цілі ненегативні значення в діапазоні (0,maxx) і (0,maxy). Значення maxx й maxy для кожного режиму можна визначити, використовуючи відповідні функції. Таким чином, для одержання "гарного" графіка необхідно виконати поворот і масштабування. Нехай, xmax - максимальне значення по осі x; ymax - максимальне значення по осі y; (x0,y0) - графічні координати центра - крапки (0,0); (xg,yg) - графічні координати крапки (x,y); mx - масштаб по осі x, тобто величина Abs((xg-x0)/x); my - масштаб по осі y, тобто величина Abs((yg-y0)/y). Графічні координати крапки (x,y): xg=x0+mx*x; yg=y0-my*f(x).


PROGRAM Primer_11;

Uses Graph;

var x,y,a,b,h : Real;

x0,y0,xg,yg,xmax,ymax,mx,my,grd,grm,c: Integer;

BEGIN

WriteLn ('Уведіть координати центра: '); ReadLn (x0,y0);



WriteLn ('Уведіть масштаб по x й y: '); ReadLn (mx,my);

WriteLn ('Уведіть область завдання функції по x і крок: ');

ReadLn (a,b,h); WriteLn ('Уведіть кольори зображення: ');

ReadLn (c); grd:=0; grm:=0; InitGraph (grd,grm,'');

c:=getcolor; xmax:=getmaxx; ymax:=getmaxy;

Line (10,y0,xmax-10,y0); { Вісь OX }

Line (x0,10,x0,ymax-10); { Вісь OY }

x:=a;


While x<=b do

begin


xg:=x0+Trunc(mx*x); yg:=y0-Trunc(my*f(x));

If (xg>=0) AND (xg<=xmax) AND (yg>=0) AND (yg<=ymax)

then putpixel (xg,yg,c);

x:=x+h


end;

ReadLn;


closegraph

END.


Приклад 12 (Е. В. Баранова, РГПУ ім. А. И. Герцена).
Зобразити рух кульки по синусоїді.

Рух реалізується за допомогою процедур GetImage й PutImage. Процедура GetImage запам'ятовує образ зображуваного об'єкта й образ області екрана такого ж розміру, зафарбованої кольорами тла. Процедура PutImage на кожному кроці послідовно заміняє старе зображення кольорами тла й створює зображення на новому місці.

PROGRAM Primer_12;

{ Програма руху кульки зі слідом по синусоїді }

uses Graph;

var p1,p2: Pointer;

{ p1 - покажчик на образ "сліду",

p2 - покажчик на образ кульки }

grm,grd,x,y,x1,y1: Integer;

size,c : Word;

BEGIN

grd:=0; InitGraph (grd,grm,'D:\Tp\Bgi');



{ Ініціалізація графічного режиму з автоматичним

визначенням підходящого драйвера }

c:=GetColor; { c - кольори зображення }

x1:=0;y1:=90; { x1,y1 - початкові координати кульки }

PutPixel (0,y1+5,c); { Зображення "сліду" }

size:=ImageSize(0,0,10,10); GetMem (p1,size);

{ size - кількість байтів для зображення квадрата 11x11 }

GetImage (0,y1,10,y1+10,p1^);

{ p1 указує на область пам'яті із зображенням сліду }

SetFillStyle (11,c); { Установлюється тип і кольори зафарбування }

Circle (x1+5,y1+5,5); { Окружність із центром в (x1,y1) }

FloodFill (x1+5,y1+5,c); { Зафарбування окружності }

GetMem (p2,size); GetImage (x1,y1,x1+10,y1+10,p2^);

{ p2 указує на область пам'яті із зображенням кульки }

For x:=1 to 300 do

begin


y:=Trunc (40*sin(0.1*x)+90);

{ x,y - графічні координати нового положення кульки }

PutImage (x1,y1,p1^,0); { На місці кульки зображується слід }

PutImage (x,y,p2^,0); { Кулька зображується на новому місці }

x1:=x; y1:=y { Запам'ятовуються нові координати кульки }

end;


ReadLn; Closegraph

END.


Приклад 13 (Е. В. Баранова, РГПУ ім. А. И. Герцена).
Керування рухом об'єкта.

Напрямок руху визначається натиснутою клавішею (стрілки вліво, вправо, нагору, униз). Крок переміщення вводиться. Реалізація руху характеризується тим, що на кожному кроці запам'ятовується образ області екрана, куди міститься курсор, потім при зсуві курсору зображення відновлюється.


PROGRAM Primer_13;

{ Програма керування рухом курсору.

Курсор - прямокутний об'єкт, що рухається нагору, униз, вправо, уліво при натисканні відповідних стрілок. Вихід при натисканні клавіші ESC }

uses Crt,Graph;

{ Модуль Crt необхідний для використання Readkey }

PROCEDURE BadKey;

{ Процедура формує звук при натисканні неправильної клавіші }

BEGIN


Sound (500); Delay (100); Sound (400);

Delay (200); Nosound

END;

var p,pc: Pointer;



{pc - покажчик на образ курсору,

p - покажчик на образ зображення "під" курсором }

grm,grd,curx,cury,curx0,cury0,lx,ly,hx,hy:integer;

size,c:word; ch:char;

{ grd,grm - змінні для номерів графічних драйверів і режиму curx,cury - координати поточного положення курсору curx0,cury0 - змінні для запам'ятовування координат курсору lx,ly - ширина й довжина курсору прямокутного виду hx,hy - кроки руху курсору по горизонталі й вертикалі }

BEGIN


WriteLn ('Уведіть розміри курсору й кроки руху');

ReadLn (lx,ly,hx,hy);

{ Установка значення системної змінної для забезпечення

сумісності роботи модулів Crt й Graph }

DirectVideo:=FALSE;

grd:=0; InitGraph (grd,grm,'D:\Tp\Bgi');

{ Ініціалізація графічного режиму з автоматичним

визначенням підходящого драйвера }

c:=GetColor; { c - кольори зображення }

size:=ImageSize (0,0,lx,ly);

{ size - кількість байтів для зображення курсору }

GetMem (pc,size); GetMem (p,size);

{ Виділяються області для зберігання образа курсору,

і образа зображення під курсором }

SetFillStyle (1,c); { установлюється тип і кольори зафарбування курсору }

GetImage (0,0,lx,ly,p^);

{ p указує на область пам'яті, де зберігається зображення,

яке буде "закрито" курсором }

curx:=0; cury:=0;

Bar (0,0,lx,ly); GetImage (0,0,lx,ly,pc^);

{ pc указує на область пам'яті із зображенням курсору }
SetColor (6); SetFillStyle (1,2);

Bar3d (150,150,200,30,10,TRUE);

{ Паралелограм, на тлі якої відбувається рух }

Repeat { Цикл по уведенню символу }

ch:=ReadKey; { Уведення чергового символу }

If Ord(ch)=0

then { Натиснута керуюча клавіша }

begin


ch:=ReadKey;

curx0:=curx; cury0:=cury;

{ У змінних curx,cury запам'ятовуються координати курсору }

Case Ord(ch) of

77: If curx

then curx:=curx+hx; { Крок вправо }

75: If curx>hx

then curx:=curx-hx; { Крок уліво }

72: If cury>hy

then cury:=cury-hy; { Крок нагору }

80: If cury

then cury:=cury+hy { Крок униз }

else BadKey { Натиснута "неправильна" клавіша }

end;


If (curx<>curx0) OR (cury<>cury0)

then begin

PutImage (curx0,cury0,p^,0);

{ Відновити зображення, що було "закры-

те" курсором }

GetImage (curx,cury,curx+lx, cury+ly,p^);

{ Запам'ятати те зображення, що буде "задо-

рито" курсором }

PutImage (curx,cury,pc^,0);

{ Установити курсор у нове положення }

end

end


else BadKey

until Ord(ch)=27;

CloseGraph

END.


Побудова діаграм

Нехай є послідовність позитивних дійсних чисел a1, a2, ..., an, що позначає результати яких-небудь вимірів (наприклад, висоти вершин гір над рівнем моря, площі держав, середні оцінки учнів класу й т.д.). Потрібно побудувати визуализированное подання цієї послідовності з метою порівняння отриманих результатів. У таких випадках використають діаграми.



1. Кругові діаграми

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



Для побудови кругової діаграми необхідно просуммировать всі елементи послідовності, після чого знайти відносини кожного з елементів до отриманої суми (так буде обчислено, яку частину кола потрібно поставити у відповідність даній величині, — тобто розраховуються частки кола, що доводяться на дану величину, якщо все коло прийняти рівним 1). Всі ці розрахунки можна представити формулами . Потім ці відносні величини переводяться в градуси: , після чого можна приступати до побудови діаграми.

Алгоритм у цьому випадку буде наступним:



  1. обчислити суму елементів послідовності;

  2. знайти величину сектора, що відповідає кожній величині;

  3. побудувати всі сектори в графічному режимі (у результаті повинен вийти повне коло). Бажано кожен сектор будувати своїми кольорами, або використати різне штрихування, якщо сектори одноколірні.

Програма побудови кругової діаграми по цьому алгоритмі представлена нижче:

{Кругова діаграма (с) А.П. Шестаков, 2001}

program Kr_D;

Uses Graph;

Var a, S : Real; I : Byte; G, M : Integer;

Xc, Yc, R : Integer; {координати центра кола і його радіус}

F : Text; {файл містить дані для побудови діаграми}

Alpha : Integer; {кут, що відповідає черговій величині}



SAngle : Integer; Stroka : String;

Begin


Assign(F, '1.dat'); Reset(F);

S := 0; {сума елементів послідовності}

While Not Eof(F) Do

begin Readln(F, a); S := S + a end;

reset(f); G := detect; M := 0;

initgraph(G, M, ''); Xc := GetMax Div 2; Yc := GetMax Div 2;

R := 100; SAngle := 0; i := 1;

While Not Eof(f) Do begin

Readln(F, a); Alpha := round(A / S * 360); {обчислення кута}

setcolor(i mod 16 + 1); setfillstyle(1, i mod 16 + 1);

{побудова сектора, що відповідає величині}

sector(Xc, Yc, SAngle, SAngle + Alpha, R, R);

SAngle := SAngle + Alpha; i:= i + 1;

{укажемо, якому кольорам яка величина відповідає}

bar(Xc+200, Yc-250+(i-1)*20, Xc+220, Yc-250+(i-1)*20+15);

str(a:8:2, stroka);

outtextxy(Xc + 230, Yc - 250 + 5 + (i - 1) * 20, stroka) end;

readln; close(F); closegraph End.

Результат роботи програми для зазначеного на малюнку набору чисел:

2. Стовпчасті діаграми

Для побудови діаграми виділимо на екрані прямокутну область із координатами відповідно верхнього лівого кута (Xlv, Ylv) і правого нижнього (Xpn, Ypn). Висота стовпця діаграми, що відповідає максимальному елементу послідовності, буде збігатися з висотою прямокутника. Ширина стовпця буде залежати від кількості елементів послідовності: чим більше компонент, тим меншої буде ширина. Таким чином, для побудови діаграми потрібно визначити кількість компонентів послідовності й максимальний елемент послідовності. Висота vi чергового стовпця діаграми на екрані буде визначатися формулою де xmax — максимальний елемент послідовності, xi — черговий елемент послідовності.

Алгоритм побудови діаграми наступний:


  1. визначити кількість елементів послідовності і її максимальний елемент;

  2. відповідно до зазначеної формули побудувати стовпці діаграми. Їхня ширина на екрані може бути розрахована по формулі де n — кількість елементів послідовності.

Програма побудови стовпчастої діаграми по цьому алгоритмі представлена нижче:

{Стовпчаста діаграма (с) А.П. Шестаков, 2001}

program Stol_D;

Uses Graph;

Var a, xmax : Real; I, n : Byte; G, M : Integer;

F : Text; {файл містить дані для побудови діаграми}

Stroka : String;

Xlv, Ylv, Xpn, Ypn : Integer; {координати вікна висновку діаграми}



Begin

Assign(F, '1.dat'); Reset(F);

if not eof(f) then begin readln(f, xmax); n:= 1 end else n := 0;

While Not Eof(F) Do

begin Readln(F, a); if a > xmax then xmax := a; n := n + 1 end;

reset(f); G := detect; M := 0;

initgraph(G, M, ''); Xlv := 50; Ylv := 50; Xpn:= GetMaxX-100; Ypn:= GetMaxY-50;

i:= 0; {номер стовпця}

While Not Eof(f) Do

begin

Readln(F, a);



setcolor(i mod 16 + 1); setfillstyle(1, i mod 16 + 1);

{черговий стовпець}

bar(round(Xlv+i*(Xpn-Xlv)/n), Ypn,

round(Xlv+(i+1)*(Xpn-Xlv)/n), round(Ypn-(Ypn-Ylv)/xmax*a));

i:= i + 1;

{укажемо, якому кольорам яка величина відповідає}

bar(getMaxx-70, 50+(i-1)*20, getMaxx-50, 50+(i-1)*20+15);

str(a:8:2, stroka);

outtextxy(getMaxx-40, 50+(i-1)*20+8, stroka);

end;


readln; close(F); closegraph

End.


Результат роботи програми для зазначеного на малюнку набору чисел:
Для кращого сприйняття діаграми було б доцільно побудувати вертикальну вісь із розміткою по ній, що в даній програмі відсутній.

3. Лінійні діаграми

При побудові лінійних діаграм кожній величині відповідає крапка, розташована на певній висоті відносно початку відліку (висота розраховується так само, як і при побудові стовпчастих діаграм), всі крапки з'єднуються лініями. У результаті виходить ламана. Такого роду діаграми найчастіше будуючи в тих випадках, коли необхідно визуализировать динаміку зміни величин.

Програма аналогічна програмі побудови стовпчастих діаграм і наведена нижче.

{Лінійна діаграма (с) А.П. Шестаков, 2001}

program Stol_D;

Uses Graph;

Var a, xmax : Real; I, n : Byte; G, M : Integer;

F : Text; {файл містить дані для побудови діаграми}

Stroka : String; Yn, Yk : Integer;

Xlv, Ylv, Xpn, Ypn : Integer; {координати вікна висновку діаграми}



Begin

Assign(F, '1.dat'); Reset(F);



if not eof(f) then begin readln(f, xmax); n:= 1 end else n := 0;

While Not Eof(F) Do

begin Readln(F, a); if a > xmax then xmax := a; n := n + 1 end;

reset(f); G := detect; M := 0;

initgraph(G, M, ''); Xlv := 50; Ylv := 50; Xpn:= GetMaxX-100; Ypn:= GetMaxY-50;

line(xlv, ylv, xlv, ypn); line(xlv, ypn, xpn, ypn);

i:= 0; {номер крапки}

readln(f, a);

Yn := round(Ypn-(Ypn-Ylv)/xmax*a);

str(a:5:1, stroka);

outtextxy(round(Xlv+i*(Xpn-Xlv)/n)-20, Ypn+20, stroka);

While Not Eof(f) Do

begin


setcolor(i mod 16 + 1); setfillstyle(1, i mod 16 + 1);

{укажемо, якому кольорам яка величина відповідає}

Readln(F, a);

Yk := round(Ypn-(Ypn-Ylv)/xmax*a);

{чергова лінія}

line(round(Xlv+i*(Xpn-Xlv)/n), Yn,

round(Xlv+(i+1)*(Xpn-Xlv)/n), Yk);

i:= i + 1;

str(a:5:1, stroka);

outtextxy(round(Xlv+i*(Xpn-Xlv)/n)-20, Ypn+20, stroka);

Yn := Yk; {запам'ятовуємо положення чергової крапки}

end;


readln; close(F); closegraph

End.


Результат роботи програми для зазначеного на малюнку набору чисел:
Всі представлені тут програми можуть бути об'єднані в одну програму із загальним меню, де користувачеві надається можливість

Каталог: Documenty
Documenty -> Мета. Формувати розуміння того, що українська мова наш скарб, без якого не може існувати ні народ, ні Україна як держава. Розширювати знання про красу і багатство української мови. Ознайомити дітей з українськими обрядами і звичаями
Documenty -> Виступ на науково-пошуковій конференції “Типи учнівських проектів” заступника директора з нвр бойко Тетяни Петрівни
Documenty -> Урок №1 Растрова, векторна і фрактальна графіка. Історія анімації. Формати графічних і анімаційних файлів
Documenty -> Відомість про наукову, науково-методичну, дослідницьку роботу педагогічних працівників Вишнівської загальноосвітньої школи І-ІІІ ступенів №2
Documenty -> Затверджую: погоджено


Поділіться з Вашими друзьями:
1   2   3   4   5   6   7   8


База даних захищена авторським правом ©refos.in.ua 2019
звернутися до адміністрації

увійти | реєстрація
    Головна сторінка


завантажити матеріал