Tryb graficzny w Pascalu

Podobne dokumenty
Wykład VII PASCAL - grafika;

Moduł graph w Pascalu

Kod źródłowy programu: program Grafika1; uses crt, graph; (1) var sterownik, tryb:smallint; (2)

Pascal - grafika. Uruchomienie trybu graficznego. Moduł graph. Domyślny tryb graficzny

Okna i liczby pseudolosowe

GRAFIKA PROGRAMOWANA W PASCALU ==================================

P R OGRA M OW A N I E KOMPUTERÓW Ćwiczenia laboratoryjne. TEMAT 8: Moduły standardowe

Podstawy Programowania Wykład czternasty:

GRAFIKA I ROZPOZNAWANIE OBRAZÓW

Język programowania PASCAL

Pliki. Operacje na plikach w Pascalu

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Baltie 3. Podręcznik do nauki programowania dla klas I III gimnazjum. Tadeusz Sołtys, Bohumír Soukup

Programowanie. Grafika w języku j programowania. Klasa 2 Lekcja 16 GRAFIKA

Programowanie w języku Pascal

Programowanie w Turbo Pascal

Wizualne systemy programowania. Wykład 11 Grafika. dr Artur Bartoszewski -Wizualne systemy programowania, sem. III- WYKŁAD

Ćw. I Projektowanie opakowań transportowych cz. 1 Ćwiczenia z Corel DRAW

GRAFIKA. Rodzaje grafiki i odpowiadające im edytory

narzędzie Linia. 2. W polu koloru kliknij kolor, którego chcesz użyć. 3. Aby coś narysować, przeciągnij wskaźnikiem w obszarze rysowania.

Grażyna Koba. Grafika komputerowa. materiały dodatkowe do podręcznika. Informatyka dla gimnazjum

Przekształcanie wykresów.

Tematy lekcji informatyki klasa 4a styczeń 2013

KGGiBM GRAFIKA INŻYNIERSKA Rok III, sem. VI, sem IV SN WILiŚ Rok akademicki 2011/2012

Pascal - wprowadzenie

TWORZENIE OBIEKTÓW GRAFICZNYCH

Rysowanie precyzyjne. Polecenie:

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja cz. 1

INSTRUKCJA PUSTA. Nie składa się z żadnych znaków i symboli, niczego nie robi. for i := 1 to 10 do {tu nic nie ma};

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja, - liczby losowe

Cykl lekcji informatyki w klasie IV szkoły podstawowej. Wstęp

Część II Wyświetlanie obrazów

Programowanie: grafika w SciLab Slajd 1. Programowanie: grafika w SciLab

Tik Z wiadomości wstępne

Celem ćwiczenia jest zapoznanie się z podstawowymi funkcjami i pojęciami związanymi ze środowiskiem AutoCAD 2012 w polskiej wersji językowej.

4. Rysowanie krzywych

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Instrukcja instalacji winbgim

Krótki kurs obsługi środowiska programistycznego Turbo Pascal z 12 Opracował Jan T. Biernat. Wstęp

Szybkie tworzenie grafiki w GcIde

Adobe InDesign lab.1 Jacek Wiślicki, Paweł Kośla. Spis treści: 1 Podstawy pracy z aplikacją Układ strony... 2.

Wprowadzenie do rysowania w 3D. Praca w środowisku 3D

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

VII. WYKRESY Wprowadzenie

Projekt współfinansowany ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego

Delphi Laboratorium 3

POMIARY WIDEO W PROGRAMIE COACH 5

Podstawy MATLABA, cd.

CorelDRAW. wprowadzenie

przedmiot kilka razy, wystarczy kliknąć przycisk Wyczaruj ostatni,

CorelDRAW. 1. Rysunek rastrowy a wektorowy. 2. Opis okna programu

Praca w programie Power Draft

Cel: Przypisujemy przyciskom określone funkcje panel górny (Panel1)

Laboratorium z Grafiki InŜynierskiej CAD. Rozpoczęcie pracy z AutoCAD-em. Uruchomienie programu

KATEGORIA OBSZAR WIEDZY

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

C Biblioteka G2. C.1 Koncepcja biblioteki G2.

Tworzenie prezentacji w MS PowerPoint

Zastosowania informatyki w geologii ćwiczenia 1,2 INKSCAPE 1

WASM AppInventor Lab 3. Rysowanie i animacja po kanwie PODSTAWY PRACY Z KANWAMI

Podręcznik użytkownika programu. Ceremonia 3.1

EXCEL. Diagramy i wykresy w arkuszu lekcja numer 6. Instrukcja. dla Gimnazjum 36 - Ryszard Rogacz Strona 20

