340 likes | 656 Views
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.
E N D
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 (left,top) okno tekstowe wiersz 2 (right,bottom) współrzędne względne (3,2)
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 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 atrybutami znaków wysyłanymi na ekran Bajt atrybutu znaków określa kolor znaku, podwyższoną jasność. kolor jego tła, migotanie 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
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();
0 kolor 1 kolor 2 kolor 3 kolor 4 kolor 5 kolor 14 kolor 15 kolor 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; }
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
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
Prototyp funkcji inicjuj_grafike Wywołanie funkcji inicjuj_ grafike Operacje w trybie graficznym Zamknięcie trybu graficznego Definicja funkcji inicjuj_grafike ze sprawdzeniem poprawności uruchomienia trybu graficznego 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; }
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
Xwzgl Okno graficzne Ywzgl Określenie położenia na ekranie współrzędne ekranowe absolutne i względne Xabs 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.
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. 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.
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