Sei sulla pagina 1di 9

Grficos em C

Introduo
O objetivo deste captulo mostrar de maneira introdutria a biblioteca grfica do Borland C juntamente com alguns conceitos fundamentais para o seu uso. Trata-se de um assunto sem muitas complicaes e, no entanto, extremamente estimulante, pois pode abrir um enorme leque de novas possibilidades para a criao de programas na linguagem C, ou at mesmo para reformular a interface de projetos anteriores. A computao grfica um campo vasto e complexo, apresentando aspectos artsticos, matemticos e computacionais. Em vista disso, ultimamente vem surgindo alguns termos com o objetivo de diferenciar sub-reas dentro desse grande contexto. Um deles a Compugrafia ou, a cincia que estuda como trabalhar com grficos em sistemas de computadores. Entretanto, mesmo a compugrafia algo muito abrangente. Portanto, o objetivo aqui ser apenas introduzir algumas idias bsicas sobre as bibliotecas grficas do C. Com essas noes e uma boa dose de criatividade pode-se vislumbrar uma srie de aplicaes, seja na produo de jogos simples, programas matemticos que tracem grficos modestos ou at mesmo simulaes usando o computador. Este contedo voltado para todos aqueles que pretendem se aventurar nos recursos grficos oferecidos pela linguagem C. Dedicamos ainda algumas observaes especiais para os estudantes de Informtica da Universidade Federal do Rio de Janeiro que trabalhem no LCI. A criao de um programa inclui diversos elementos estruturais como os algoritmos utilizados e a otimizao do cdigo, mas um fator que, tem a sua importncia cada vez mais confirmada, especialmente em programas que tem como objetivo agradar o usurio: o desenho da interface. A definio de interface diz: "uma situao, ou rea, em que duas coisas podem juntar-se e ter um efeito uma na outra". A interface de um programa tem importncia bilateral: 1. Permitir que um usurio razoavelmente preparado possa expressar o que deseja fazer com os dados. 2. Garantir o retorno (ou feedback) das informaes necessrias ao usurio e avis-lo quando precisar de algum dado. O motivo que gerou a criao deste novo captulo da apostila devido ao fato de que a interface de um programa pode (e em alguns casos deve) conter elementos grficos. Antes de entender como fazer uso de recursos grficos na linguagem C, precisamos definir alguns conceitos bsicos, que na verdade no dependem do estilo ou linguagem de programao, mas sim de caractersticas de hardware de um computador e das idias por traz de tudo isso. Os adaptadores grficos dispe normalmente de vrios modos de exibio, e entre eles normalmente esto divididos em modos de texto e modos grficos. Apesar de todas as funes pr-fabricadas e interfaces de desenvolvimento, as operaes com o seu adaptador grfico so todas feitas atravs de manipulaes de dados em uma rea de memria chamada memria de vdeo. H alguns anos atrs, a IBM, numa tentativa de facilitar a vida dos desenvolvedores de software, criou o padro VGA (Video Graphics Array) que definia uma srie de funes de baixo nvel e registradores que podiam manipular com as informaes da memria de vdeo. As placas de vdeo do padro VGA tinham at 256 Kbytes de memria de vdeo, o que lhes permitia usar definies de at 640x400 pixels com 256 cores simultneas na tela. Entretanto, com o aperfeioamento do hardware grfico, surgiu uma nova gerao de adaptadores grficos para PCs, o SuperVGA, que permitia resolues mais altas e maior profundidade de cores. Os SuperVGAs tambm receberam uma padronizao chamada extenso VESA, para permitir que programadores criassem aplicaes grficas que fossem compatveis com a maior parte dos novos adaptadores.

Conceitos Principais
A Memria de Vdeo - Resoluo e Profundidade de Cores - o Pixel
Agora que j mencionamos a memria de vdeo, vamos nos estender um pouco mais sobre a sua verdadeira utilidade. Toda a tela no modo grfico est dividida em pequenos pontos chamados Pixels (Picture Elements - do ingls para Elementos da Figura), que compe a imagem no monitor. Um adaptador pode conter vrios modos grficos, mas o que os diferencia so as suas resolues e profundidades de cores. A resoluo ou definio determina quantos pixels contm uma tela naquele modo de exibio, e indicada atravs de 2 nmeros: a quantidade de pixel em uma linha da tela (resoluo horizontal), e a quantidade em uma coluna (resoluo vertical). Desta maneira, o modo grfico com 320 por 200 pixels contm um total de 64.000 pixels na tela. A profundidade de cores na tela define quantos bytes na memria de vdeo cada pixel deve ocupar. Assim sendo, se quisermos que usar apenas 1 byte para cada pixel na tela, ele poder assumir at 256 valores diferentes (lembre-se que 1 byte contm 8 bits, e neste espao possvel gravar valores de 0 at 255). Vamos imaginar agora um exemplo de modo grfico: 640x400 pixels, com 256 cores. Para gerar 640x400 precisamos de um total de 256.000 pixels. Como vamos usar 256 cores, cada pixel dever ocupar 1 byte toda a tela ocupar 256.000 bytes na memria de vdeo.

