Wyklad 13 Grafika C


WYKAAD 13
Programowanie grafiki w języku C
Programy:
tryb  tekstowy c6_1.c, c6_2
tryb  graficzny c7_1.c ... c7_5A.c
Tomasz Zieliński
PAMIĆ TRYBU TEKSTOWEGO I GRAFICZNEGO
(szesnastkowo)
Pamięć RAM
Adres
0:0000
Command.com
pamięć
na
programy
Stos
Obsługa przerwań
10 razy 64 kB
A:0000
64 kB
Tryb graficzny
Karta
Monitor
11 razy 64 kB B:0000 graficzna
64 kB
Tryb tekstowy
Urządzenia we/wy
EKRAN TRYBU GRAFICZNEGO
MODE VGA
Inne:
640
320 x 200 (CGA)
(0, 0)
640 x 480 (VGA)
800 x 600 (SVGA)
1024 x 768 (XGA)
8 b 8 b
1280 x 800 (WXGA)
R G
1280 x 1024 (SXGA)
480
1600 x 1200 (UXGA)
B
720 x 480 (NTSC)
8 bitów
720 x 576 (PAL)
1280 x 720 (HD 1)
(479, 639)
1920 x 1080 (HD 2)
Np. 1000 pikseli x 1000 pikseli x 8 bitów x 8 bitów x 8 bitów = 24 000 000 bitów
Obraz cyfrowy jako macierz liczb
a) b)
n 6
N
m
x(1, 1) x(1, 2) x(1, N) 11 22 33 44 55 66
x(2, 1) x(2, 2) x(2, N) 117 165 249 149 135 77
x(3, 1) x(3, 2) x(3, N) 43 125 0 0 217 88
M 6
x(4, 1) x(4, 2) x(4, N) 98 234 0 0 168 99
177 155 133 199 111 110
x(M, 1) x(M, 2) x(M, N) 236 43 76 87 99 121
c) d)
5 10 15 20 25
200
5
100
10
0
5
15
10
15 25
20
20
15
20
10
m
5
25
n
25
x(m,n)
Obraz analogowy ! obraz cyfrowy
dyskretyzacja
kwantyzacja
obraz obraz cyfrowy
x
y
x
y
x
n
analogowy macierz liczb
y
x
y
x
y
m
Skanowanie linii obrazu cyfrowego
skanowanie 10. linii
wartość piksela, numer poziomu szarości
1
255
5
192
10
128
64
y
15
1 5 10 15 20 1 5 10 15 20
1 5 10 15 20
300
kapelusz
250

