Grafika tekstowa Zarządzanie ekranem w trybie tekstowym Borland C++ - funkcje Funkcje pozwalają na: zmianę trybu tekstowego, sterowanie atrybutami znaków wysyłanymi na ekran, realizację operacji we-wy, obsługę pamięci obrazu, sterowanie położeniem i kształtem kursora. Prototypy tych funkcji są umieszczone w bibliotece conio.h constream.h
Organizacja ekranu w trybie tekstowym Ekran podzielony jest na jednakowe komórki. W komórce może znaleźć się tylko jeden znak kolumna 3 współrzędne bezwzględne 1 2 3 4 5 6 7 8 9 D (left,top) okno tekstowe wiersz 2 (right,bottom) współrzędne względne (3,2)
Definiowanie okien tekstowych void window (int left, int top, int right, int bottom); (funkcja ta służy do określenia obszaru ekranu zajmowanego przez okno tekstowe) dla całego ekranu window(1,1,80,25); tryb 80-kolumnowy window (1,1,40,25); tryb 40-kolumnowy Sterowanie trybem pracy ekranu void textmode (int newmode); textmode(C80); C40 1 tryb kolorowy, 40 kolumn C80 3 tryb kolorowy, 80 kolumn MONO 7 tryb monochromatyczny 80 kolumn
Sterowanie atrybutami znaków wysyłanymi na ekran Bajt atrybutu znaków określa kolor znaku, podwyższoną jasność. kolor jego tła, migotanie 7 6 4 3 2 1 void textbackground(int newcolor); kolor tła textbackground(4); czerwony kolor tła. void textcolor(int newcolor); kolor znaku textcolor(2); zielony kolor znaku. void highvideo(void); podwyższona jasność void lowvideo(void); normalna jasność void normvideo(void); przywraca stan początkowy
Stałe kolorów stała wartość kolor zastosowanie BLACK czarny tło i znak czarny tło i znak BLUE 1 niebieski GREEN 2 zielony CYAN 3 turkusowy RED 4 czerwony MAGENTA 5 karmazynowy BROWN 6 brązowy LIGHTGRAY 7 jasnoszary DARKGRAY 8 ciemnoszary znak LIGHTBLUE 9 jasnoniebieski LIGHTGREEN 10 jasnozielony LIGHTCYAN 11 jasnoturkusowy LIGHTRED 12 jasnoczerwony LIGHTMAGENTA 13 jasnokarmazynowy YELLOW 14 żółty WHILE 15 biały BLINK 128 migotanie
Sterowanie pozycją i wyglądem kursora void gotoxy(int x, int y); umieszcza kursor w pozycji x,y okna gotoxy(20,3); int wherex(void); wartością jest współrzędna x kursora x=wherex; int wherey(void); wartością jest współrzędna y kursora y=wherey; void setcursortype(int cur_t); zmiana wyglądu kursora setcursortype(_NOCURSOR); wyłącza kursor, setcursortype(_SOLIDCURSOR); kursor jako pełny prostokąt, setcursortype(_NORMALCURSOR); normalny kursor w postaci podkreślenia,
Czyszczenie ekranu, usuwanie, wstawienie wierszy, void clreol(void); usuwa wszystkie znaki od pozycji kursora do końca wiersza clreol(); void clrscr(void); usuwa wszystkie znaki z ekranu clrscr(); void delline(void); usuwa wiersz w pozycji kursora delline(); void insline(void); wstawia pusty wiersz w pozycji kursora insline(); Operacje wejścia z konsoli (klawiatury) int getch(void); odczytuje znak z klawiatury getch(); int getche(void); odczytuje znak z klawiatury i wysyła go na ekran getche();
Wydruk kolorów – od 0 do 15 #include<iostream.h> #include <conio.h> main() { clrscr(); int i; textmode(C40); textbackground(15); window(20,10,40,25); for (i=0; i<=15; i++) textcolor(i); cout<<i<<"\t"; cprintf("kolor \r\n"); } getch(); return 0; 0 kolor 1 kolor 2 kolor 3 kolor 4 kolor 5 kolor 14 kolor 15 kolor
obiektowe strumienie wyjścia na ekran Grafika tekstowa obiektowe strumienie wyjścia na ekran Zarządzanie ekranem w trybie tekstowym Borland C++ - funkcje Prototypy tych funkcji są umieszczone w bibliotece constream.h umożliwiają jednoczesną obsługę kilku okien tekstowych Wyjście strumienia realizowane jest przez operator << a do formatowania danych wysyłanych na ekran służą manipulatory
Manipulatory strumieni konsoli constream.h manipulator anlogiczna funkcja ze zbioru conio.h zastosowanie clreol usuwa znaki do końca wiersza delline usuwa wiersz tekstu highvideo włącza podwyższoną jasność insline wstawia pusty wiersz lowvideo włącza normalną jasność normvideo włącza normalne atrybuty znaków setattr(int) textattr ustala atrybuty znaków setbk(int) textbackground ustala kolor tła znaków setclr(int) textcolor ustala kolor znaków setcrtype(int) _setcursortype steruje rozmiarem kursora setxy(int,int) gotoxy ustawia kursor na zadanej pozycji
Wykorzystanie strumieni konsoli –przykład Strumienie konsoli działają niezależnie, każdy z nich operuje tylko we własnym oknie tekstowym. #include<constrem.h> main() { constream w1, w2, w3; w1.window(1,1,40,12); w2.window(41,13,80,24); w3.window(1,15,25,22); w1.clrscr(); w2.clrscr(); w3.clrscr(); w1<<setattr(YELLOW|(BROWN<<4))<<"OKNO 1"<<endl; w2<<setxy(10,5)<<"OKNO 2"<<endl; w3<<highvideo<<"OKNO 3"<<endl; return 0; }
Grafika punktowa Zarządzanie ekranem w trybie graficznym Borland C++ - funkcje graficzne Funkcje graficzne pozwalają na: obsługę kart graficznych różnych typów (m.in. EGA, VGA,IBM8512), rysowanie różnych figur geometrycznych z zastosowaniem różnych linii, kreślenie okręgów, elips, oraz ich wycinków z możliwością ich wypełnienia, wypełnianie obszarem wzorcem własnym lub standardowym, tworzenie napisów w trybie graficznym, obsługę błędów operacji graficznych. Prototypy tych funkcji są umieszczone w bibliotece graphics.h
Organizacja i zarządzanie ekranem w trybie graficznym Zarządzanie w trybie graficznym zależy od typu zainstalowanej w komputerze karty graficznej Rozdzielczość (liczba punktów w pionie i poziomie) Liczba kolorów W pakiecie kompilatora Borland C++ dostarczane są sterowniki grafiki umożliwiające współpracę z różnymi typami kart. BORLANDC\BGI\*.bgi Hercules EGA VGA SVGA
Schemat programu działającego w trybie graficznym #include <graphics.h> #include <iostream.h> #include <conio.h> int inicjuj_grafike(int gdriver, int gmode, char *pathgdriver); int main() { int ster=DETECT, tryb; if (!inicjuj_grafike(ster, tryb, "c:\\studenci\\cpp\\borlandc\\bgi")) return 0; line(0,0,200,200); getch(); closegraph(); } int inicjuj_grafike(int gdriver, int gmode, char *pathgdriver) initgraph (&gdriver, &gmode, pathgdriver); if (graphresult()!=grOk) { cout<<"Blad w czasie uruchomienia grafiki"; return 0; } else return 1; Prototyp funkcji inicjuj_grafike Definicja funkcji inicjuj_grafike ze sprawdzeniem poprawności uruchomienia trybu graficznego Wywołanie funkcji inicjuj_ grafike Operacje w trybie graficznym Zamknięcie trybu graficznego
Funkcje zarządzające trybem graficznym initgraph(int *graphdriver, int *graphmode, const char *pathtodriver); Funkcja inicjująca obsługę grafiki *graphdriver – wskaźnik zmiennej zawierającej liczbę określającą typ sterownika grafiki, Jeżeli graphdriver=DETECT – funkcja sama określi jaki sterownik i jaki tryb pracy jest najbardziej odpowiedni. *graphmode – wskaźnik do zmiennej zawierającej numer trybu graficznego dla danego sterownika Jeżeli graphdriver=DETECT – wówczas wartość zmiennej graphmode nie jest brana pod uwagę. *pathtodriver – łańcuch zawierający ścieżkę do katalogu ze sterownikami grafiki (pliki *.bgi) closegraph(void); Funkcja zamykająca obsługę grafiki, przywraca tryb pracy przed inicjacją graphdefaults(void); Funkcja przywraca domyślne parametry pracy w aktualnym trybie.
Wybrane stałe sterowników graficznych i trybów graficznych Karta graficzna Stała i wartość sterownika graficznego Stała i wartość trybu graficznego karty Tryb pracy karty DETECT 0 EGA EGA 3 EGALO 0 EGAHI 1 640x200, 16 kolorów, 4 strony 640X350, 16 kolorów, 2 strony VGA VGA 9 VGALO 0 VGAMED 1 VGAHI 2 640x350, 16 kolorów, 2 strony 640x480, 16 kolorów, 1 strona IBM8514 IBM8514 6 IBM8514LO 0 IBM8514HI 1 640x480, 256 kolorów 1024x768, 256 kolorów
Określenie położenia na ekranie współrzędne ekranowe absolutne i względne Xabs Xwzgl Ywzgl Okno graficzne Yabs punkt ekranu (pixel)
Okna graficzne i ich obsługa wybrane funkcje cleardevice(void); Czyści cały ekran graficzny tzn. wypełnia go kolorem tła i ustala położenie na (0,0) clearviewport(void); Czyści aktualne okno graficzne i ustala położenie na (0,0) w nim. int getmaxx(void); int getmaxy(void); Zwracają max wartość ekranowej współrzędnej x oraz y dla aktualnego sterownika i trybu pracy. setviewport(int left, int top, int right, int bottom, int clip); Ustala parametry nowego okna graficznego (setviewport(10,10,200,200,0). Gdy parametr clip=0 operacje graficzne są ograniczone do obszaru okna.
Zarządzanie paletami kolorów Kolory Każdemu pikselowi odpowiada wartość, która nie określa koloru w sposób bezpośredni, lecz stanowi indeks palety kolorów zawierającej faktyczną informację o kolorze punktu. W ten sposób na ekranie może być jednocześnie wyświetlanych tyle kolorów, ile wpisów znajduje się w palecie. stała wartość kolor BLACK czarny BLUE 1 niebieski GREEN 2 zielony CYAN 3 turkusowy RED 4 czerwony MAGENTA 5 karmazynowy BROWN 20 brązowy LIGHTGRAY 7 jasnoszary DARKGRAY 56 ciemnoszary LIGHTBLUE 57 jasnoniebieski LIGHTGREEN 58 jasnozielony LIGHTCYAN 59 jasnoturkusowy LIGHTRED 60 jasnoczerwony LIGHTMAGENTA 61 jasnokarmazynowy YELLOW 62 żółty WHILE 63 biały Sterowanie kolorami setbkcolor(int color) –ustala kolor tła obrazu setbkcolor(1); setcolor(int color) –ustala kolor rysowania setcolor(60); Zarządzanie paletami kolorów Stałe kolorów EGA i VGA
Wzorzec i kolor wypełnienia setfillstyle(int pattern, int color);–ustala aktualne parametry wypełniania obszarów pattern – wzorzec, color –kolor wypełnienia setfillstyle(6,4); setfillpattern(const char *upattern, int color);–pozwala na zdefiniowanie wzorca przez użytkownika upattern –tablica wzorca, color –kolor wypełnienia setfillpattern(tab,4); floodfill(int x, int y, int border);–wypełnianie obszarów otoczonych konturem. Parametry x,y określają punkt wewnątrz wypełnianego konturu. floodfill(10,20,4);
Sterowanie pozycją wskaźnika ekranu (aktualną pozycją) int getx(void); int gety(void); –wartością są aktualne współrzędne wskaźnika ekranu. getx(); gety(); moverel(int dx, int dy); –przesuwa wskaźnik ekranu o wektor (dx,dy). moverel(20,30); moveto(int x, int y); –przesuwa wskaźnik ekranu do punktu (x,y). moveto(100,214);
Sterowanie wyglądem i sposobem kreślenia linii setlinestyle(int linestyle, unsigned upattern, int thickness); –ustalenie aktualnego rodzaju linii (faktury) –linestyle i jej grubości –thickness, gdy linia definiowana jest przez użytkownika wartość parametru upattern określa wzór linii użytkownika. setlinestyle(0,0,3) –linia ciągła pogrubiona. Stałe rodzajów linii (line_style) stała wartość znaczenie SOLID_LINE ciągła DOTTED_LINE 1 kropkowana CENTER_LINE 2 symetrii DASHED_LINE 3 przerywana USERBIT_LINE 4 definiowana przez użytkownika Stałe grubości linii NORM_WIDTH normalna grubość THICK_WIDTH pogrubiona
Rysowanie punktów i linii putpixel(int x, int y, int color); – rysuje punkt w miejscu o współrzędnych (x,y) i kolorze color putpixel(45,36,4); line(int x1, int y1, int x2 ,int y2); – rysuje linię od punktu (x1,y1) do punktu (x2,y2) line(45,36,4,5); linerel(int dx, int dy); – rysuje linię od punktu aktualnej pozycji wskaźnika do punktu oddalonego o wektor (dx,dy). linerel(5,36); lineto(int x, int y); – rysuje linię od punktu aktualnej pozycji wskaźnika do punktu o współrzędnych (x,y). lineto(25,36);
Rysowanie – prostokąt, wielokąt, łamane rectangle(int left, int top, int right, int bottom); – funkcja rysuje prostokąt rozpięty między punktami (left,top) i (right,bottom) używając aktualnego koloru, rodzaju i grubości linii) rectangle(4,5,34,56); bar(int left, int top, int right, int bottom); – funkcja wypełnia prostokątny obszar rozpięty między punktami (left,top) i (right,bottom) używając aktualnego koloru i wzorca) bar(45,36,48,58); drawpoly(int numpoints, const int *polypoints); – funkcja rysuje łamaną o liczbie wierzchołków określonych parametrem numpoints używając aktualnego koloru, rodzaju i grubości linii. drawpoly(45,*tab1); fillpoly(int numpoints, const int *polypoints); – funkcja rysuje łamaną o liczbie wierzchołków określonych parametrem numpoints używając aktualnego koloru, rodzaju i grubości linii a następnie wypełnia zamkniętą łamaną. fillpoly(45,*tab1);
Rysowanie – okrąg, elipsa, łuk arc(int x, int y, int stangle, int endangle, int radius); – łuk o środku w punkcie (x,y) i promieniu radius. Łuk ten kreślony jest od kąta stangleo do kąta endangleo. arc(4,5,34,0,90); circle(int x, int y, int radius); – okrąg o środku w punkcie (x,y) i promieniu radius. circle(100,150,90); ellipse(int x, int y, int stangle, int endangle, int xradius, int yradius); – eliptyczny łuk o środku w punkcie (x,y) i półosiami poziomą xradius i pionową yradius. Łuk ten kreślony jest od kąta stangleo do kąta endangleo. ellipse(4,5,0,90,20,10); fillellipse(int x, int y, int xradius, int yradius); – elipsa o środku w punkcie (x,y) i półosiami xradius i yradius i wypełnia bieżącym wzorcem i kolorem. fillellipse(4,5,20,10); pieslice(int x, int y, int stangle, int endangle, int radius); – wycinek koła sektor(int x, int y, int stangle, int endangle, int xradius, yradius); – wycinek elipsy.
Teksty w trybie graficznym settextjustyfy(int horiz, int vert); – tryb justowania tekstu dla poziomego horiz ( LEFT_TEXT – 0) i pionowego vert (BOTTOM_TEXT – 0) settextjustyfy(0,0); settextstyle(int font, int direction, int charsize); – krój pisma –font (SMALL_FONT – 2), kierunek wysyłania znaków na ekran –direktion (HORIZ_DIR), rozmiar znaków –charsize. settextstyle(2,HORIZ_DIR,5); outtext(const char *textstring); – wyświetla w aktualnym oknie łańcuch znaków wskazanych parametrem textstring od aktualnej wartości wskaźnika ekranu. outtext(*napis); outtextxy(int x, int y, const char *textstring); – wyświetla w aktualnym oknie łańcuch znaków wskazanych parametrem textstring przy zachowaniu aktualnych parametrów tekstowych począwszy od punktu (x,y). outtextxy(34,45,*napis);
Program graficzny do rysowania prostej grafiki #include <graphics.h> #include <iostream.h> #include <conio.h> int inicjuj_grafike(int gdriver, int gmode, char *pathgdriver); int main() { int ster=DETECT, tryb,tab[]={10,430,60,450,50,460,5,470}; if (!inicjuj_grafike(ster, tryb, "c:\\studenci\\cpp\\borlandc\\bgi")) return 0; Blok instrukcji do rysowania prostej grafiki getch(); closegraph(); } int inicjuj_grafike(int gdriver, int gmode, char *pathgdriver) initgraph (&gdriver, &gmode, pathgdriver); if (graphresult()!=grOk) { cout<<"Blad w czasie uruchomienia grafiki"; return 0; } else return 1; graf-i.exe
Blok instrukcji do rysowania prostej grafiki setbkcolor(15); //kolor tla - bialy putpixel(100,5,4); //rysowanie punktu (kolor czerwony) setcolor(4); //kolor rysowania - czerwony settextstyle(10,HORIZ_DIR,0); //ustawienie stylu tekstu outtextxy(105,5,"- putpixel(100,5,4);- punkt"); //wyprowadzenie tekstu moveto(20,40); //ustalenie aktualnego polozenia wskaznika setcolor(2); lineto(100,40); //rysowanie linii do punktu setcolor(1); setlinestyle(0,0,3); //ustawienie stylu linii (ciagla pogrubiona) line(20,60,100,60); outtextxy(105,60,"- line(20,60,100,60);- ostatnia linia "); setcolor(5); circle(50,100,20); //rysowanie okregu outtextxy(105,100,"- circle(50,100,20);- okrag "); setcolor(6); ellipse(50,140,0,270,30,10); //rysowanie elipsy outtextxy(105,140,"- ellipse(50,140,0,270,30,10);- elipsa "); setcolor(7); arc(50,180,100,250,20); //rysowanie luku outtextxy(105,180,"- arc(50,180,100,250,20); -luk");
Blok instrukcji do rysowania prostej grafiki cd setcolor(1); setfillstyle(4,4); //ustawienie stylu wypelnienia fillellipse(50,230,40,15); //rysowanie elipsy wypelnionej outtextxy(105,215,"- setfillstyle(4,4); - wypelnienie"); outtextxy(105,230,"- fillellipse(50,230,40,15);- elipsa wypelniona"); setfillstyle(1,12); pieslice(50,280,150,270,35); //rysowanie wycinka kola outtextxy(105,280,"- setfillstyle(1,12); - wypelnienie"); outtextxy(105,295,"- pieslice(50,280,150,270,35);- wycinek kola"); setfillstyle(5,4); rectangle(10,320,100,350); //rysowanie prostokata bar(10,320,100,350); //wypelnienie obszaru prostokatnego outtextxy(105,330,"- bar(10,320,100,350); - wypelnienie obszaru prostokatnego"); outtextxy(105,345,"- rectangle(10,320,100,350); - rysowanie prostokata"); bar3d(10,380,60,410,20,1); //trojwymiarowy prostopadloscian outtextxy(105,380,"- bar3d(10,380,60,410,20,1); -trojwymiarowy prostopadloscian"); settextstyle(4,HORIZ_DIR,0); setcolor(11); drawpoly(4,tab); //rysowanie lamanej outtextxy(105,430,"-drawpoly(4,tab); -rysowanie lamanej");
Tarcza #include <graphics.h> #include <iostream.h> #include <conio.h> void main() { int gdriver=DETECT, gmode; initgraph (&gdriver, &gmode, "c:\\studenci\\cpp\\borlandc\\bgi"); setbkcolor(0); setcolor(4); setlinestyle(0,0,3); for(int j=0,t=1;j<100,t<10;j=j+25,t++) setcolor(t); for (int i=0;i<25;i++) circle(320,240,j+i); } getch(); closegraph(); tarcza.exe
Pawie oczko #include <graphics.h> #include <iostream.h> #include <conio.h> void main() { int gdriver=DETECT, gmode; initgraph (&gdriver, &gmode, "c:\\studenci\\cpp\\borlandc\\bgi"); setbkcolor(0); setcolor(4); setlinestyle(0,0,3); for(int j=0,t=1;j<100,t<10;j=j+25,t++) setcolor(t); for (int i=0;i<25;i++) circle(j+i,240,j+i); } getch(); closegraph(); pawie.exe
Spirala – funkcja rekurencyjna #include <graphics.h> #include <iostream.h> #include <conio.h> const double alpha=20; void spirala (double lg, double x, double y); int inicjuj_grafike(int ster, int tryb, char *scster); int main() { int gdriver=DETECT, gmode, errorcode; if (!inicjuj_grafike(gdriver, gmode, "c:\\studenci\\cpp\\borlandc\\bgi")) return 0; setbkcolor(14); setcolor(4); setlinestyle(0,0,3); moveto(150,100); spirala (getmaxx()/2,getx(),gety()); getch(); closegraph(); } spirala.exe
Spirala – funkcja rekurencyjna cd. int inicjuj_grafike(int ster, int tryb, char *scster) { initgraph (&ster, &tryb, scster); if (graphresult()!=grOk) { cout<<"Blad"; return 0; } else return 1; } void spirala (double lg, double x, double y) { if (lg>0) lineto (x+lg,y); lineto (x+lg,y+lg); lineto (x+alpha, y+lg); lineto (x+alpha, y+alpha); spirala (lg-2*alpha, x+alpha, y+alpha); funkcja rekurencyjna