AJS
AJS
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
AJS
AJS
Organizacja ekranu w trybie
tekstowym
Ekran podzielony jest na jednakowe
komórki.
W komórce może znaleźć się tylko
jeden znak
1 2 3 4 5 6 7 8 9
1
2
3
4
5
D
6
7
8
(left,to
p)
(right,bott
om)
współrzędne
względne (3,2)
okno
tekstowe
współrzędne
bezwzględne
kolumna
3
wiersz 2
AJS
AJS
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
AJS
AJS
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
0
4
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
AJS
AJS
stała
warto
ść
kolor
zastosowanie
BLACK
0
czarny
tło i znak
BLUE
1
niebieski
tło i znak
GREEN
2
zielony
tło i znak
CYAN
3
turkusowy
tło i znak
RED
4
czerwony
tło i znak
MAGENTA
5
karmazynowy
tło i znak
BROWN
6
brązowy
tło i znak
LIGHTGRAY
7
jasnoszary
tło i znak
DARKGRAY
8
ciemnoszary
znak
LIGHTBLUE
9
jasnoniebieski
znak
LIGHTGREEN
10
jasnozielony
znak
LIGHTCYAN
11
jasnoturkusowy
znak
LIGHTRED
12
jasnoczerwony
znak
LIGHTMAGENT
A
13
jasnokarmazyno
wy
znak
YELLOW
14
żółty
znak
WHILE
15
biały
znak
BLINK
128
migotanie
znak
Stałe kolorów
AJS
AJS
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,
AJS
AJS
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();
AJS
AJS
#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;
}
Wydruk kolorów – od 0 do 15
0
kolor
1
kolor
2
kolor
3
kolor
4
kolor
5
kolor
14
kolor
15
kolor
AJS
AJS
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
AJS
AJS
Manipulatory strumieni konsoli
constream.h
manipulator
anlogiczna
funkcja
ze zbioru conio.h
zastosowanie
clreol
clreol
usuwa znaki do końca wiersza
delline
delline
usuwa wiersz tekstu
highvideo
highvideo
włącza podwyższoną jasność
insline
insline
wstawia pusty wiersz
lowvideo
lowvideo
włącza normalną jasność
normvideo
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(i
nt)
_setcursortype
steruje rozmiarem kursora
setxy(int,i
nt)
gotoxy
ustawia kursor na zadanej
pozycji
AJS
AJS
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;
}
AJS
AJS
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
AJS
AJS
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
AJS
AJS
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;
}
Operacje w trybie
graficznym
Zamknięcie trybu
graficznego
Prototyp funkcji
inicjuj_grafike
Definicja funkcji
inicjuj_grafike ze
sprawdzeniem
poprawności uruchomienia
trybu graficznego
Wywołanie funkcji inicjuj_
grafike
AJS
AJS
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.
AJS
AJS
Wybrane stałe sterowników graficznych i trybów
graficznych
Karta
graficzn
a
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
640x200, 16 kolorów, 4
strony
640x350, 16 kolorów, 2
strony
640x480, 16 kolorów, 1
strona
IBM851
4
IBM8514 6
IBM8514LO
0
IBM8514HI
1
640x480, 256 kolorów
1024x768, 256 kolorów
AJS
AJS
Xwzgl
Ywzgl
Okno
graficzne
Określenie położenia na ekranie
współrzędne ekranowe absolutne i względne
Xabs
Yabs
punkt ekranu
(pixel)
AJS
AJS
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.
AJS
AJS
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ła
warto
ść
kolor
BLACK
0
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
LIGHTMAGENT
A
61
jasnokarmazyno
wy
YELLOW
62
żółty
WHILE
63
biały
S
ta
łe
k
o
lo
ró
w
E
G
A
i
V
G
A
AJS
AJS
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);
AJS
AJS
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);
AJS
AJS
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
0
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
1
normalna grubość
THICK_WIDTH
3
pogrubiona
AJS
AJS
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);
AJS
AJS
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);
AJS
AJS
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
stangle
o
do kąta endangle
o
.
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 stangle
o
do kąta
endangle
o
.
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.
AJS
AJS
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);
AJS
AJS
#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;
}
Program graficzny do rysowania prostej
grafiki
graf-i.exe
AJS
AJS
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
AJS
AJS
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");
Blok instrukcji do rysowania prostej grafiki
cd
AJS
AJS
#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
tarcza.exe
AJS
AJS
#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 oczko
pawie.exe
AJS
AJS
#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 – funkcja rekurencyjna
spirala.exe
AJS
AJS
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);
}
}
Spirala – funkcja rekurencyjna cd.
funkcja
rekurencyjna