200
160
150
100
50
włosy
100 200 300 400 500
numer kolumny n
poziom szarości
SYGNAA WIDEO JAKO MACIERZ 3-D
n
czas
m
klatka 1 filmu klatka 2 filmu klatka 3 filmu
KODOWANIE KOLORU
Analogowy standard NTSC (YIQ):
Y = 0,299R + 0,587G + 0,114B
ż#
#
I = 0,736(R - Y ) - 0,268(B - Y ) = 0,596R - 0,274G - 0,321B
#
#
Q = 0,478(R -Y ) + 0.413(B -Y ) = 0,211R - 0,523G + 0,311B
#
Analogowy standard PAL (YUV ):
Y = 0,299R + 0,587G + 0,114B
ż#
#U = 0,492(B - Y ) = -0,147R - 0,289G + 0,436B
#
#V = 0,877(R - Y ) = 0,615R - 0,515G - 0,100B
#
Telewizja cyfrowa, DVD (YCbCr):
Y = 0,299R + 0,587G + 0,114B
ż#
#Cb = 0,564(B - Y ) = -0,1687R - 0,3313G + 0,5B
#
#Cr = 0,713(R - Y )0,5R - 0,4187G - 0,0813B
#
EKRAN TRYBU TEKSTOWEGO
MODE C80, BW80
80
8 x 8
(0, 0)
T
[ T Y U A ]
O P C J A 1
25
O P C J A 2
O P C J A 3
O P C J A 4
kolor kolor
tła znaku
(24, 79)
EKRAN TRYBU TEKSTOWEGO - Tablica znaków ASCII
EKRAN TRYBU TEKSTOWEGO - Tablica znaków ASCII
ZAPIS OBRAZU EKRANU W PAMICI
Tryb tekstowy:
4 bity 4 bity
8 bitów
atrybuty atrybuty
kod ASCII znaku
tła
znaku
atrybuty = kolor, ewentualne miganie
Tryb graficzny:
x bitów x bitów x bitów
indeks koloru indeks koloru indeks koloru
w palecie w palecie w palecie
PALETA KOLORÓW TRYBU GRAFICZNEGO
kolor = kR " R " kG " G " kB " B
Przykład: paleta 64 poziomów szarości (8 bitów na kolor)
Indeks (numer)  koloru kR (RED) kG (GREEN) kB (BLUE)
0 0 0 0
1 4 4 4
2 8 8 8
3 12 12 12
... ... ... ...
62 248 248 248
63 252 252 252
FUNKCJE JZYKA C TRYBU TEKSTOWEGO
textmode( mode ) mode = C80, C40, BW80, BW40 (Color, BlackWhite)
clrscr(); clear screen
textcolor( color ) kolor znaku = BLACK, BLUE, GREEN, CYAN, RED,
MAGENTA, BROWN, ..., YELLOW, WHITE
textbackground( color ) kolor tła znaku
textattr( color ) jednocześnie kolor znaku (4b górne) i tła (4b dolne)
highvideo() intensywny kolor
lowvideo() blady kolor
_setcursortype( typ ) typ = _NOCURSOR (bez), _SOLIDCURSOR (blok),
_NORMALCURSOR (podkreślenie)
col = wherex() podaj współrzędną x kursora
row = wherey() podaj współrzędną y kursora
goto( x, y) przesuń kursor do punktu (x, y)
putch( znak ) napisz znak tam gdzie jest aktualnie kursor
cprintf( %s , text); cputs( text ) napisz tekst tam gdzie jest aktualnie kursor
znak = getch(); cscanf(  %d , &zmienna) wczytaj znak lub liczbę
char bufor[82]; string = cgets( bufor ) wczytaj bufor klawiatury
window( x1, y1, x2, y2) aktywne okno (x1, y1) - (x2, y2), tylko w nim akcja
/* Przykład 6.1 - GRAFIKA - Tryb tekstowy ----------------------- menu */
#include
#include
#include
int menu( char *tytul, char *opcja[ ], int ileopcji, int x, int y, int dx );
void ramka( int x, int y, int dx, int dy, char *tytul );
void textline( int x1, int y1, int x2, int y2, char znak );
/* program główny ----------------------------------------------------------------- */
void main()
{
char *tytul = "MENU";
char *opcja[] = { " 0000 ", " 1111 ", " 2222 ", " 3333 " };
int ileopcji = 4;
int kolumna = 30, wiersz = 10, szerokosc=8;
int numer;
numer = menu( tytul, opcja, ileopcji, kolumna, wiersz, szerokosc);
printf("\n Wybrano opcje numer %d ! \n", numer );
}
/* Funkcje pomocnicze------------------------------------------------------------ */
int menu( char *tytul, char *opcja[ ], int ileopcji, int x, int y, int dx)
{
char c;
int i, nr;
int xofs, yofs;
xofs = 1; yofs = 1; // przesunięcie w ramce
clrscr(); // wyczyść ekran
_setcursortype(_NOCURSOR); // nie wyświetlaj kursora
ramka( x-1, y-1, dx+1, ileopcji+1, tytul ); // narysuj obramowanie
window( x, y, x+dx, y+ileopcji ); // definicja okna tekstowego
// wybrana opcja 0 - intensywnie, niebieskie litery na żółtym tle
highvideo(); textcolor( BLUE ); textbackground( YELLOW );
gotoxy( xofs, yofs ); cprintf( "%s", opcja[ 0 ] );
// pozostałe opcje - blado, białe litery na czarnym tle
lowvideo(); textcolor( WHITE ); textbackground( BLACK );
for( i=1; i{ gotoxy( xofs, yofs+i ); cprintf( "%s", opcja[ i ] ); }
// PTLA WYBORU: zmiana za pomocą strzałek wybranej opcji
nr = 0;
while( (c =getch()) != 13 ) // czekaj na ENTER
{
switch( c ) {
case 80: // strzałka do dołu
lowvideo();
textcolor( WHITE ); textbackground( BLACK );
gotoxy( xofs, yofs+nr ); cprintf( "%s", opcja[ nr ] );
nr++;
if ( nr > ileopcji-1 ) nr = 0;
highvideo();
textcolor( BLUE ); textbackground( YELLOW );
gotoxy( xofs, yofs+nr ); cprintf( "%s", opcja[ nr ] );
break;
case 72: // strzałka do góry
lowvideo();
textcolor( WHITE ); textbackground( BLACK );
gotoxy( xofs, yofs+nr ); cprintf( "%s", opcja[ nr ] );
nr--;
if ( nr < 0 ) nr = ileopcji-1;
highvideo();
textcolor( BLUE );textbackground( YELLOW );
gotoxy( xofs, yofs+nr ); cprintf( "%s", opcja[ nr ] );
break;
}
}
textattr( WHITE ) ; textcolor( WHITE ); // standard
window( 1, 1, 80, 25); // caly ekran/
clrscr(); // wyczyść ekran
return( nr );
}
/* ----------------------------------------------------------------------------------------- */
void ramka( int x, int y, int dx, int dy, char *tytul)
{
char *text;
textcolor( YELLOW ); // kolor znaku
// LINIE
textline( x, y, x+dx, y, 205 ); // linia pozioma górna
textline( x, y+dy, x+dx, y+dy, 205 ); // linia pozioma dolna
textline( x, y, x, y+dy, 186 ); // linia pionowa pierwsza
textline( x+dx, y, x+dx, y+dy, 186 ); // linia pionowa druga
// ROGI
gotoxy( x, y ); putch( 201 ); // górny lewy
gotoxy( x+dx, y ); putch( 187 ); // górny prawy
gotoxy( x+dx, y+dy ); putch( 188 ); // dolny prawy
gotoxy( x, y+dy ); putch( 200 ); // dolny lewy
strcpy( text, "[" ); // TYTUA
strcat( text, tytul );
strcat( text, "]" );
gotoxy( x+(dx-strlen(tytul))/2, y ); cprintf( text );
textcolor( WHITE );
}
/* ---------------------------------------------------------------------------------------- */
void textline( int x1, int y1, int x2, int y2, char znak )
{
int ix, iy;
if ( x1 == x2 ) // linia pionowa
{ for( iy=y1; iy<=y2; iy++ )
{ gotoxy( x1, iy ); putch( znak ); } }
if ( y1 == y2 ) // linia pozioma
{ for( ix=x1; ix<=x2; ix++ )
{ gotoxy( ix, y1 ); putch( znak ); } }
}
FUNKCJE JZYKA C TRYBU GRAFICZNEGO (1)
initgraph( &driver, &mode); driver = DETECT, CGA, EGA, VGA
closegraph(); mode = VGALO, VGAMED, VGAHI (640 x 480)
MaxX = getmaxx(); podaj liczbę pikseli w osi x
MaxY = getmaxy(); podaj liczbę pikseli w osi y
cleardevice(); wyzeruj ekran
setviewport( x1, y1, x2, y2); aktywne okno (x1, y1) - (x2, y2)
putpixel( x, y, color ); ustaw kolor punktu (x,y)
color = getpixel( x, y); pobierz kolor z punktu (x,y)
setcolor( color ); ustaw aktywny kolor piksela, linii, ...
line( x1, y1, x2, y2); linia od punktu (x1,y1) do punktu (x2,y2)
moveto( x1, y1); przesuń kursor do punktu (x1,y1)
lineto( x2, y2 ); rysuj linię od kursora do punktu (x2,y2)
setlinestyle( styl, wzor, grubosc );
styl DOTTED_LINE (kropkowana) wzor 0xAB (wzór bitowy)
SOLID_LINE (ciągła) grubość
CENTER_LINE (kreska-kropka) NORM_WIDTH (norma)
DASHED_LINE (przerywana) THICK_WIDTH (gruba)
USERBIT_LINE (patrz wzór)
FUNKCJE JZYKA C TRYBU GRAFICZNEGO (2)
// TEKST
char *s; // poziom: LEFT_TEXT, CENTER_TEXT,
sprintf( s,  %d , liczba ); // RIGHT_TEXT
settextjustify( poziom, pion ); // pion: BOTTOM_TEXT, CENTER_TEXT,
outtext( x, y, s); // TOP_TEXT
Tekst Tekst Tekst
Tekst Tekst Tekst
Tekst Tekst Tekst
ANIMACJA
void *bufor; // pobieramy do bufora obraz od (x1,y1)
long size; // do (x2,y2) za pomocą funkcji getimage
size = imagesize( x1, y1, x2, y2); // a następnie obraz ten  kładziemy w
bufor = malloc( size ); // innym miejscu, wykonując operację
getimage( x1, y1, x2, y2, bufor ); // logiczną XOR, OR, AND na bitach
putimage( x, y, bufor, COPY_PUT ); //  nakładanych i  istniejących
XOR_PUT // getimage // początek
OR_PUT // LOOP: putimage( XOR ); // stara poz.
AND_PUT // putimage( XOR ); // nowa poz.
NOT_PUT // goto LOOP
LOOP:
setactivepage(0); // w pamięci graficznej może się zmieścić
// rysuj na page(0) // kilka  stron ekranu, ponumerowanych 0, 1, 2, ...
setvisualpage(0); // na jednej stronie rysujemy, a inną - wyświetlamy
setactivepage(1); // ustawienie strony nr 1 pamięci do rysowania
// rysuj na page(1) // rysowanie na stronie nr 1
setvisualpage(1); // ustawienie strony nr 1 pamięci do wyświetlania
goto LOOP; //
/* Przyklad 7.1: GRAFIKA - tryb graficzny */
/* wykresy 2D - suma kilku sinusoid */
/* Dołącz biblioteki ----------------------------------------------------------------*/
#include
#include
#include // dołączamy bibliotekę graficzną
#include
/* Definiuj stale i zmienne globalne -----------------------------------------*/
#define MaxDATA 500 // maksymalna długość wektora danych
int GraphDriver; // rodzaj sterownika graficznego
int GraphMode; // tryb graficzny
int ErrorCode; // kod błędu graficznego
/* Definiuj funkcje własne --------------------------------------------------------*/
// tym razem brak
/**************************** Program główny *******************************/
main()
{
/* Definiuj stale i zmienne lokalne --------------------------------------------*/
float dane[ MaxDATA ]; // wektor danych
int MaxX, MaxY; // max rozdzielczość w poziomie i pionie
int i, j; // robocze zmienne indeksowe
float pi=3.1415927; // stała
int sX, sY, lenX, lenY; // inne zmienne
int nX, nY; // robocze,
float pX, dX, pY, dY, miniY, maxiY, diffY, v; // opisane poniżej
char *s;
/* Uruchom tryb graficzny ------------------------------------------------------- */
GraphDriver = DETECT; /* prośba o autodetekcję */
initgraph( &GraphDriver, &GraphMode, "" ); /* inicjalizacja grafiki */
ErrorCode = graphresult(); /* wynik inicjalizacji */
if( ErrorCode != grOk ) /* czy błąd inicjalizacji ? */
{
printf("Graphics System Error: %s\n", grapherrormsg( ErrorCode ) );
return( 1 );
}
MaxX = getmaxx(); // liczba pikseli w poziomie
MaxY = getmaxy(); // liczba pikseli w pionie
cleardevice(); // wyzeruj ekran graficzny
setviewport( 0, 0, MaxX, MaxY, 0); // pole graficzne = cały ekran
/* Generacja danych do wizualizacji ------------------------------------------*/
for( i = 0 ; i < MaxDATA; i++ )
dane[ i ] = 0.1 + 0.5 * sin(2.*pi*i/100.) + 0.25 * cos(2.*pi*i/25.);
/* Wizualizacja ------------------------------------------------------------------------*/
sX = 20; // prawy górny róg rysunku w pikselach (S-tart X)
sY = 20; // (S-tart Y)
lenX = MaxDATA; // wymiary wykresu w poziomie (X)
lenY = MaxY-100; // wymiary wykresu w pionie (Y)
nX = 5; // os X - na ile odcinków podzielić
pX = 0.; // os X - (p)ierwsza wartość opisu
dX = 100.; // os X - o(d)leglość pomiędzy wartościami
nY = 8; // os Y - na ile odcinków podzielić
pY = -1.0; // os Y - (p)ierwsza wartość opisu
dY = 0.25; // os Y - o(d)leglość pomiędzy wartościami
miniY = pY; // os Y - minimum skali
maxiY = pY + nY*dY; // os Y - maksimum skali
diffY = maxiY - miniY; // os Y - różnica max-min
setcolor(getmaxcolor()/2); // ustaw kolor biały
line( sX, sY, sX+lenX, sY ); // RAMKA RYSUNKU
line( sX+lenX, sY, sX+lenX, sY+lenY ); //
line( sX+lenX, sY+lenY, sX, sY+lenY ); // czyli cztery
line( sX, sY+lenY, sX, sY ); // linie proste
settextjustify( LEFT_TEXT, CENTER_TEXT); // OPIS OSI Y
for( i = 0 ; i <= nY; i++) //
{ //
sprintf( s, "%6.2f", pY + i * dY ); //
outtextxy( sX+lenX, sY+(nY-i)*lenY/nY, s ); //
}
settextjustify( CENTER_TEXT, TOP_TEXT); // OPIS OSI X
for( i = 0 ; i <= nX; i++) //
{ //
sprintf( s, "%3.0f", pX + i * dX ); //
outtextxy( sX+i*lenX/nX, sY+lenY+8, s); //
} //
setlinestyle( DOTTED_LINE, 0x00, NORM_WIDTH); // SIATKA
for( i = 1 ; i < nY; i++) //
{ line( sX, sY+i*lenY/nY, sX+lenX, sY+i*lenY/nY ); } // poziom
for( i = 1 ; i < nX; i++) //
{ line( sX+i*lenX/nX, sY, sX+i*lenX/nX, sY+lenY ); } // pion
setlinestyle( SOLID_LINE, 0x00, NORM_WIDTH); // WYKRES
setcolor(getmaxcolor()); // intens. bialy
v = dane[ 0 ]; //
if ( v < miniY ) v=miniY; //
if ( v > maxiY ) v=maxiY; //
j = (int) ( ( (v-miniY)/diffY ) * lenY ); //
moveto( sX, sY+lenY-j ); //
for( i = 1; i < MaxDATA; i++ ) //
{ //
v = dane[ i ]; //
if ( v < miniY ) v=miniY; //
if ( v > maxiY ) v=maxiY; //
j = (int) ( ( (v-miniY)/diffY ) * lenY ); //
lineto( sX+i, sY+lenY-j ); //
} //
/* Czekaj na wciśnięcie klawisza -----------------------------------*/
setcolor(getmaxcolor()-1); // kolor żółty
settextjustify( CENTER_TEXT, TOP_TEXT); // jak pisać
outtextxy( sX+lenX/2, MaxY-10, "WYJSCIE = Esc"); // info o wyjściu
while( getch() != 27 );
/* Koniec --------------------------------------------------------------------------------*/
cleardevice(); // wyzeruj ekran graficzny
closegraph(); // zamknij tryb graficzny
textmode(C80); // powróć do trybu tekstowego
clrscr(); // wyzeruj ekran tekstowy
printf( "\n" );
printf( " Juz po wszystkim !\n" );
printf( "\n" );
return(0);
}


Wyszukiwarka

Podobne podstrony:
wyklad grafiki inzynierskiej
Wykład 4 Grafika rastrowa
grafika inzynierska wyklad 3 color
wykład 13 Grafika
Sieci komputerowe wyklady dr Furtak
Wykład 05 Opadanie i fluidyzacja
WYKŁAD 1 Wprowadzenie do biotechnologii farmaceutycznej
mo3 wykladyJJ
ZARZĄDZANIE WARTOŚCIĄ PRZEDSIĘBIORSTWA Z DNIA 26 MARZEC 2011 WYKŁAD NR 3
Wyklad 2 PNOP 08 9 zaoczne
Wyklad studport 8

więcej podobnych podstron