Vous êtes sur la page 1sur 13

Algoritmos Grficos e Exemplos

http://equipe.nce.ufrj.br/adriano/c/apostila/graficos/paginas/alggrafs.htm

Data da ltima atualizao: 04/08/1999 1999 - Daniel Sadoc Menasch; & Fernando Jorge Silveira Filho

Algoritmos Grficos e Exemplos


1. Introduo 2. Conceitos Bsicos dos Modos VGA/SVGA 1. O Modo 13h 2. Inicializando o Modo de Vdeo (inclusive SVGA) 3. Pixel 1. A Operao de Deslocamento 4. Linha 5. Retngulo 6. Polgono 7. Crculo 1. Criando uma Tabela de Constantes 2. A Matemtica de Ponto Fixo 3. Desenhando um Crculo 8. Bitmaps 9. Uma Forma Alternativa de Mostrar Telas no Vdeo... 10. Como Mostrar uma Mensagem no Vdeo 11. Algumas Observaes Finais 12. Para os Alunos do LCI... 13. Referncias na WWW 14. Exerccios

Introduo
Neste captulo descrevemos alguns algoritmos grficos em C. Apresentamos detalhes sobre os modos de vdeo VGA, e introduzimos o padro SVGA. Uma vez apresentada a biblioteca grfica do Borland C, veremos como funcionam internamente algumas das funes previamente descritas. esclarecido o funcionamento dos algoritmos de desenho de um pixel, uma linha, um retngulo, um polgono genrico, e um crculo. Explicamos tambm como mostrar um bitmap. Finalmente, damos alguns conselhos para os iniciantes.

Conceitos Bsicos dos Modos VGA/SVGA

O Modo de Vdeo 13h


Vamos comear abordando o modo de vdeo 13h.

1 de 13

27-02-2013 11:59

Algoritmos Grficos e Exemplos

http://equipe.nce.ufrj.br/adriano/c/apostila/graficos/paginas/alggrafs.htm

Memria de vdeo...

Neste modo de vdeo, a tela dividida em 320 colunas e 200 linhas. Cada pixel ocupa um byte na memria, podendo assumir, portanto, uma dentre 256 cores distintas (28 possibilidades = 256 cores). A memria de vdeo nesse modo ocupa, ento, 320 * 200 bytes. Note que, apesar de a tela ser retangular, a memria de vdeo linear.

Inicializando o Modo de Vdeo (inclusive SVGA)


Para incializar o modo de vdeo, chame a funo initgraph(), indicando o arquivo do driver de vdeo a ser usando e o modo de vdeo desejado. Veja, a seguir, os modos grficos suportados pelos drivers padres disponveis no pacote da Borland C: CGA CGAC0 CGAC1 CGAC2 CGAC3 CGAHI MCGA MCGAC0 MCGAC1 MCGAC2 MCGAC3 MCGAMED MCGAHI EGA EGALO EGAHI EGA64LO 320 x 200 320 x 200 320 x 200 320 x 200 640 x 200 320 x 200 320 x 200 320 x 200 320 x 200 640 x 200 640 x 480 640 x 200 640 x 350 640 x 200 palheta 0 (4 cores) palheta 1 (4 cores) palheta 2 (4 cores) palheta 3 (4 cores) 2 cores palheta 0 (4 cores) palheta 1 (4 cores) palheta 2 (4 cores) palheta 3 (4 cores) 2 cores 2 cores 16 cores 16 cores 16 cores

2 de 13

27-02-2013 11:59

Algoritmos Grficos e Exemplos

http://equipe.nce.ufrj.br/adriano/c/apostila/graficos/paginas/alggrafs.htm

EGA64 EGAMONO HERCMONO ATT400

EGA64HI EGAMONOHI HERCMONOHI ATT400C0 ATT400C1 ATT400C2 ATT400C3 ATT400MED ATT400HI

640 x 350 640 x 350 720 x 348 320 x 200 320 x 200 320 x 200 320 x 200 640 x 200 640 x 400 640 x 200 640 x 350 640 x 480 720 x 350 640 x 480

4 cores 2 cores 2 cores palheta 0 (4 cores) palheta 1 (4 cores) palheta 2 (4 cores) palheta 3 (4 cores) 2 cores 2 cores 16 cores 16 cores 16 cores 2 cores 256 cores