Podstawy Informatyki Wykład V

Usługi Informatyczne "SZANSA" - Gabriela Ciszyńska-Matuszek ul. Świerkowa 25, Bielsko-Biała

Wykład PASCAL - Pliki tekstowe

Kurs WWW. Paweł Rajba.

TEMAT : KLASY DZIEDZICZENIE

Ćwiczenia nr 4. Arkusz kalkulacyjny i programy do obliczeń statystycznych

Ćwiczenie pochodzi ze strony

BSP_LCD_Clear(LCD_COLOR_WHITE); BSP_LCD_SetFont(&Font16); BSP_LCD_SetTextColor(LCD_COLOR_BLACK);

Techniki wstawiania tabel

Programowanie w języku Python. Grażyna Koba

Grafika komputerowa. Dla DSI II

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Księgarnia PWN: Andrzej Jaskulski - AutoCAD 2010/LT Podstawy projektowania parametrycznego i nieparametrycznego

Program V-SIM tworzenie plików video z przebiegu symulacji

Pokaz slajdów na stronie internetowej

Rysowanie punktów na powierzchni graficznej

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

ZAJĘCIA KOMPUTEROWE KLASA IV. Opis wymagań, które uczeń powinien spełnić, aby uzyskać ocenę:

Pierwsze kroki z easy Soft CoDeSys Eaton Corporation. All rights reserved.

Laboratorium - Monitorowanie i zarządzanie zasobami systemu Windows 7

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

PIERWSZE URUCHOMIENIE PROGRAMU ITNC PROGRAMMING STATION

Grafika Komputerowa Materiały Laboratoryjne

3 Biblioteka WinBGIm. 3.1 Powstanie biblioteki WinBGI(m).

Obsługa klawiszy specjalnych

Multimedia i interfejsy. Ćwiczenie 5 HTML5

Wstawianie filmu i odtwarzanie go automatycznie

Jarosław Kuchta Podstawy Programowania Obiektowego. Podstawy grafiki obiektowej

Obsługa programu Paint. mgr Katarzyna Paliwoda

Maskowanie i selekcja

Baltie 2010 etap szkolny, zadania dla kategorie A, B

Program graficzny MS Paint.

Simba 3D LOGO. Cele zajęć: - Poznanie zasad i sposobów tworzenia procedur z parametrami. - Poznanie zasad wywoływania procedur z parametrami.

Każde wykonanie bloku instrukcji nazywamy pojedynczym przebiegiem lub iteracją pętli.

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Animacje z zastosowaniem suwaka i przycisku

Transkrypt:

Komputer może pracować w trybach: qq qq graficznym (ang. graphics mode), tekstowym (ang. text mode, character mode). Fachowcy nazywają grafikę tworzoną za pomocą Turbo Pascala dla środowiska MS -DOS grafiką BGI (ang. Borland Graphics Interface interfejs graficzny Borlanda). W Windows stosuje się inny interfejs graficzny GDI (ang. Graphics Device Interface), dlatego też grafikę przeznaczoną dla Windows fachowcy w żargonie nazywają grafiką GDI. Monitor komputera musi mieć odpowiedni sterownik sprzętowy nazywany kartą graficzną lub sterownikiem graficznym. Najważniejsze parametry pracy sterowników to: qq qq qq qq 6 Tryb graficzny w Pascalu liczba możliwych do wyświetlenia kolorów (tzw. paleta barw), rozdzielczość (liczba świecących punktów na ekranie, tzw. pikseli), ilość pamięci, parametry procesora graficznego (na kartach grafiki może być zainstalowany osobny procesor). Standardowe karty graficzne (stare i nowsze) obsługiwane przez Turbo Pascala to m.in.: q q VGA (ang. Video Graphics Array) typowy tryb pracy: rozdzielczość 640 480, 16 kolorów; q q SVGA (ang. Super VGA) typowy tryb pracy: rozdzielczość 800 600, ponad 65 000 barw.