"Primitivas Grficas" - a Linha, o Retngulo, o Crculo


A maneira bsica de gerar uma imagem atravs do que chamamos de primitivas grficas, ou seja, as estruturas e formas das quais derivam muitas outras formas de grficos. Para efeitos de computao grfica, vamos falar de algoritmos das primitivas grficas, ou seja, algoritmos que so usados para desenhar as primitivas grficas. Um detalhe importante que nada nestes algoritmos diz que eles dependem de estruturas do modo grfico, como pixels ou cores diferentes. De fato, possvel implement-los para formar figuras no modo texto.

BITMAPs
No desenvolvimento de aplicaes grficas, um recurso largamente usado o de Bitmaps (ou Mapas de Pontos). Muitas vezes necessrio usar uma imagem vrias vezes e no se deseja redesenh-la com as formas bsicas cada vez que se queira coloc-la na tela. Um bom exemplo um ponteiro do mouse, que precisa ser movido pela tela constantemente de uma maneira rpida para no tornar o programa ineficiente. Em poucas palavras, um bitmap apenas um conjunto de bytes pr-definidos que pode ser copiado para a memria de vdeo, e exibidos completamente. De fato, os formatos arquivos de imagens mais simples (como o BMP), guardam a sequncia correta destes byte para serem exibidos na tela.

A Biblioteca Grfica da Borland


Nota sobre as bibliotecas grficas da linguagem C Compiladores C so produzidos por diferentes fabricantes, e pelo fato de as bibliotecas grficas no estarem includas no padro ANSI, pequenas mudanas podem ser encontradas de uma verso para outra. Apesar disso, os princpios de funcionamento e uso das mesmas so semelhantes, mesmo que haja diferenas na sintaxe.

Este captulo descreve as funes do Borland C. Para obter informaes sobre a biblioteca da Microsoft, consulte o livro "C - Completo e Total", de Herbert Schildt. Notas: 1. Nenhuma funo grfica est definida em ambiente 2. A numerao, tanto das linhas quanto das colunas do vdeo, comea em zero. Windows.

Descrio das Principais Funes da Biblioteca graphics.h


arc circle closegraph ellipse floodfill getbkcolor getdrivername getgraphmode getmaxcolor getmaxy getpalette gettextsettings gety _graphfreemem imagesize installuserfont lineto outtext putimage registerbgidriver sector setaspectratio setfillpattern setgraphmode setrgbpalette setusercharsize setwritemode bar cleardevice detectgraph fillellipse getarccoords getcolor getfillpattern getimage getmaxmode getmodename getpalettesize getviewsettings graphdefaults _graphgetmem initgraph line moverel outtextxy putpixel registerbgifont setactivepage setbkcolor setfillstyle setlinestyle settextjustify setviewport textheight bar3d clearviewport drawpoly fillpoly getaspectratio getdefaultpalette getfillsettings getlinesettings getmaxx getmoderange getpixel getx grapherrormsg graphresult installuserdriver linerel moveto pieslice rectangle restorecrtmode setallpalette setcolor setgraphbufsize setpalette settextstyle setvisualpage textwidth

void far arc(int x, int y, int stangle, int endangle, int radius)

Desenha um arco de circunferncia, com coordenada de centro definida por x e y. O arco comea no ngulo stangle, e termina em endangle, ambos em graus. O tamanho do raio determinado por radius.

void far bar(int left, int top, int right, int bottom); Desenha uma barra (retngulo com preenchimento interno). A coordenada do canto superior esquerdo determinada por left e top, e a do canto inferior direito por right e bottom. Usa a mscara de preenchimento definida por setfillstile() (caso nenhuma mscara tenha sido definida, como padro usado o preenchimento uniforme, com a cor de desenho atual).

Legenda (da esquerda para direita, de cima para baixo) LINE_FILL LTBKSLASH_FILL WIDE_DOT_FILL LTSLASH_FILL HATCH_FILL CLOSE_DOT_FILL SLASH_FILL XHATCH_FILL EMPTY FILL BKSLASH_FILL INTERLEAVE_FILL SOLID_FILL*

void far bar3d(int left, int top, int right, int bottom, int depth, int topflag); Desenha uma barra com efeito 3D. Depth indica a profundidade, em pixels, da barra. Se definirmos topflag igual a zero, a linha superior da barra no desenhada. Para qualquer valor diferente de zero, a barra desenhada integralmente.

Funo relacionada: bar() void far circle(int x, int y, int radius); Desenha um crculo de raio radius, com centro nas coordenadas x (coluna) e y (linha). void far cleardevice(void); Limpa a tela grfica. void far clearviewport(void); Limpa a janela de visualizao corrente. Funo relacionada: setviewport() void far closegraph(void); A funo closegraph() fecha o sistema grfico. void far detectgraph(int far *graphdriver, int far *graphmode); Determina o driver grfico e o modo a ser usado, checando o hardware disponvel. Os drivers padres so: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. IBM 3270 PC CGA MCGA EGA EGA monocromtico 8514 monocromtico PC VGA

64K EGA IBM Hercules AT&T 6300