VGA

VGALO VGAMED VGAHI

PC3270 IBM8514 DETECT (autodeteco)

PC3270HI IBM8514LO

Por exemplo, para incializar o modo grfico 640x480, 16 cores, clique aqui e teste o programa exemplo. Ou ento veja o cdigo fonte clicando aqui. Voc deve estar se perguntando: como fazer para colocar o vdeo no modo 13h, mencionado anteriormente? E seu meu monitor for SVGA e eu quiser ativar o modo 1024 x 768? Ou ainda, se meu monitor no for compatvel com o driver IBM8514 e eu quiser ativar o modo 640x480, 256 cores? A resposta : utilizando drivers de vdeo alternativos. Uma outra maneira de se contornar o problema seria ativar esses modos de vdeo usando diretamente interrupes da BIOS, mas isso, apesar de ser simples, fugiria ao escopo deste captulo. Iremos utilizar o driver svga256.bgi, incluido no pacote svgabg55.zip, escrito por Jordan Powell Hargrave, a fim de alcanarmos modos de vdeo no suportados pelos padres da Borland. Para se fazer uso de drivers de vdeo no padres, preciso que se instale esses drivers antes de se fazer uso dos mesmos, usando-se a funo installuserdriver(). Essa funo adiciona um dispositivo BGI tabela de dispositivos BGI disponveis, recebendo como entrada dois parmetros. O primeiro o nome do arquivo BGI a ser instalado. O segundo parmetro opcional, servindo para indicar o nome da funo de autodeteco do modo de vdeo. A funo installuserdriver() retorna um nmero inteiro, que deve ser passado pelo parmetro graphdriver para a funo initgraph(). Veja a seguir dois exemplos de inicializao do modo grfico SVGA, um sem rotina de autodeteco svga1.c e outro fazendo uso da rotina svga2.c.
Clique aqui

para fazer download do arquivo initsvga.zip.

3 de 13

27-02-2013 11:59

Algoritmos Grficos e Exemplos

http://equipe.nce.ufrj.br/adriano/c/apostila/graficos/paginas/alggrafs.htm

Pixel
Um mtodo simples para se plotar um pixel na tela consiste na utilizao da funo putpixel(), que como j vimos, recebe como argumento a posio (x,y) do pixel a ser desenhado, alm da cor a ser usada. Entretanto, existem mtodos alternativos. Um mtodo muito eficiente consiste em escrever direto na memria de vdeo. O segmento de memria de vdeo usado pelo modo 13h comea na posio A000h, e ocupa 64000 bytes. Para plotar um pixel na tela, basta escrever numa dessas posies a cor desejada para o pixel. 0 1 2 3 4 5 6 7 Preto Azul Verde Ciano Vermelho Magenta Marrom Cinza claro 8 9 10 11 12 13 14 15 Cinza Escuro Azul Claro Verde Claro Ciano Claro Vermelho Claro Magenta Claro Amarelo Branco

A memria linear, e divida em segmentos. Cada segmento de memria ocupa 64 Kb. Portanto, para exibir um pixel na posio (100,10), ou seja, na coluna 100, linha 10, basta escrevermos o valor da cor na posio 100 + 10 * 320 do segmento de memria A000h (o endereo inicial da memria de vdeo A000:0000h). Em C, isso pode ser feito da seguinte forma:
typedef unsigned char byte; byte far *VGA = (byte far*)0xA0000000L; unsigned short offset; ... offset = x + 320 * y; VGA[offset] = color;

Se voc estiver trabalhando com o compilador em modo "huge", a palavra-chave far pode ser removida. Para fins de comparao, analise os dois programas a seguir, que plotam pixels aleatoriamente na tela no modo de vdeo 320x200, 256 cores. O primeiro usa a funo putpixel() e o segundo escreve direto na memria de vdeo.
Clique aqui

para fazer download do arquivo pixel.zip, ou veja os cdigos pixel-a.c e pixel-b.c

