1 / 97

Prof.: José Eustáquio Rangel de Queiroz rangel@dsc.ufcg.br rangeldequeiroz@gmail

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

kermit
Download Presentation

Prof.: José Eustáquio Rangel de Queiroz rangel@dsc.ufcg.br rangeldequeiroz@gmail

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. 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

  3. 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

  4. 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;

  5. 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”);

  6. 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>

  7. 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

  8. 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

  9. 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

  10. 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

  11. 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

  12. 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

  13. 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)

  14. 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)

  15. 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

  16. 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, "");

  17. 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

  18. 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

  19. 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)

  20. Dimensões da Tela Gráfica (0, 0) (639, 0) (0, 479) (639, 479)

  21. 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)

  22. Opções de Cores • Número de cores  Modo gráfico selecionado usando o Turbo C++ • Paleta default16 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

  23. Números e Nomes de Cores

  24. 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;

  25. 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());

  26. 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);

  27. 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); }

  28. Entidades Geométricas • Pontos e Linhas • Retângulos • Arcos • Círculos e Elipses • Sólidos geométricos

  29. 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>

  30. 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() */

  31. 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)); }

  32. 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 */

  33. 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,"");

  34. 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));

  35. 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;

  36. 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;

  37. 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;

  38. 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;

  39. 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);

  40. 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); } }

  41. 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); } }

  42. 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)); }

  43. 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; }

  44. 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);

  45. 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

  46. 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);

  47. 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)

  48. 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

  49. 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

  50. 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

More Related