void far floodfill(int x, int y, int border);

Preenche uma regio delimitada por uma linha. A coluna do ponto de referncia determinada por x, e a linha por y. int far getbkcolor(void); Retorna a cor de fundo corrente. int far getcolor(void); Retorna a cor de desenho corrente. char *far getdrivername(void); Retorna um ponteiro para o nome do driver grfico corrente. Funo relacionada: detectgraph() int far getgraphmode(void); Retorna o modo grfico corrente. char * far getmodename(int mode_number); Retorna um ponteiro para uma string com nome do modo grfico especificado. O modo 2, por exemplo, corresponde a 640 x 480 VGA. int far getmaxx(void); Retorna a mxima coordenada x (nmero de colunas menos um). int far getmaxy(void); Retorna a mxima coordenada y (nmero de linhas menos um).

int far getx(void) Retorna a posio horizontal (coordenada x, ou coluna) atual da "caneta" na tela

int far gety(void) Retorna a posio vertical (coordenada y, linha) atual da "caneta" na tela unsigned far getpixel(int x, int y); Retorna a cor do pixel especificado por x, coluna e y, linha. char *far grapherrormsg(int errorcode) Recebe como nico parmetro um nmero de cdigo que representa o erro ocorrido (este cdigo o retorno da funo graphresult), e retorna uma string, que pode ser impressa na tela para explicar o que causou o erro. int far graphresult(void) Retorna um inteiro representando uma mensagem que define a situao atual da inicializao do modo grfico. Este cdigo pode ser passado para a funo grapherrormsg para receber uma string com algum possvel erro ocorrido. void far initgraph(int far *graphdriver, int far *graphmode, char far *pathtodriver) Esta funo tenta inicializar o modo grfico de acordo com os parmetros passados. Graphdriver um ponteiro distante para inteiro que contm um nico nmero indicando qual o driver que deve ser inicializado. Existem vrios drivers j definidos na biblioteca graphics.h use a referncia da ajuda online do seu compilador para descobrir quais os drivers suportados pela sua biblioteca. De qualquer maneira, possvel usar uma opo especial chamada DETECT que tentar autodetectar o driver do seu dispositivo grfico. Graphmode um ponteiro distante para um inteiro que avisa qual a resoluo e a profundidade de cores que sero usados no modo grfico. Novamente j esto definidas possveis opes para este parmetro, portanto cheque com a ajuda do seu compilador. Pathtodriver uma string que indica o caminho do arquivo *.BGI (Borland Graphics Interface) que contm o driver que a funo vai precisar para inicializar o modo grfico. void line(int x1, int y1, int x2, int y2) Desenha uma linha que vai das coordenadas da tela x1,y1 at x2,y2. void far outtext(char *far textstring) Com esta funo muito til, possvel imprimir uma string na tela do modo grfico da mesma maneira que na funo puts(). void far outtextxy(int x, int y, char *far textstring)

Como na funo anterior, mas com esta possvel escolher onde exatamente o texto ser impresso, como ao usar a funo gotoxy() seguida de puts() no modo texto. void far putpixel(int x, int y, int color) Coloca um nico pixel na tela, nas coordenadas (x,y) e com a cor color. void far rectangle(int left, int top, int right, int bottom) Esta funo muito til, pois desenha um retngulo com as coordenadas passadas como parmetros, e pode ser usada para, entre outras utilidades, desenhar janelas e molduras para seus programas. void setbkcolor(int color) Designa a cor que ser usada no fundo da tela ou janela definida por setviewport. void setcolor(int color) Escolhe a cor usada para escrever, ou desenhar na tela, com funes como rectangle, outtext, circle, entre outras. void far setgraphmode(int mode) Muda o modo grfico para o parmetro mode. void far setlinestyle(int linestyle, unsigned upattern, int thickness) Determina o estilo da linha, o seu padro, e a largura do trao. Consulte a ajuda online do seu compilador para saber quais so os modos disponveis. void far settextstyle(int font, int direction, int charsize) Muda as caractersticas dos caracteres impressos por funes como outtext e outtextxy, os parmetros determinam a fonte usada (existem algumas pre-definidas pela biblioteca), a direo de escrita HORIZ_DIR da esquerda para a direita, e VERT_DIR de baixo para cima -, e o tamanho da fonte (um valor de 1 at 10). void far setviewport(int left, int top, int right, int bottom, int clip) Abre uma nova "janela" dentro da tela nas coordenadas passadas como parmetros, como na funo window() do modo texto.

Observaes Finais

A biblioteca grfica da Borland sem dvida mais ampla do que isso tudo. Alm disso, a criatividade do programador ainda permite criar dzias de efeitos interessantes combinando-se funes mais simples. Uma boa dica para os mais curiosos que querem ver tudo isto em prtica, este pequeno programa que acompanha os compiladores da Borland: o bgidemo.c. Ele deve ser compilado com a <graphics.h> e os arquivos BGI corretos no diretrio onde o programa executado. Vale a pena conferir o seu cdigo para entender melhor como e onde aplicar as funes desta enorme biblioteca da linguagem C.

Potrebbero piacerti anche