A Operao de Deslocamento
Note que neste programa evitamos o uso da operao de multiplicao, substituindo-a sempre que possvel pela operao de "shifting". Isso porque a multiplicao uma operao lenta. O smbolo << usado para representar a operao de deslocamento para a esquerda ("shift left"), que muito mais rpida que a multiplicao. Deslocar um byte n bits para a esquerda o mesmo que multiplic-lo por 2n. Observe:

4 de 13

27-02-2013 11:59

Algoritmos Grficos e Exemplos

http://equipe.nce.ufrj.br/adriano/c/apostila/graficos/paginas/alggrafs.htm

O valor inicial 1 teve seus bits delocados para a esquerda em uma casa e passou a valer 2, isto foi multiplicado por 2. Deslocar um nmero 6 bits o mesmo que multiplic-lo por 26. Se queremos multiplicar um nmero por 320, precisamos "quebrar" 320 em potncias de 2. Note que 320 = 26+28. Por isso, no programa anterior, ao invs de calcularmos a posio do pixel a ser plotado na tela usando a expresso y*320 + x , usamos (y<<8) + (y<<6) + x. Para saber mais sobre o modo SVGA leia o artigo "SuperVGA/VESA programmer's notes", escrito por Myles Strous. Se o seu vdeo no suportar algum driver VESA, tente rodar um dos utilitrios VESA a seguir, escritos por Kendall Bennett, antes de executar o seu software. Estes so programas do tipo TSR (terminate and stay resident) VESA Bios Extensions. Isso significa que uma vez que voc rode um desses programas, o seu monitor SVGA se tornar compatvel com o padro VESA. Existem duas verses:
univesa.exe

o executvel de uma verso mais primitiva, sem restries de uso. um arquivo pkzip da verso mais nova, shareware, limitada a 21 dias de uso.

univbe51.zip

