970 likes | 1.05k Views
Gráficos em C usando. o Turbo C++ 3.0. Técnicas de Programação. Prof.: José Eustáquio Rangel de Queiroz rangel@dsc.ufcg.edu.br rangeldequeiroz@gmail.com. Carga Horária: 60 horas. Tela de Texto. 25 linhas e 80 colunas de caracteres textuais 80 colunas x 25 linhas = 2.000 posições
E N D
Gráficos em C usando o Turbo C++ 3.0 Técnicas de Programação Prof.:José Eustáquio Rangel de Queiroz rangel@dsc.ufcg.edu.br rangeldequeiroz@gmail.com Carga Horária:60 horas
Tela de Texto • 25 linhas e 80 colunas de caracteres textuais • 80 colunas x 25 linhas = 2.000 posições • Tela consistindo de pixels (picture elements) para a representação de caracteres textuais e símbolos
Utilização do Modo Gráfico • Passos para uso noTurbo C++ 3.0 DOS • Indicação para o compilador dos comandos gráficos a serem usados • Identificação do tipo de placa gráfica em uso no computador • Inicialização do modo gráfico (Tela Gráfica) • Indicação para o sistema do local no qual estão os drivers e fontes gráficas (BGI) • Encerramento do modo gráfico após a finalização do traçado gráfico
Utilização do Modo Gráfico • Indicação para o compilador dos comandos gráficos a serem usados • Inclusão da diretiva de compilação #include <graphics.h> • Identificação do tipo de placa gráfica em uso no computador • Declaração de duas variáveis do tipo integer int gdriver = DETECT, gmodo;
Utilização do Modo Gráfico • Inicialização do modo gráfico (Tela Gráfica) e indicação para o sistema do local no qual se encontram os drivers e fontes gráficas (BGI) • Invocação da função initgraph() pela função main( ) initgraph(&gdriver, &gmodo, “C:\\tc\\bgi”);
Utilização do Modo Gráfico • Encerramento do modo gráfico após a finalização do traçado gráfico • Uso recomendado da função getch() após a(s) chamada(s) à(s) função(ões) gráfica(s) de interesse • Manutenção do traçado na tela (Pressionar qualquer tecla para continuar) • Necessidade de inclusão da diretiva #include <conio.h>
Utilização do Modo Gráfico • Encerramento do modo gráfico após a finalização do traçado gráfico • Invocação da função closegraph() para encerramento do modo gráfico
Utilização do Modo Gráfico • Possíveis dificuldades • Não funcionamento de funções gráficas por conta da dependência de hardware do ambiente gráfico (Limitações na portabilidade do software escrito em C para processamento gráfico) • Insucesso no processo de “atrelagem” da biblioteca gráfica à codificação de programas
Utilização do Modo Gráfico • Não funcionamento de funções gráficas por conta da dependência de hardware • Análise cuidadosa das funções gráficas usadas em programas escritos por outros programadores e passíveis de uso para processamento gráfico de interesse • Inspeção tanto das configurações do hardware gráfico a ser emulado pelos programas quanto da compatibilidade do código (léxica, sintática, estrutural) com o Turbo C++ 3.0
Utilização do Modo Gráfico • Não funcionamento de funções gráficas por conta da dependência de hardware • Codificação com instruções, sempre que possível, de identificação automática de equipamentos instalados e modos de funcionamento do hardware emulado pela aplicação
Utilização do Modo Gráfico • Insucesso no processo de “atrelagem” da biblioteca gráfica à codificação de programas • Verificação passo-a-passo da execução correta de todos os procedimentos anteriormente explicitados • Adoção de outra estratégia de inicialização do modo gráfico
Utilização do Modo Gráfico • Estratégia sugerida pela Borland • Verificação da localização da biblioteca gráfica • Se a biblioteca gráfica se encontrar no diretório-padrão • Introdução na linha de comando da instrução tcc nome_do_programa.ext graphics.lib
Utilização do Modo Gráfico • Estratégia sugerida pela Borland • Distribuição do código criado com o Turbo C++ 3.0sem necessidade de inclusão do arquivo extras à aplicação (I) • Necessidade de conversão do arquivo EGAVGA.BGI em um arquivo-objeto (.OBJ) C:\TC\BGI>BGIOBJ EGAVGA A criação correta implica a indicação do nome público do driver (EGAVGA_driver)
Utilização do Modo Gráfico • Estratégia sugerida pela Borland • Distribuição do código criado com o Turbo C++ 3.0sem necessidade de inclusão do arquivo extras à aplicação (II) • Necessidade de conversão do(s) arquivo(s) de fonte(s) de texto (e.g. GOTH.CHR) em arquivo(s)-objeto(s) (.OBJ) C:\TC\BGI>BGIOBJ GOTH A criação correta implica a indicação do nome público da fonte (GOTHIC_font)
Utilização do Modo Gráfico • Estratégia sugerida pela Borland • Distribuição do código criado com o Turbo C++ 3.0sem necessidade de inclusão do arquivo extras à aplicação (III) • Necessidade de criação de um projeto • Inclusão da aplicação, do arquivo-objeto do driver (e.g. EGAVGA.OBJ) e do(s) arquivo(s)-objeto(s) da(s) fonte(s) de texto (e.g. GOTH.OBJ) necessário(s) ao contexto da aplicação
Utilização do Modo Gráfico • Estratégia sugerida pela Borland • Distribuição do código criado com o Turbo C++ 3.0sem necessidade de inclusão do arquivo extras à aplicação (IV) • Registro dos dispositivos e fontes ANTES da inicialização do modo gráfico • Inclusão das linhas de código (à aplicação) registerbgidriver(nomepublico_driver); registerbgifont(nomepublico_fonte); detectgraph(&gdriver, &gmodo); (opcional) initgraph(& gdriver, &gmodo, "");
Utilização do Modo Gráfico • Estratégia sugerida pela Borland • Distribuição do código criado com o Turbo C++ 3.0sem necessidade de inclusão do arquivo extras à aplicação (V) • Compilação do projeto • Execução da aplicação • Verificação do funcionamento satisfatório da aplicação • Distribuição da aplicação SEM inclusão de arquivos adicionais
Fundamentos de Gráficos • Tela Gráfica • Opções de Cores • Modo Gráfico • Traçado de Linhas • Estilos de Linhas • Apagamento da Tela • Traçado de Pontos
Tela Gráfica • Existência de uma placa gráfica VGA ou superior no computador • Tela Gráfica com (640 x 480) pixels (pelo menos) • 640 X 480 = 307.200 pixels • Posição do canto superior esquerdo (0, 0) • Posição do canto inferior direito (639, 479)
Dimensões da Tela Gráfica (0, 0) (639, 0) (0, 479) (639, 479)
Opções de Cor de Fundo • Possibilidade de seleção da cor do fundo da tela (background color) • Função para a seleção da cor do fundo da tela setbkcolor(numero) numero constante numérica entre 0 e 15 ou constante simbólica representante da cor (e.g. BLACK)
Opções de Cores • Número de cores Modo gráfico selecionado usando o Turbo C++ • Paleta default16 opções de cores • Função para a seleção de uma cor para o traçado gráfico (foreground color) setcolor(number) numero Similar ao argumento da função setbkcolor
Nomes de Cores – paleta16.c 1 #include <graphics.h> #include <stdio.h> #include <stdlib.h> #include <process.h> #include <conio.h> main(){ char s1[10], s2[10]; char mcol[5]; char dcolor[10], bkcolor[10]; char *nomedriver; char logcor[16][15] = {"Preto","Azul","Verde","Ciano", "Vermelho","Magenta","Marrom","Cinza-claro", "Cinza-escuro","Azul-claro","Verde-claro","Ciano-claro", "Vermelho-claro","Magenta-claro","Amarelo","Branco"}; int gdriver=DETECT, gmode, errorcode; int xasp, yasp, maxx, maxy, ptam, i, dy, dx; double razao;
Nomes de Cores – paleta16.c 2 errorcode=registerbgidriver(EGAVGA_driver); initgraph(&gdriver, &gmode, ""); errorcode=graphresult(); if(errorcode != grOk){ printf("Erro de funcao grafica: %s\n", grapherrormsg(errorcode)); printf("Pressione uma tecla para parar!"); getch(); exit(1); } setbkcolor(BLACK); setcolor(WHITE); maxx=getmaxx(); maxy=getmaxy(); dy=maxy/24; dx=maxx/2; /* impressao do nome do driver grafico */ outtextxy(0,dy,"Driver Grafico:"); outtextxy(dx,dy,getdrivername());
Nomes de Cores – paleta16.c 3 /* Determinacao da proporcao */ getaspectratio(&xasp, &yasp); itoa(xasp, s1, 10); itoa(yasp, s2, 10); outtextxy(0,dy*2,"Proporcao (x:y):"); outtextxy(dx,dy*2,s1); outtextxy(dx+40,dy*2, ":” ); outtextxy(dx+50,dy*2,s2); /* Aquisicao do modo grafico */ outtextxy(0,dy*3,"O modo de video eh:"); outtextxy(dx,dy*3,getmodename(gmode)); /* Determinacao da cor de fundo corrente */ outtextxy(0, dy*4, "A cor de fundo corrente eh:"); outtextxy(dx, dy*4, logcor[getbkcolor()]); /* Determinacao da cor de desenho corrente */ outtextxy(0, dy*5, "A cor de desenho corrente eh:"); outtextxy(dx, dy*5, logcor[getcolor()]); ptam=getpalettesize(); itoa(ptam, mcol, 10);
Nomes de Cores – paleta16.c 4 outtextxy(0, dy*6, "Numero maximo de cores de desenho:"); outtextxy(dx, dy*6, mcol); outtextxy(0, dy*7, "Paleta de 16 cores VGA/EGA:"); for(i=0; i<16; i++){ setfillstyle(SOLID_FILL, i); bar(dx, dy*(i+7), dx+10, dy*(i+7)+10); moveto(dx+15, dy*(i+7)); outtext(logcor[i]); } getch(); closegraph(); return(0); }
Entidades Geométricas • Pontos e Linhas • Retângulos • Arcos • Círculos e Elipses • Sólidos geométricos
Pontos e Linhas – tracgraf.c 1 /* Demonstracao do uso da linguagem C para o tracado de graficos. Exemplo de tracado da curva da funcao cossenoidal modulada em amplitude (AM) y=(a*cos(b*3.1415*x/360)*c*sin(b*3.1415*x*50/360)) com possibilidade de alteracao dos valores de a, b e c e efeitos de deslocamento para a esquerda/direita e para cima/baixo (pan) e reducao/ampliacao (zoom in/out) da curva durante a visualizacao. */ #include <graphics.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <conio.h> #include <math.h>
Pontos e Linhas – tracgraf.c 2 /* Possibilidade de alteracao de valores da resolucao de tela */ #define MAXX 640 #define MAXY 480 /* Prototipos e declaracoes de funcoes de conversao de coordenadas */ float tela_y(float, float, float); float tela_y(float, float, float); /* Possibilidade de definicao da funcao a ser tracada */ float matfunc(float); /* Possibilidade de uso de todos os parametros a seguir como coeficientes para qualquer funcao cujo tracado se deseja. Quaisquer atribuicoes em main() e definicao da funcao em matfunc() */
Pontos e Linhas – tracgraf.c 3 float a,b,c,d,e,f,g,h,i,j; float tela_x(float xb, float x, float xe) { return ((x-xb)/(xe-xb)*MAXX); } float tela_y(float yb, float y, float ye) { return (MAXY-(y-yb)/(ye-yb)*MAXY); } float matfunc(float x) { /* Definicao da funcao cujo tracado se deseja */ return (a*c*cos(b*3.1415*x/360)*sin(b*3.1415*x*50/360)); }
Pontos e Linhas – tracgraf.c 4 /* Armazenamento das instrucoes de visualizacao do grafico */ char *menu[] = {"a - AUMENTO da amplitude", "r - REDUCAO da amplitude", "e - deslocamento do eixo p/ a ESQUERDA", "d - deslocamento do eixo p/ a DIREITA", "c - deslocamento do eixo p/ CIMA", "b - deslocamento do eixo p/ BAIXO", "- - REDUCAO no eixo das ordenadas", "+ - AMPLIACAO no eixo das ordenadas", "< - REDUCAO no eixo das abcissas", "> - AMPLIACAO no eixo das abcissas", "z - ZOOM default (inicial)"}; void main(void) { /* Possibilidade de alteracao dos valores de 'drv' e 'modo' em funcao da alteracao de MAXX e MAXY */
Pontos e Linhas – tracgraf.c 5 int m,drv=VGA, modo=VGAHI; float xb,xe,yb,ye,x,y,potx,poty; char tecla; char estilostr[50], estilostr1[50]; /* Configuracao de parametros de contexto */ a = 1; b = 1; c = 2; xb = -360; xe = 360; yb = -10; ye = 10; /* Inicializacao do modo grafico */ initgraph(&drv,&modo,"");
Pontos e Linhas – tracgraf.c 6 /* Tracado dos eixos X e Y */ setcolor(1); line(0,tela_y(yb,0,ye),MAXX,tela_y(yb,0,ye)); line(tela_x(xb,0,xe),0,tela_x(xb,0,xe),MAXY); setcolor(15); for(m=0;m<=10;m++) { /* Conversao das opcoes de menu em strings */ strcpy(estilostr, menu[m]); /* Apresentacao do menu */ outtextxy(330, 20 + 12*m, estilostr); } setcolor(14); moveto(0,tela_y(yb,matfunc(xb),ye));
Pontos e Linhas – tracgraf.c 7 for(x=xb;x<=xe;x+=(xe-xb)/MAXX) { y = matfunc(x); lineto(tela_x(xb,x,xe),tela_y(yb,y,ye)); } while((tecla=getch())!=27) /* Repeticao do laco ate ativacao de ESC */ { potx = xb; poty = yb; switch(tecla) { case 'a': /* Aumento da amplitude */ ++a; break;
Pontos e Linhas – tracgraf.c 8 case 'r': /* Reducao da amplitude */ --a; break; case 'd': /* Deslocamento do eixo para a direita */ xb -= (xe-xb)/4.0; xe -= (xe-potx)/4.0; break; case 'e': /* Deslocamento do eixo para a esquerda */ xb += (xe-xb)/4.0; xe += (xe-potx)/4.0; break; case 'b': /* Deslocamento do eixo para baixo */ yb += (ye-yb)/4.0; ye += (ye-poty)/4.0; break; case 'c': /* Deslocamento do eixo para cima */ yb -= (ye-yb)/4.0; ye -= (ye-poty)/4.0; break;
Pontos e Linhas – tracgraf.c 9 case '+': /* Ampliacao do eixo Y */ yb -= (yb-ye)/4.0; ye += (poty-ye)/4.0; break; case '-': /* Reducao do eixo Y */ yb += (yb-ye)/4.0; ye -= (poty-ye)/4.0; break; case '[': /* Reducao do eixo X */ xb += (xb-xe)/4.0; xe -= (potx-xe)/4.0; break; case ']': /* Ampliacao do eixo X */ xb -= (xb-xe)/4.0; xe += (potx-xe)/4.0; break;
Pontos e Linhas – tracgraf.c 9 case '+': /* Ampliacao do eixo Y */ yb -= (yb-ye)/4.0; ye += (poty-ye)/4.0; break; case '-': /* Reducao do eixo Y */ yb += (yb-ye)/4.0; ye -= (poty-ye)/4.0; break; case '[': /* Reducao do eixo X */ xb += (xb-xe)/4.0; xe -= (potx-xe)/4.0; break; case ']': /* Ampliacao do eixo X */ xb -= (xb-xe)/4.0; xe += (potx-xe)/4.0; break;
Pontos e Linhas – tracgraf.c 10 case ‘z': /* Visualizacao inicial */ xb = -360; xe = 360; yb = 10; ye = -10; break; default: continue; } cleardevice(); setcolor(1); /* Tracado dos eixos */ line(0,tela_y(yb,0,ye),MAXX,tela_y(yb,0,ye)); line(tela_x(xb,0,xe),0,tela_x(xb,0,xe),MAXY);
Pontos e Linhas – tracgraf.c 11 /* Teste de teclas */ if((tecla=='e')||(tecla=='[')||(tecla==']')|| (tecla=='/')||(tecla=='r')) { setcolor(15); for(m=0;m<=8;m++) { /* Conversao das opcoes de menu em strings */ strcpy(estilostr, menu[m]); /* Apresentacao do menu */ outtextxy(330, 20 + 12*m, estilostr); } }
Pontos e Linhas – tracgraf.c 12 else if(tecla=='d') { setcolor(15); for(m=0;m<=10;m++) { strcpy(estilostr, menu[m]); outtextxy(30, 20 + 12*m, estilostr); } } else if(tecla=='b') { setcolor(15); for(m=0;m<=10;m++) { strcpy(estilostr, menu[m]); outtextxy(30, 20 + 12*m, estilostr); } }
Pontos e Linhas – tracgraf.c 13 else if(tecla=='c') { setcolor(15); for(m=0;m<=10;m++) { strcpy(estilostr, menu[m]); outtextxy(330, 290 + 12*m, estilostr); } } setcolor(14); /* Retracado dos eixos */ moveto(0,tela_y(yb,matfunc(xb),ye)); for(x=xb;x<=xe;x+=(xe-xb)/MAXX) { y = matfunc(x); lineto(tela_x(xb,x,xe),tela_y(yb,y,ye)); }
Pontos e Linhas – tracgraf.c 14 setcolor(14); moveto(0,tela_y(yb,matfunc(xb),ye)); for(x=xb;x<=xe;x+=(xe-xb)/MAXX) { y = matfunc(x); lineto(tela_x(xb,x,xe),tela_y(yb,y,ye)); } } closegraph(); /*Encerramento do modo grafico */ return; }
Traçado de Linhas I • Apontador Corrente • Entidade de apontamento invisível Rastreio da posição corrente do pixel • Equivalente ao cursor visível no modo texto • Função para o deslocamento do apontador para uma locação no gráfico (sem traçado algum) void farmoveto (int x, int y);
Traçado de Linhas II • Função para o traçado de linhas da posição corrente do apontador até outro ponto no gráfico void farlineto(int x, int y); • Possibilidade de substituição de moveto e lineto pela função void far line(int x1, int y1, int x2, int y2); • (x1, y1) início da linha • (x2, y2) término da linha
Rectângulos I • Série de funções para traçado de retângulos (de diferentes modos) void far lineto(int x, int y); void far moveto(int x, int y); void far moverel(int dx, int dy); void far linerel(int dx, int dy);
Rectângulos II • Função para traçado direto de um retângulo na cor e estilo de linha default void far rectangle(int x1, int y1, int x2, int y2); • (x1, y1) canto superior esquerdo • (x2, y2) canto inferior direito (x1, y1) (x2, y2)
Círculos • Função para traçado de um círculo na cor e estilo de linha default void far circle(int x, int y, int r); • (x, y) centro do círculo • r raio do círculo (x, y) r
Arcos • Função para traçado de um arco na cor e estilo de linha default void far arc(int x, int y, int ai, int af, int r); • (x, y) centro do arco • ai ângulo inicial • af ângulo final • xr raio do arco 90 af ai 180 0 270
Elipses • Função para traçado de uma elipse na cor e estilo de linha default void far ellipse(int x, int y, int ai, int af, int xr, int yr); • (x, y) centro da elipse • ai ângulo inicial • af ângulo final • xr raio da elipse na direção horizontal • yr raio da elipse na direção vertical