Rozdział 6 t Tryb graficzny w Pascalu 6.1. Inicjowanie trybu graficznego Przed przystąpieniem do rysowania popatrzmy na okno Turbo Pascala i poczyńmy kilka wyjściowych spostrzeżeń. 1. Tryb tekstowy jest trybem domyślnym. Zanim spróbujemy cokolwiek narysować, należy przełączyć kartę w tryb graficzny. 2. Trybów graficznych (podobnie jak trybów tekstowych) jest więcej niż jeden. Ten sam rysunek może wyglądać zupełnie inaczej w innym trybie o innej rozdzielczości. Zamiast zatem rozpoczynać tworzenie programu w sposób rutynowy (od klauzuli Uses Crt;), musimy najpierw włączyć tryb graficzny. W kompilatorach Turbo Pascal i Borland Pascal do obsługi tego trybu służą następujące (niezbędne) elementy: Uses Graph; { modul z procedurami i funkcjami graficznymi } InitGraph(); { procedura zainicjuj tryb graficzny } CloseGraph; { procedura zamknij tryb graficzny, wroc do trybu tekstowego} Procedura CloseGraph() nie potrzebuje dodatkowych informacji, zatem aby zamknąć tryb graficzny, nie musimy podawać w nawiasach żadnych argumentów. Ponieważ jednak trybów graficznych może być wiele, między nawiasami procedury InitGraph() powinniśmy umieścić dodatkowe informacje. Najprostszy sposób ich wypełnienia może wyglądać tak: gdzie: Uses Crt, Graph; Var Karta, Tryb: Integer; BEGIN Karta := Detect; InitGraph(Karta, Tryb, C:\TP\BGI ); Var Karta, Tryb: Integer; deklaracje dwóch zmiennych parametrów (tryb może zmieniać się w trakcie pracy programu); Karta identyfikator sterownika graficznego (ang. Graphics Driver); Tryb tryb graficzny (ang. Graphics Mode rozdzielczość, liczba kolorów); C:\TP\BGI katalog, w którym znajduje się sterownik *.BGI. Ponieważ komputery wolą numery niż słowa, wszystkie karty i wszystkie tryby mają predefiniowane przez producenta nazwy karty (np. VGA) i numery (np. dla kart VGA 9). Jeśli pamiętamy, że karta VGA ma numer 9, a HGC numer 7, możemy inicjować tryb graficzny, np.: Karta := 9; InitGraph( Karta,... 48

6.1. Inicjowanie trybu graficznego Dokładnie taki sam skutek przyniesie wywołanie procedury z użyciem predefiniowanej stałej symbolicznej: Karta := VGA; InitGraph( Karta,... Jeśli jednak zechcemy napisać program w sposób bardziej uniwersalny albo po prostu nie mamy głowy do cyferek, wygodniej namówić komputer, by sam sprawdzał, z jaką kartą ma do czynienia tam, gdzie właśnie został uruchomiony. Służy do tego predefiniowana stała Detect (równa 0). Wpisanie zera do komórki pamięci przeznaczonej na zapamiętanie parametru Karta powoduje automatyczne sprawdzenie przez procedurę InitGraph() i zapamiętanie w tymże miejscu numeru wykrytej karty. Po zadeklarowaniu zmiennych Karta i Tryb, możemy zapisać to tak: Var Karta, Tryb: Integer; BEGIN Karta := Detect; InitGraph ( Karta, Tryb,... Przygotowując się do pracy w trybie graficznym, możemy zdać się na ustawienia domyślne. Procedura InitGraph() automatycznie wybierze tryb o najwyższej możliwej dla danej karty rozdzielczości. Jeśli więc mamy na przykład kartę VGA, uzyskamy identyczny skutek, wpisując następujący kod: Karta := VGA; Tryb := VGAHi; InitGraph ( Karta, Tryb,...); Tryb VGA może być realizowany w wersjach VGAHi, VGAMed, VGALo (High, Medium, Low). Oczywiście, tryby graficzne także mają swoje identyfikatory. Przedstawia je tabela 6.1. Tabela 6.1. Wyliczenie trybów graficznych dla standardu VGA Nazwa symboliczna Identyfikator Rozdzielczość w pikselach VGAHi 2 640 480 VGAMed 1 640 350 VGALo 0 640 200 W zależności od wersji albo w podkatalogu..\bgi, albo w katalogu głównym Turbo Pascal przechowuje pliki sterowników graficznych dla różnych kart. Nazwa pliku wynika z nazwy standardu graficznego, który obsługuje, a rozszerzenia mogą być dwa: q q q q *.BGI sterownik grafiki BGI dla DOS, *.CHR czcionki graficzne. 49

Rozdział 6 t Tryb graficzny w Pascalu Jeśli mamy kartę VGA lub SVGA, będzie potrzebny sterownik: EGAVGA.BGI. Ten plik (i ewentualnie pliki z czcionkami graficznymi, jeśli program zamierza pisać) można skopiować do bieżącego katalogu, w którym znajduje się wersja *.EXE programu, który ma korzystać z trybu graficznego. Jeśli tak zrobimy, wywołanie procedury inicjującej tryb graficzny może wyglądać tak: Karta := 9; Tryb := 2; InitGraph ( Karta, Tryb, { ); Puste apostrofy oznaczają właśnie katalog bieżący. Ponieważ na komputerze autora niniejszego podręcznika Turbo Pascal rezydował na dysku C:, w przykładach ścieżka dostępu do sterownika *.BGI ma postać: C:\TP\BGI. Użytkownik jednakże powinien dostosować zapis do konfiguracji plików i katalogów na swoim komputerze. Poniżej zaprezentowany został prosty przykład grafiki w Turbo Pascalu. Listing L601.PAS Program Bazgroly_1; Uses Crt, Graph; Var Karta, Tryb: Integer; BEGIN ClrScr; WriteLn( Tryb tekstowy, czekam 2 sekundy... ); Delay(2000); Karta:=Detect; InitGraph(Karta, Tryb, C:\TP\BGI ); OutText( Tryb VGAHi, czekam [2 sekundy]... ); Line(0,0,200,100); Delay(2000); Tryb:=Tryb - 1; InitGraph(Karta, Tryb, C:\TP\BGI ); OutText( Tryb VGAMed, czekam na [3 sekundy]... ); Line(0,0,200,100); Delay(3000); Tryb:=Tryb -1; InitGraph(Karta, Tryb, C:\TP\BGI ); OutText( Tryb VGALo, czekam [1.5 sekundy]... ); Line(0,0,200,100); Delay(1500); 50

6.2. Procedury graficzne Line() i Circle() CloseGraph; END. Pascal używa do wyprowadzania tekstów w trybach graficznych procedury OutText(). Wynika to z możliwości wyboru czcionek graficznych, czego procedury z grupy Write, doskonale spisujące się ze standardowymi czcionkami w trybie tekstowym, niestety nie potrafią. Program powyżej został napisany i uruchomiony w trybie karty VGA. Zwróćmy uwagę na procedurę Line() rysującą linie proste w domyślnym kolorze rysunku białym, na tle o domyślnym kolorze czarnym. 6.2. Procedury graficzne Line() i Circle() Narysujmy na ekranie linię i okrąg. Nazwy procedur graficznych, które będą nam do tego potrzebne, są łatwe do odgadnięcia w sposób intuicyjny Line() i Circle(). Parametry (argumenty), które musimy im przekazać przy wywołaniu, są też oczywiste. Graficzne współrzędne ekranowe dla linii mają postać: q q X1 początek linii, współrzędna pozioma (piksele liczone od lewej do prawej); q q Y1 początek linii, współrzędna pionowa (piksele liczone od góry w dół); q q X2 koniec linii, współrzędna pozioma (piksele liczone od lewej do prawej); q q Y2 koniec linii, współrzędna pionowa (piksele liczone od góry w dół). Wywołanie będzie mieć postać: Line(X1, Y1, X2, Y2); Współrzędne ekranowe graficzne (liczone od 0, a nie od 1) dla okręgu mają postać: q q X współrzędna ekranowa X środka okręgu (gdzie wbić cyrkiel?); q q Y współrzędna ekranowa Y środka okręgu (gdzie wbić cyrkiel?); q q R długość promienia okręgu w pikselach (jak rozewrzeć cyrkiel?); Wywołanie będzie mieć postać: Circle(X, Y, R); Poniżej zaprezentowano przykładowy program. Po skorygowaniu ścieżki dostępu do modułów graficznych BGI zadziała na każdym komputerze. Listing L602.PAS Program Bazgroly_2; Uses Crt, Graph; Var Karta, Tryb: Integer; BEGIN Karta := Detect; InitGraph(Karta, Tryb, C:\TP\BGI ); 51

Rozdział 6 t Tryb graficzny w Pascalu If (GraphResult <> grok) Then WriteLn( Nie udalo sie zainicjowac trybu graficznego! ) Else Begin Line(100, 200, 200, 200); Line(200, 200, 200, 50); Line(200, 50, 100, 200); Circle(200, 200, 30); End; Delay(3000); CloseGraph; WriteLn( Koniec trybu graficznego... ); ReadLn; END. Oprócz oczywistego wykreślania linii i okręgu wykonujemy w tym programie jeszcze jedną ważną rzecz. Sprawdzamy mianowicie, czy tryb graficzny został poprawnie zainicjowany. Wykonuje to dla nas funkcja GraphResult(), która podaje rezultat próby zainicjowania grafiki. Funkcja tym różni się od procedur, że zwraca w miejsce wywołania wynik swojego działania. Jeślibyśmy nie zastosowali skróconego zapisu wywołania funkcji GraphResult(), ten fragment programu wyglądałby tak: Var Rezultat: Integer;... Rezultat := GraphResult; If (Rezultat <> grok) Then WriteLn( Nie udalo sie zainicjowac trybu graficznego! ) Else Begin Line(100, 200, 200, 200);... Stała grok jest predefiniowana w pliku GRAPH.TPU i oznacza wynik, który powinna zwrócić funkcja GraphResult(), jeśli znajdujemy się w prawidłowo zainicjowanym trybie graficznym. 52

6.3. Biblioteka graficzna Turbo Pascala: GRAPH.TPU 6.3. Biblioteka graficzna Turbo Pascala: GRAPH.TPU Zestaw funkcji i procedur graficznych jest zdefiniowany w module GRAPH.TPU. Poniżej znajduje się pełna lista funkcji i procedur graficznych Turbo Pascala. q q Arc() łuk, wycinek okręgu. q q Bar() prostokąt, słupek, na przykład dla wykresów słupkowych. q q Bar3D() słupek niby-trójwymiarowy. q q Circle() okrąg. q q ClearDevice() czyszczenie ekranu graficznego. q q ClearViewPort() czyszczenie okna (część ekranu), w trybie graficznym. q q CloseGraph() zamknij tryb graficzny (wróć do trybu tekstowego). q q DetectGraph() sprawdź, jaką kartę graficzną mamy i w którym trybie graficznym właśnie pracujemy. q q DrawPoly() narysuj wielokąt. q q Ellipse() narysuj elipsę. q q FillEllipse() narysuj elipsę wypełnioną wewnątrz. q q FillPoly() narysuj wielokąt wypełniony wewnątrz. q q FloodFill() wypełnij region. Region to zamknięty, ograniczony liniami o innym kolorze obszar ekranu (np. prostokąt, koło, trójkąt itp.). Kształt regionu może być dowolny, ale wcześniej, przed zapełnieniem, trzeba określić kolor i wzór wypełniacza. q q GetArcCoords() podaj współrzędne ostatnio rysowanego łuku. q q GetAspectRatio() zwraca współczynniki skali rysunku (aspect ratio). Ponieważ proporcje rozdzielczości (w pikselach) po poziomej osi X i po pionowej osi Y są różne dla różnych kart graficznych (porównaj: Hercules i VGA), pozwala na skalowanie rysunku. q q GetBkColor() podaj bieżący kolor tła. q q GetColor() podaj bieżący kolor rysowania. q q GetDefaultPalette() ustaw domyślną paletę kolorów. q q GetDriverName() podaj nazwę sterownika graficznego (karty). q q GetFillPattern() podaj bieżący wzorek wypełniacza. q q GetFillSettings() podaj bieżący kolor i wzorek wypełniacza. q q GetGraphMode() podaj bieżący tryb graficzny. q q GetImage() zapamiętaj rysunek. q q GetLineSettings() podaj bieżący styl linii (ciągła, przerywana, grubość itp.). q q GetMaxColor() podaj najwyższy dostępny numer koloru. 53

Rozdział 6 t Tryb graficzny w Pascalu q q GetMaxMode() podaj najwyższy dostępny tryb graficzny (o maksymalnej rozdzielczości). q q GetMaxX() podaj maksymalną wartość współrzędnej X na ekranie. q q GetMaxY() podaj maksymalną wartość współrzędnej Y na ekranie. q q GetModeName() podaj nazwę trybu graficznego. q q GetModeRange() podaj zakres dostępnych trybów graficznych. q q GetPalette() podaj bieżącą paletę kolorów. q q GetPaletteSize() podaj wielkość palety kolorów. q q GetPixel() podaj stan wskazanego punktu na ekranie (jaki ma kolor?). q q GetTextSettings() podaj bieżące ustawienia do wyprowadzania tekstu (współrzędne, kolor, czcionka itp.). q q GetViewSettings() podaj parametry bieżącego okna graficznego (View Port Settings). q q GetX() podaj bieżącą współrzędną X kursora graficznego (niewidocznego). q q GetY() podaj bieżącą współrzędną Y kursora graficznego (niewidocznego). q q GraphDefaults() wróć do domyślnych ustawień trybu graficznego, kursor graficzny na początek ekranu. q q GraphErrorMsg() podaj komunikat (string) o błędzie grafiki w oparciu o podany numer. q q GraphResult() wynik zainicjowania trybu graficznego. q q ImageSize() wielkość rysunku. q q InitGraph() zainicjuj tryb graficzny. q q InstallUserDriver() zainstaluj sterownik graficzny użytkownika. q q InstallUserFont() zainstaluj czcionki graficzne użytkownika. q q Line() rysuj linię prostą. q q LineRel() rysuj linię prostą relatywnie do bieżącej pozycji kursora graficznego. q q LineTo() linia od bieżącej pozycji kursora do wskazanego punktu. q q MoveRel() przesuń kursor graficzny relatywnie (w stosunku do pozycji początkowej). q q MoveTo() przesuń kursor graficzny do wskazanego punktu. q q OutText() wyprowadź tekst. q q OutTextXY() wyprowadź tekst, począwszy od punktu o zadanych współrzędnych X i Y. q q PieSlice() narysuj wycinek wykresu kołowego. q q PutImage() wstaw na ekran rysunek. q q PutPixel() zapal punkt na ekranie. q q Rectangle() narysuj prostokąt. 54

6.3. Biblioteka graficzna Turbo Pascala: GRAPH.TPU q q RegisterBGIdriver() zarejestruj sterownik graficzny BGI. q q RegisterBGIfont() zarejestruj czcionki dla środowiska graficznego. q q RestoreCrtMode() wróć do trybu tekstowego (zwykle na chwilę). q q Sector() narysuj wypełniony wycinek elipsy/okręgu. q q SetActivePage() wybierz aktywną stronę. WSKAZÓWKA Wiele sterowników graficznych pozwala na utworzenie w pamięci kilku stron. Każda z takich stron to odwzorowanie jednego ekranu graficznego. Strona aktywna (Active Page) to ta strona, na której odbywa się rysowanie. Wszystkie operacje mogą odbywać się wyłącznie w pamięci. Visual Page lub Visible Page to ta strona, która jest na bieżąco odwzorowywana na ekranie. Jest to jedna z popularnych technik animacji obrazów (patrz: SetVisualPage()). q q SetAllPalette() zmień wszystkie kolory palety na podane. q q SetAspectRatio() ustaw skalę rysunku. q q SetBkColor() ustaw kolor tła. q q SetColor() ustaw kolor rysunku. q q SetFillPattern() ustaw wzór wypełniacza wnętrza figur i regionów. q q SetFillStyle() ustaw rodzaj wypełniacza. q q SetGraphBufSize() ustaw wielkość bufora pamięci dla grafiki. q q SetGraphMode() włącz tryb graficzny. q q SetLineStyle() ustaw rodzaj linii (ciągłe, przerywane, grube itp.). q q SetPalette() ustaw stosowaną paletę barw. q q SetRGBPalette() ustaw paletę trójskładnikową. Każdą barwę można przedstawić jako kombinację barw elementarnych R = Red (składowa czerwona), G = Green (składowa zielona), B = Blue (składowa niebieska). q q SetTextJustify() ustaw sposób wyrównywania tekstu. q q SetTextStyle() ustaw styl tekstu. q q SetUserCharSize() ustaw wielkość czcionek użytkownika. q q SetViewPort() ustaw okno graficzne na ekranie. q q SetVisualPage() wybierz stronę pamięci karty widoczną na ekranie. q q SetWriteMode() ustaw tryb nadrysowania na poprzedni rysunek. q q TextHeight() ustaw wysokość tekstu. q q TextWidth() ustaw szerokość tekstu. 55

Rozdział 6 t Tryb graficzny w Pascalu Prezentację możliwości biblioteki graficznej zaczniemy od procedur graficznych: Line() (linia), Circle() (okrąg), Rectangle() (prostokąt), Ellipse() (elipsa), PutPixel() (punkt). Na rys. 6.1 poniżej widać efekt działania programu z listingu L603.PAS. Listing L603.PAS Program Grafik; Uses Graph, Crt; Var X1, Y1, X2, Y2, R1, R2: Integer; Var Karta, Tryb, KodBledu: Integer; Var Xmax, Ymax: Integer; {zmienne - parametry rysunku} {parametry trybu graficznego} {parametry: maksymalne wspolrzedne} Var Licznik: Integer; BEGIN Karta := Detect; InitGraph(Karta, Tryb, C:\TP\BGI ); KodBledu := GraphResult; If KodBledu = grok Then Begin X1:=100; X2:=300; Y1:=100; Y2:=300; R1:=100; Line(X1, Y1, X2, Y2); ReadKey; Rectangle(X1, Y1, X2, Y2); Circle(X1, Y1, R1); MoveTo(X2, Y2); OutText( Tekst do wyprowadzenia... ); For Licznik:=1 To 100 Do PutPixel((Licznik*3), (Licznik*2), White); ReadLn; End Else WriteLn( Klops... Tryb graficzny mi nie wychodzi... ); ReadLn; CloseGraph; END. 56

6.3. Biblioteka graficzna Turbo Pascala: GRAPH.TPU Rysunek 6.1. Ekran po uruchomieniu programu w trybie VGAHi Nietrudno zauważyć, że zamiast wywoływać funkcje i procedury tak: Line(100, 100, 200, 200); Circle(100, 200, 300); zastosowaliśmy nieco inną taktykę: Var X1, Y1, X2, Y2, R1: Integer;... X1:=100; X2:=300; Y1:=100; Y2:=300; R1:=100; R2:=50; Line(X1, Y1, X2, Y2); Rectangle(X1, Y1, X2, Y2); Circle(X1, Y1, R1);... Utworzenie w pamięci zmiennych, a następnie ich przypisywanie w programie nazywa się parametryzacją programu. Wydłuża to trochę kod programu, ale pozwala później autorowi na łatwą i szybką jego modyfikację. Jeśli zechcemy, by obiekty graficzne rozmieszczone zostały na ekranie w inny sposób, wystarczy zmienić tylko jeden wiersz w kodzie, na przykład: X1:=10; X2:=200; Y1:=100; Y2:=300; R1:=20; 57

Rozdział 6 t Tryb graficzny w Pascalu Rysunek będzie wówczas zupełnie inny. Wart rozważenia jest też następujący fragment: MoveTo(X2, Y2); OutText( Tekst do wyprowadzenia... ); For Licznik:=1 To 100 Do PutPixel((Licznik*3), (Licznik*2), White); Dochodzi tu do manipulowania niewidocznym z natury kursorem graficznym. Choć pozostaje on niedostrzegalny na ekranie, jego położenie nie jest bez znaczenia. Korzystają z niego zarówno procedury MoveTo(), LineTo(), jak i procedury drukujące tekst. Na przykład procedura MoveTo(X2, Y2); przesuwa kursor graficzny do punktu 300, 300. Od tego właśnie punktu rozpocznie się wyprowadzanie tekstu wskazanego w procedurze OutText( Tekst do wyprowadzenia... );. Pętla programowa typu For będzie zapalać kolejne piksele, których współrzędne zostaną obliczone za pomocą wyrażeń: (Licznik*3) = 3, 6, 9, 12, 15,... (Licznik*2) = 2, 4, 6, 8, 10,... Linia punktowa widoczna na rysunku składa się z takich właśnie pikseli o współrzędnych: (3,2), (6,4), (9,6),... itd., aż do (300, 200). Zamiast prostego wywołania: PutPixel(X, Y, Kolor); użyliśmy i tu wyrażeń matematycznych. Jest to metoda bardzo przydatna przy wykreślaniu wykresów funkcji i innych nietypowych krzywych. Dla wyjaśnienia tych mechanizmów dodajmy do naszego programu elipsę i narysujmy trochę pojedynczych pikseli. Listing L604.PAS Program Grafik_2; Uses Graph, Crt; Var X1, Y1, X2, Y2, R1, R2: Integer; Var Karta, Tryb, KodBledu: Integer; Var Xmax, Ymax: Integer; {zmienne - parametry rysunku} {parametry trybu graficznego} {parametry: maksymalne wspolrzedne} Var Licznik: Integer; BEGIN Karta := Detect; InitGraph(Karta, Tryb, C:\TP\BGI ); KodBledu := GraphResult; If KodBledu = grok Then Begin X1:=100; X2:=150; Y1:=100; Y2:=300; R1:=90; R2:=50; Line(X1, Y1, X2, Y2); ReadLn; 58

6.3. Biblioteka graficzna Turbo Pascala: GRAPH.TPU Rectangle(X1, Y1, X2, Y2); Circle(X2, Y2, R2); Ellipse(100, 100, 0, 360, 100, 60); Ellipse(100, 100, 0, 180, 50, 30); Ellipse(X2, Y2, 45, 279, R1, R2); MoveTo(X2+100, Y2); OutText( Tekst do wyprowadzenia... ); Xmax := GetMaxX; MoveTo((Xmax div 2), (GetMaxY div 2)); OutText( X <-- Tu jest centrum ekranu! ); For Licznik:=1 To 100 Do PutPixel((Licznik*4), (1000 div Licznik), White); For Licznik:=0 To 360 Do Begin Ellipse(GetMaxX div 2, GetMaxY div 2, 0, Licznik, GetMaxX div 4, Get- MaxY div 4); Delay(50) End; End Else WriteLn( Klops... Tryb graficzny mi nie wychodzi... ); ReadLn; CloseGraph; END. Prototyp procedury rysującej elipsę wygląda tak: Ellipse(X, Y: Integer; Kąt_startowy, Kąt_końcowy: Word; Promień_po_X, Promień_po_Y: Word); Kąty startowy i końcowy podawane są w stopniach. Pętla For z zastosowanym opóźnieniem Delay() pozwoli nam spokojnie obejrzeć wykreślanie elipsy na ekranie. Zamiana mnożenia na dzielenie przy wyznaczaniu współrzędnych kolejnych pikseli powoduje, że piksele układają się w kształt hiperboli typu y = 1 / x, tyle że odwróconej, ponieważ współrzędna Y na ekranie biegnie nie z dołu do góry, lecz z góry w dół. Trzeba o tym pamiętać, gdy zamierzamy robić na ekranie jakikolwiek wykres. Xmax := GetMaxX; MoveTo((Xmax Div 2), (GetMaxY Div 2)); OutText( X <-- Tu jest centrum ekranu! ); 59

Rozdział 6 t Tryb graficzny w Pascalu DEFINICJA Prototyp funkcji (lub procedury), nazywany również sygnaturą, jest po prostu deklaracją funkcji (procedury). Deklaracja określa typ wartości zwracanej, nazwę i typy argumentów. Porównajmy. Oto prototypy, czyli deklaracje: Procedure P(X, Y : Integer); Function F(X, Y, Z : Real) : Real; A to definicje: P(X,Y) to procedura, F(X,Y,Z) to funkcja. Procedure P(X, Y : Integer); Begin X := X+Y; End; Function F(X, Y, Z : Real) : Real; Begin F := X*T*Z; End; Fragment ustawiający tekst na środku ekranu mógłby wyglądać i tak: Xmax := GetMaxX Div 2; Ymax := GetMaxY Div 2; MoveTo(Xmax, Ymax); OutText(... ); Ponieważ GetMaxX i GetMaxY to funkcje, a nie procedury, zwracają one wyliczoną przez siebie wartość do programu w miejsce, z którego zostały wywołane. Zmiennych pomocniczych Xmax i Ymax do przechowywania wyniku zwróconego przez funkcje nie musimy stosować. Podobnie rzecz się ma z wywołaniem procedury Ellipse(). Wartość zwracana przez funkcje może stać się bezpośrednio argumentem dla innej funkcji lub procedury. Zmienne pomocnicze do przechowywania wartości zwracanych przez funkcje nie są konieczne. Ellipse(GetMaxX Div 2, GetMaxY Div 2, 0, Licznik, GetMaxX Div 4, GetMaxY Div 4); W procedurze tej pojawiają się wyrażenia matematyczne. Przykładowo wyrażenie: GetMaxX Div 2; można wyjaśnić następująco: 1. Wywołaj funkcję GetMaxX() (podaj maksymalną dostępną współrzędną ekranową X). W przypadku emulacji karty VGA funkcja zwróci wartość 639. 60

6.3. Biblioteka graficzna Turbo Pascala: GRAPH.TPU 2. Podziel zwróconą wartość przez 2 (ewentualnie zaokrąglając do liczby całkowitej): 639 / 2 = 319. 3. Wynik podstaw jako parametr przy wywołaniu Ellipse(). Wywołanie będzie więc równoważne takiemu: Ellipse(319, 239, 0, Licznik, 159, 119); Licznik będzie się zmieniać: 0, 1, 2, 3, 4,.... Ponieważ czwarty z kolei parametr oznacza kąt końcowy rysowanego wycinka elipsy, będą rysowane wycinki od kąta 0 do kąta końcowego: 0, 1, 2, 3,... stopnie itd. Dzięki temu zobaczymy rysowanie w zwolnionym tempie (rysunek 6.2). Var X, Y: Integer; {- wspolrzedne srodka elipsy } Rysunek 6.2. Elipsy i poprzednie procedury po zmianie parametrów To, że współrzędne środka elipsy powinny być liczbami całkowitymi, można wyjaśnić stosunkowo łatwo. Numery poszczególnych pikseli są to liczby całkowite. Ale w prototypie procedury Ellipse() jest również coś dziwacznego: Var KątStartowy, KątKoncowy: Word; Deklaracja takich zmiennych powinna wyglądać nie tak: lecz tak: Var Kąt1, Kąt2 : Integer; Var Kąt1, Kąt2 : Word; 61

Rozdział 6 t Tryb graficzny w Pascalu Czym różni się szesnastobitowa liczba całkowita typu Integer od szesnastobitowej liczby całkowitej typu Word? To proste brakiem znaku. Liczby typu Word to takie same liczby jak znane już liczby typu Integer, tyle tylko, że zawsze i z całą pewnością są dodatnie (a ściślej: nieujemne). Na nośniku elektronicznym umieszczono dodatkowe przykłady programów graficznych. Przed kompilacją i uruchomieniem należy sprawdzić, czy ścieżka dostępu do sterownika BGI jest zgodna z położeniem plików na komputerze użytkownika. ĆWICZENIA 1. Narysuj na ekranie kopertę, domek i bałwanka. 62