Linha
Considere uma funo que imprime um ponto na tela, seja ele o que for (um pixel ou at mesmo um caracter no modo texto); e seja o prottipo desta funo algo parecido com void ponto (int x, int y), onde x a coordenada horizontal e y a vertical. Pode se dizer que relativamente fcil criar uma funo que desenha uma linha horizontal. Um bom exemplo o trecho de cdigo abaixo.
void linha_horizontal (int x1, int x2, int y) { //Desenha uma linha de x1 a x2, na linha y int i; if (x1 < x2) for (i = x1; i <= x2; i++) ponto (i, y); else for (i = x2; i <= x1; i++) ponto (i, y); }

Um cdigo anlogo poderia ser escrito para desenhar uma linha vertical. Entretanto, nos interessa possuir uma funo mais genrica em nossa biblioteca grfica. Uma que seja capaz de desenhar qualquer tipo de linha, seja ela horizontal, vertical ou mesmo inclinada. Antes de pensarmos no cdigo de tal funo precisamos fazer algumas consideraes.

5 de 13

27-02-2013 11:59

Algoritmos Grficos e Exemplos

http://equipe.nce.ufrj.br/adriano/c/apostila/graficos/paginas/alggrafs.htm

Para uma reta, vale a equao: (y1-y2) / (x1-x2) = m, (onde m a inclinao da reta, ou seu coeficiente angular). Que pode evoluir para a forma: y1 = m * (x1-x2) + y2 bom perceber que x2 e y2 so as coordenadas de um ponto extremo da reta e x1 e y1 podem representar qualquer ponto variando ao longo da reta at o outro extremo. Agora j est quase clara a estratgia que iremos usar. Primeiro usaremos os dois pontos extremos da reta para calcular a sua inclinao. Depois escolheremos um dos extremos como referncia e faremos contadores (um horizontal e o outro vertical) variarem ao longo da reta de acordo com a segunda equao. preciso, no entanto, ter cuidado com como estes contadores variam, j que isto depende da posio relativa dos dois pontos extremos. Veja abaixo o cdigo de um algoritmo de retas simples:
#define sgn(x) ((x<0)?-1:((x>0)?1:0)) //macro que retorna o sinal de um nmero void linha(int x1, int y1, int x2, int y2, unsigned char color) { int dx,dy,sdx,sdy,px,py,dxabs,dyabs,i; float inclinacao; dx=x2-x1; /* distncia horizontal da linha */ dy=y2-y1; /* distncia vertical da linha */ dxabs=abs(dx); dyabs=abs(dy); sdx=sgn(dx); sdy=sgn(dy); if (dxabs>=dyabs) /* a linha mais horizontal que vertical */ { inclinacao=(float)dy / (float)dx; for(i=0;i!=dx;i+=sdx) { px=i+x1; py=inclinacao*i+y1; // dy=slope*delta_x plot_pixel(px,py,color); } } else /* a linha mais vertical que horizontal */ { inclinacao=(float)dx / (float)dy; for(i=0;i!=dy;i+=sdy) { px=inclinacao*i+x1; py=i+y1; plot_pixel(px,py,color); } } }

Retngulo
27-02-2013 11:59

6 de 13

Algoritmos Grficos e Exemplos

http://equipe.nce.ufrj.br/adriano/c/apostila/graficos/paginas/alggrafs.htm

Uma vez que temos uma rotina capaz de desenhar linhas retas entre quaisquer duas coordenadas da tela desenhar um retngulo se torna trivial. Repare que para criar um retngulo, s so necessrias as coordenadas x e y de dois pontos que sejam as duas extremidades de uma das diagonais.

O exemplo do cdigo est logo abaixo:


void retangulo (int x1, int y1, int x2, int y2) { //Desenha um retngulo linha linha linha linha } (x1, (x2, (x2, (x1, y1, y1, y2, y2, x2, x2, x1, x1, y1); y2); y2); y1);

Polgono
Na maioria das vezes o uso de retngulo e crculos suficiente para desenhar uma interface ou satisfazer as necessidades do programa, mas algumas vezes necessrio nos aproveitarmos de estruturas ainda mais genricas, como um polgono qualquer dadas as coordenadas de seus vrtices. Inicialmente pode parecer estranho pensar em passar todas as coordenadas como parmetros da maneira como temos feito at agora, mas podemos resolver isto em C de uma maneira muito simples. Basta passar um ponteiro para um vetor que contenha todas as coordenadas dos vrtices, e como segundo parmetro um inteiro que represente quantos vrtices possui o polgono (para que o programa saiba quantos vrtices devem ser lidos do vetor).

Veja o exemplo de cdigo logo abaixo:


void polgono (int *vertices, int n) { //Desenha um polgono de n vrtices

7 de 13

27-02-2013 11:59

Algoritmos Grficos e Exemplos

http://equipe.nce.ufrj.br/adriano/c/apostila/graficos/paginas/alggrafs.htm

struct ponto { int x; int y; } typedef struct ponto Ponto; void polgono (Ponto *vertices, int n) { //Desenha um polgono de n vrtices int i; for (i = 0; i < n - 1; i++) { linha (vertices[i].x, vertices[i].y, vertices[i +1].x, vertices[i +1].y); } linha (vertices[0].x, vertices[0].y, vertices[i].x, vertices[i].y); }

Crculo
Criando uma Tabela de Constantes
A tabela de constantes um recurso muito usado quando se quer otimizar certos algoritmos que utilizam funes matemticas como seno e cosseno. Pelo fato de essas funes serem caras, ou seja, gastarem muito tempo para serem processadas, preciso que se evite cham-las. Algoritmos grficos costumam fazer uso frequente dessas funes. Na maioria das vezes preciso computar at mais de uma vez o valor do seno de um determinado ngulo num mesmo trecho de programa. Assim sendo, tabelas podem ser usadas para se economizar recursos.
#include <math.h> ... float TABELA_COS[360], TABELA_SEN[360]; float pi=3.14159; ... for(i=0;i<360;i++) { TABELA_COS[i]=cos((float)i/180 * pi); TABELA_SEN[i]=sin((float)i/180 * pi); }

Nesse trecho de programa, criamos uma tabela com os valores da funo seno e cosseno, de 0 a 360 graus. Se quisermos o valor do seno de 60, por exemplo, basta verificar o contedo de TABELA_SEN[60].

A Matemtica de Ponto Fixo


A matemtica de ponto flutuante muito poderosa, permitindo que se obtenha um alto grau de preciso, mas ao mesmo tempo muito lenta. Para se contornar a questo, pode-se utilizar a matemtica de ponto fixo, que bem mais rpida e, apesar de no ser to precisa, suficiente para os algoritmos grficos aqui apresentados. Um nmero em representao de ponto fixo guardado no computador da mesma forma que um inteiro. Ao se programar, assume-se que exista um ponto decimal imaginrio num local pr determinado no meio do nmero. Ao nos referirmos a um nmero em ponto fixo, precisamos especificar quantos bytes este possui na sua parte inteira, i, assim como na fracionria, f. Por exemplo, 5:3 representaria um nmero com

8 de 13

27-02-2013 11:59

Algoritmos Grficos e Exemplos

http://equipe.nce.ufrj.br/adriano/c/apostila/graficos/paginas/alggrafs.htm

5 dgitos na parte inteira e 3 na parte fracionria.

Figura: Nmero de ponto fixo 5:3 (i = 5, f = 3)

O nmero 15.75, por exemplo, seria representado por 01111110, j que Para se converter um nmero de ponto flutuante para um nmero de ponto fixo, precisamos deslocar o nmero de ponto flutuante f casas para a esquerda (multiplic-lo por 2 elevado a f). Como a linguagem C no permite que se use o operador << com nmeros de ponto flutuante, precisamos escrever a rotina da seguinte forma:
unsigned char a,b,c; ... parte_inteira=6; parte_fracionaria=2; a=14.75 * (1<<parte_fracionaria); b=32.5 * (1<<parte_fracionaria);

Para somar dois nmero de ponto flutuante basta considerar como se eles fossem inteiros e efetuar a operao. Note que um nmero 5:3 multiplicado por um um outro do mesmo tipo gera um nmero 10:6. Por isso, para multiplicar dois nmeros de ponto fixo, preciso efetuar a multiplicao e depois deslocar o resultado f casas para a direita.
c=a+b; printf("a + b=%f\n",(float)c/(1 << parte_fracionaria)); c=(a*b) >> parte_fracionaria; printf("a * b=%f\n",(float)c/(1 << parte_fracionaria));

Note ainda que para exibir um nmero de ponto fixo no vdeo preciso divid-lo por 2 elevado a f.

Desenhando o crculo
Uma vez introduzidas as idias da tabela de constantes e da matemtica de ponto fixo estamos prontos para apresentar o algoritmo de desenhar um crculo. Um crculo pode ser parametrizado da seguinte forma: (x,y) = ( r.cosq , r.senq ) onde r o raio do crculo, e q varia de 0 a 360 graus.

Frmula final:
27-02-2013 11:59

9 de 13

Algoritmos Grficos e Exemplos

http://equipe.nce.ufrj.br/adriano/c/apostila/graficos/paginas/alggrafs.htm

Como o crculo simtrico, podemos divid-lo em 8 octantes. Desenhando um deles, podemos obter os outros por reflexo. Clique aqui para ver um programa que desenha crculos aleatoriamente na tela, primeiro usando ponto flutuante e funes trigonomtricas, e depois usando ponto fixo e tabela de constantes trigonomtricas. Ou clique aqui para ver o cdigo fonte. Qual mais rpido?

Bitmaps
Existem diversos formatos de bitmaps no mercado atualmente, cada um com especificaes e vantagens diferentes. Alguns do mais nfase compresso dos dados, enquanto outros se preocupam com a fidelidade s vrias de imagens fotogrficas, e outros apenas na facilidade de leitura e gravao. Cada uma destas otimizaes tem a sua finalidade especfica, transferncia em redes, preservao de imagens detalhadas, ou simplesmente a rapidez de leitura e gravao. Vamos nos concentrar especificamente no formato BMP utilizado pelo Windows, que no usa nenhum tipo de compresso e possui vrias possibilidades quanto a profundidade de cores (vamos discutir apenas os de 8 bits por pixel ou seja os de 256 cores simultaneamente na tela). Cada arquivo BMP de 8 bits possui 3 partes principais Um cabealho de 54 bytes com informaes importantes sobre o arquivo Uma paleta de 1024 bytes que guarda as cores usadas no arquivo em seus cdigo no formato RGB (Red Green Blue Vermelho Verde Azul), onde cada ndice pode variar de 0 (ausncia da cor), at 255 (presena mxima da cor). Sendo assim, podemos ter 256 valores para cada uma das trs cores bsicas, o que nos d um total de 256 x 256 x 256 = 16777216 combinaes diferentes das quais voc pode escolher at 256 para a sua paleta. Os dados em si, ou seja a informao de cores em cada pixel. O cabealho possui informaes importantes para a reconstituio do bitmap na tela aps a sua leitura. A estrutura deste cabealho est abaixo. Tamanho (em Nome do Campo Descrio bytes) 2 4 4 4 4 4 4 2 Type Size Reserved Offset headerSize Width Height Planes Assinatura do arquivo. Constante igual a "BM" para detectar se o arquivo um BMP Tamanho em blocos de 32 bits do arquivo inteiro. Reservado. Constante igual a 0. Endereo para o bloco de dados a partir do incio do arquivo. Tamanho em bytes do resto do cabealho. Igual a 40. Comprimento do bitmap em pixels. Altura do bitmap em pixels. Nmero de planos. Igual a 0.

10 de 13

27-02-2013 11:59

Algoritmos Grficos e Exemplos

http://equipe.nce.ufrj.br/adriano/c/apostila/graficos/paginas/alggrafs.htm

2 4 4 4 4 4 4

BitsPerPixel Compression SizeImage

Nmero de bits por pixels da figura. Tipo de compresso. Normalmente igual a 0. Tamanho em bytes da imagem.

XPixelsPerMeter Valor horizontal de pixels por metro. YPixelsPerMeter Valor vertical de pixels por metro. ColorsUsed Nmero de cores usadas no arquivo.

ColorsImportant Nmero de cores consideradas "importantes".

Repare que todas estas informaes podem ser facilmente guardadas em uma estrutura criada com o C. Basta levar em considerao que um inteiro sem sinal pode ser usado para campos de 2 bytes, e um inteiro longo e sem sinal pode guardar as variveis de 4 bytes. Um pequeno, mas no desprezvel detalhe que o primeiro campo, Type, precisa conter duas letras, logo seria mais facilmente representado como um vetor de duas posies para char. As informaes do bitmap no arquivo BMP devem ser copiadas para uma rea apontada na memria (no caso de 1 byte por pixel, um ponteiro para char sem sinal conveniente). Em seguida basta usar a informao contida nesta rea da memria para plotar os pixels do bitmap na tela. Um detalhe importante que a imagem guardada em um bitmap como se ele tivesse sempre um comprimento mltiplo de 4, isto , mesmo que uma imagem tenha 25 pixels por linha, no bloco de dados, este valor ser "arredondado" para cima at um mltiplo de 4 (no caso, 28). Os pixels extras sero preenchidos com um valor sem importncia, mas no cabealho, o comprimento do arquivo continua com o seu valor normal, 25. A estratgia aconselhada para no deixar que isto seja um problema , ao carregar a imagem para a memria, copiar apenas os bytes significativos, tornando desnecessria qualquer preocupao posterior. Uma vez na memria, para exibir um bitmap, basta plotar os pixels certos segundo as informaes armazenadas. Supondo que as dimenses da imagens j estivessem nas variveis Comprimento e Altura, a imagem estivesse apontada por um ponteiro de char chamado bitmap, e a funo de plotagem de pixels fosse void pixel (int x, int y, int cor), o exemplo de cdigo abaixo seria vlido para fazer isso.
for (y = 0; y < Altura; y++) //Lao das linhas for (x = 0; x < Comprimento; x++) //Lao das colunas pixel (x, y, bitmap[y * comprimento + x]);

O programa em bmptxt.zip abre um arquivo BMP em disco, um programa que leia um arquivo BMP em disco, armazene suas informaes principais na memria e depois mostra dados de seus pixels na tela, ainda em modo texto. O arquivo bitmap.zip contm um programa para exib-lo no modo grfico. Use esta imagem de teste - 20x20 pixels - 256 cores. imagem.bmp Os cdigos para estes arquivos esto disponveis em bmptxt.c e bitmap.c.

Uma Forma Alternativa de Mostrar Telas no Vdeo...


Uma vez criada uma tela de abertura para um programa, uma maneira alternativa de se mostrar esta imagem no vdeo transform-la em um arquivo executvel, e ento rod-lo. Entre os programas que transformam imagens em arquivos executveis podemos citar o gifexe45.zip. Uma vez criado o arquivo executvel, basta utilizar a funo spawnl(), definida na biblioteca process.h. Esta funo recebe como argumentos o modo como o arquivo ser executado e o nome do arquivo a rodar. A ltima entrada deve ser

11 de 13

27-02-2013 11:59

Algoritmos Grficos e Exemplos

http://equipe.nce.ufrj.br/adriano/c/apostila/graficos/paginas/alggrafs.htm

sempre NULL. Se voc criou, por exemplo, o arquivo abertura.exe, usando o gifexe45, e deseja exibi-lo no vdeo, chame a funo spawnl() do seguinte modo:
#include <process.h> ... spawnl(P_WAIT, "abertura.exe" , NULL);

Ateno! Pode acontecer que ao trabalhar dentro do ambiente do Borland C no haja memria suficiente para carregar a tela no vdeo. Se isso acontecer, tente criar um arquivo executvel (clique em Compile/Build ALL) e rode o programa a partir do prompt.

Como Mostrar uma Mensagem no Vdeo


Para imprimir strings no modo de vdeo existe o comando outtextxy(). Entretanto, como fazer para imprimir valores intercalados com strings? Como no modo grfico no existe nenhuma funo similar printf(), preciso dividir o processo em duas partes. Primeiro monta-se a string, usando o comando sprintf(), definido na biblioteca <stdio.h> e depois chama-se a funo outtextxy(). Veja o exemplo a seguir:
char mensagem[80]; int x=10, y=20; ... sprintf(mensagem, "10 vezes 20 igual a %d", x*y); outtextxy(0,0,mensagem);

Algumas Observaes Finais


Se, ao tentar inicializar o modo grfico no Borland C, o compilador reclamar que no consegue incializar ou encontrar um determinado arquivo da biblioteca grfica, proceda do seguinte modo. Primeiro clique em Options/Linker e ative a opo "Graphics Library". Alm disso, verifique se o arquivo BGI utilizado encontra-se no diretrio atual. Coloque o compilador em modo large ou huge, clicando em Options/Compiler/Code Generation. Caso receba uma mensagem do tipo "C0L.OBJ not found", descompacte o arquivo lib.zip , no diretrio onde voc estiver trabalhando. Na janela Options/Directories, digite na linha LIB, sem apagar o que j estiver contido l, um ponto e vrgula seguido pelo nome do diretrio onde voc colocou os arquivos recm descompactados. Alm disso, se voc estiver usando o Windows, procure sempre reiniciar o computador em modo MS-DOS antes de comear o trabalho. Evite abrir janelas para trabalhar em modo grfico.

Para os Alunos do LCI...


importante destacar que nem todos os monitores/placas de vdeo do LCI so compatveis entre si. Portanto, se voc no conseguir inicializar o modo grfico SVGA em algum dos computadores, no desanime. Tente faz-lo em outro micro. Antes porm, tente rodar o arquivo Universal VBE, citado

12 de 13

27-02-2013 11:59

Algoritmos Grficos e Exemplos

http://equipe.nce.ufrj.br/adriano/c/apostila/graficos/paginas/alggrafs.htm

anteriormente. E no se esquea! Antes de comear o trabalho, reinicie o computador em modo MS-Dos.

Referncias na WWW
Algumas sees, como por exemplo a que trata sobre como desenhar o crculo, foram redigidas como traduo livre de um dos melhores sites sobre algoritmos grficos em modo VGA, escrito por David Brackeen: http://www.brackeen.com/home/vga/

Exerccios
1. Escreva um programa que simule um sistema planetrio com 3 planetas da seguinte forma: - Os planetas devem estar em rbita circular. - O planeta mais afastado do sol completa dez voltas a cada minuto, o planeta do meio completa quinze voltas a cada minuto e o planeta mais prximo do sol completa 25 voltas a cada minuto. DICA: Utilize coordenadas polares para fazer os clculos e converta-as para coordenadas cartesianas antes de exibir. Soluo: planetas.c

ndice

13 de 13

27-02-2013 11:59

Vous aimerez peut-être aussi