{joseana, rangel}@dsc.ufcg.edu.br DSC/CCT/UFCG Prof.: José Eustáquio Rangel de Queiroz [email protected] [email protected] Carga Horária: 60 horas {joseana, rangel}@dsc.ufcg.edu.br DSC/CCT/UFCG 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 2 Utilização do Modo Gráfico DSC/CCT/UFCG Passos para uso no Turbo 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) {joseana, rangel}@dsc.ufcg.edu.br 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 3 DSC/CCT/UFCG Utilização do Modo Gráfico Indicação para o compilador comandos gráficos a serem usados dos Inclusão da diretiva de compilação #include <graphics.h> {joseana, rangel}@dsc.ufcg.edu.br 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; 4 DSC/CCT/UFCG 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 {joseana, rangel}@dsc.ufcg.edu.br da função função main( ) initgraph() pela initgraph(&gdriver, &gmodo, “C:\\tc\\bgi”); 5 DSC/CCT/UFCG 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() {joseana, rangel}@dsc.ufcg.edu.br após a(s) chamada(s) à(s) função(ões) gráfica(s) de interesse Manutenção (Pressionar continuar) do traçado na qualquer tecla Necessidade de inclusão da diretiva tela para #include <conio.h> 6 DSC/CCT/UFCG 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 {joseana, rangel}@dsc.ufcg.edu.br encerramento do modo gráfico 7 DSC/CCT/UFCG 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) {joseana, rangel}@dsc.ufcg.edu.br Insucesso no processo de “atrelagem” da biblioteca gráfica programas à codificação de 8 DSC/CCT/UFCG 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 {joseana, rangel}@dsc.ufcg.edu.br 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 9 DSC/CCT/UFCG 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 {joseana, rangel}@dsc.ufcg.edu.br possível, de identificação automática de equipamentos instalados e modos de funcionamento do hardware emulado pela aplicação 10 DSC/CCT/UFCG 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 {joseana, rangel}@dsc.ufcg.edu.br Adoção de outra estratégia inicialização do modo gráfico de 11 DSC/CCT/UFCG 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 {joseana, rangel}@dsc.ufcg.edu.br Introdução instrução na linha de comando da tcc nome_do_programa.ext graphics.lib 12 DSC/CCT/UFCG Utilização do Modo Gráfico Estratégia sugerida pela Borland Distribuição do código criado com o Turbo C++ 3.0 sem necessidade de inclusão do arquivo extras à aplicação (I) Necessidade de conversão do arquivo EGAVGA.BGI em um arquivo-objeto (.OBJ) {joseana, rangel}@dsc.ufcg.edu.br C:\TC\BGI>BGIOBJ EGAVGA A criação correta implica a indicação do nome público do driver (EGAVGA_driver) 13 DSC/CCT/UFCG Utilização do Modo Gráfico Estratégia sugerida pela Borland Distribuição do código criado com o Turbo C++ 3.0 sem necessidade de inclusão do arquivo extras à aplicação (II) {joseana, rangel}@dsc.ufcg.edu.br 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) 14 DSC/CCT/UFCG Utilização do Modo Gráfico Estratégia sugerida pela Borland Distribuição do código criado com o Turbo C++ 3.0 sem necessidade de inclusão do arquivo extras à aplicação (III) Necessidade de criação de um projeto {joseana, rangel}@dsc.ufcg.edu.br 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 15 DSC/CCT/UFCG Utilização do Modo Gráfico Estratégia sugerida pela Borland Distribuição do código criado com o Turbo C++ 3.0 sem necessidade de inclusão do arquivo extras à aplicação (IV) Registro dos dispositivos e fontes ANTES da inicialização do modo gráfico {joseana, rangel}@dsc.ufcg.edu.br Inclusão das linhas de código (à aplicação) registerbgidriver(nomepublico_driver); registerbgifont(nomepublico_fonte); detectgraph(&gdriver, &gmodo); (opcional) initgraph(& gdriver, &gmodo, ""); 16 DSC/CCT/UFCG Utilização do Modo Gráfico Estratégia sugerida pela Borland Distribuição do código criado com o Turbo C++ 3.0 sem necessidade de inclusão do {joseana, rangel}@dsc.ufcg.edu.br 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 17 {joseana, rangel}@dsc.ufcg.edu.br DSC/CCT/UFCG 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 18 Tela Gráfica DSC/CCT/UFCG Existência de uma placa gráfica VGA ou superior no computador Tela Gráfica com (640 x 480) pixels (pelo menos) {joseana, rangel}@dsc.ufcg.edu.br 640 X 480 = 307.200 pixels Posição do esquerdo (0, 0) Posição do canto direito (639, 479) canto superior inferior 19 DSC/CCT/UFCG {joseana, rangel}@dsc.ufcg.edu.br (0, 0) (0, 479) Dimensões da Tela Gráfica (639, 0) (639, 479) 20 DSC/CCT/UFCG 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 {joseana, rangel}@dsc.ufcg.edu.br setbkcolor(numero) numero constante numérica entre 0 e 15 ou constante simbólica representante da cor (e.g. BLACK) 21 DSC/CCT/UFCG 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) {joseana, rangel}@dsc.ufcg.edu.br setcolor(number) numero Similar função setbkcolor ao argumento da 22 DSC/CCT/UFCG Números e Nomes de Cores # Nome da Cor Cor 0 Black 1 Blue 2 Green 3 Cyan 4 Red 5 Magenta 6 Brown 7 Light Gray 8 Dark Gray {joseana, rangel}@dsc.ufcg.edu.br 9 Light Blue 10 Light Green 11 Light Cyan 12 Light Red 13 Light Magenta 14 Yellow 15 White 23 DSC/CCT/UFCG Nomes de Cores – paleta16.c 1 {joseana, rangel}@dsc.ufcg.edu.br #include #include #include #include #include <graphics.h> <stdio.h> <stdlib.h> <process.h> <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; 24 DSC/CCT/UFCG Nomes de Cores – paleta16.c 2 errorcode=registerbgidriver(EGAVGA_driver); {joseana, rangel}@dsc.ufcg.edu.br 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()); 25 Nomes de Cores – paleta16.c 3 /* Determinacao da proporcao */ DSC/CCT/UFCG 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); {joseana, rangel}@dsc.ufcg.edu.br /* 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); 26 {joseana, rangel}@dsc.ufcg.edu.br DSC/CCT/UFCG 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); } 27 DSC/CCT/UFCG Entidades Geométricas Pontos e Linhas Retângulos Arcos Círculos e Elipses {joseana, rangel}@dsc.ufcg.edu.br Sólidos geométricos 28 DSC/CCT/UFCG 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)) {joseana, rangel}@dsc.ufcg.edu.br 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 #include #include #include #include #include <graphics.h> <stdlib.h> <string.h> <stdio.h> <conio.h> <math.h> 29 DSC/CCT/UFCG 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); {joseana, rangel}@dsc.ufcg.edu.br /* 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() */ 30 DSC/CCT/UFCG 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); } {joseana, rangel}@dsc.ufcg.edu.br 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)); } 31 DSC/CCT/UFCG Pontos e Linhas – tracgraf.c 4 /* Armazenamento das instrucoes de visualizacao do grafico */ {joseana, rangel}@dsc.ufcg.edu.br 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 */ 32 DSC/CCT/UFCG Pontos e Linhas – tracgraf.c 5 int m,drv=VGA, modo=VGAHI; float xb,xe,yb,ye,x,y,potx,poty; char tecla; {joseana, rangel}@dsc.ufcg.edu.br 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,""); 33 Pontos e Linhas – tracgraf.c 6 DSC/CCT/UFCG /* 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 */ {joseana, rangel}@dsc.ufcg.edu.br strcpy(estilostr, menu[m]); } /* Apresentacao do menu */ outtextxy(330, 20 + 12*m, estilostr); setcolor(14); moveto(0,tela_y(yb,matfunc(xb),ye)); 34 DSC/CCT/UFCG Pontos e Linhas – tracgraf.c 7 {joseana, rangel}@dsc.ufcg.edu.br 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; 35 {joseana, rangel}@dsc.ufcg.edu.br DSC/CCT/UFCG 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; 36 {joseana, rangel}@dsc.ufcg.edu.br DSC/CCT/UFCG 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; 37 {joseana, rangel}@dsc.ufcg.edu.br DSC/CCT/UFCG 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 DSC/CCT/UFCG Pontos e Linhas – tracgraf.c 10 case ‘z': /* Visualizacao inicial */ xb = -360; xe = 360; yb = 10; ye = -10; break; default: continue; } cleardevice(); {joseana, rangel}@dsc.ufcg.edu.br 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); 39 DSC/CCT/UFCG 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 */ {joseana, rangel}@dsc.ufcg.edu.br strcpy(estilostr, menu[m]); } /* Apresentacao do menu */ outtextxy(330, 20 + 12*m, estilostr); } 40 DSC/CCT/UFCG Pontos e Linhas – tracgraf.c 12 else if(tecla=='d') { setcolor(15); for(m=0;m<=10;m++) { strcpy(estilostr, menu[m]); {joseana, rangel}@dsc.ufcg.edu.br 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); } 41 DSC/CCT/UFCG 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); } {joseana, rangel}@dsc.ufcg.edu.br } 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)); } 42 DSC/CCT/UFCG 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)); } {joseana, rangel}@dsc.ufcg.edu.br } } closegraph(); /*Encerramento do modo grafico */ return; 43 Traçado de Linhas I DSC/CCT/UFCG Apontador Corrente Entidade de apontamento invisível Rastreio da posição corrente do pixel Equivalente ao cursor visível no modo texto {joseana, rangel}@dsc.ufcg.edu.br Função para o deslocamento do apontador para uma locação no gráfico (sem traçado algum) void far moveto (int x, int y); 44 DSC/CCT/UFCG 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 far lineto(int x, int y); {joseana, rangel}@dsc.ufcg.edu.br 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 45 DSC/CCT/UFCG 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); {joseana, rangel}@dsc.ufcg.edu.br void far linerel(int dx, int dy); 46 Rectângulos II DSC/CCT/UFCG Função para traçado direto de um retângulo na cor e estilo de linha default {joseana, rangel}@dsc.ufcg.edu.br 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) 47 Círculos DSC/CCT/UFCG 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) {joseana, rangel}@dsc.ufcg.edu.br r centro do círculo raio do círculo (x, y) r 48 Arcos DSC/CCT/UFCG Função para traçado de um arco na cor e estilo de linha default void far arc(int int af, int r); {joseana, rangel}@dsc.ufcg.edu.br (x, y) x, int centro do arco ai ângulo inicial af ângulo final xr raio do arco y, int ai, 90 af ai 180 270 0 49 Elipses DSC/CCT/UFCG 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); {joseana, rangel}@dsc.ufcg.edu.br (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 50 DSC/CCT/UFCG Traçado de Pontos (Pixels) Funções para a determinação dos máximos valores de x e y para o traçado de um ponto (x, y) int far getmaxx(void) {joseana, rangel}@dsc.ufcg.edu.br int far getmaxy(void) Função para o traçado de um ponto de coordenadas (x, y) em um dada cor void far putpixel (int x, int y, int cor); 51 DSC/CCT/UFCG Configuração de Atributos de Linhas Configuração de uma Linha TODAS as linhas são traçadas no Turbo C++ 3.0 no modo default de linha {joseana, rangel}@dsc.ufcg.edu.br Possibilidade de especificação de três atributos pelo usuário: estilo, padrão e espessura Sintaxe da função para configuração de atributos de linhas void far unsigned setlinestyle (int style, pattern, int thickness); 52 Estilos de Linhas DSC/CCT/UFCG {joseana, rangel}@dsc.ufcg.edu.br # Nome Descrição 0 SOLID_LINE Linha cheia 1 DOTTED_LINE Linha pontilhada 2 CENTER_LINE Linha tracejada pontilhada 3 DASHED_LINE Linha tracejada 4 USERBIT_LINE Linha definida pelo usuário Efeito 53 Padrões de Linhas DSC/CCT/UFCG Padrão Palavra de 16 bits aplicável APENAS se o estilo da linha for USERBIT_LINE (4) Caso o seja, SEMPRE que um bit na palavra do padrão for 1, o pixel correspondente na {joseana, rangel}@dsc.ufcg.edu.br linha é traçado na cor corrente Caso contrário, MESMO QUE um valor seja atribuído ao parâmetro padrão, este não terá NENHUM efeito no traçado da linha 54 Padrões de Linhas DSC/CCT/UFCG Exemplos Uma linha sólida corresponde a um padrão de 0xFFFF (TODOS os pixels traçados) Uma linha tracejada poderá corresponder a um padrão de 0x3333 ( ) ou 0x0F0F {joseana, rangel}@dsc.ufcg.edu.br ( ) 55 DSC/CCT/UFCG {joseana, rangel}@dsc.ufcg.edu.br # Espessuras de Linhas Nome Descrição 1 NORM_WIDTH Espessura de 1 pixel 3 THICK_WIDTH Espessura de 3 pixels Efeito 56 DSC/CCT/UFCG #include #include #include #include #include Entidades Geométricas – entgeo1.c 1 <graphics.h> <stdlib.h> <string.h> <stdio.h> <conio.h> {joseana, rangel}@dsc.ufcg.edu.br /* Armazenamento de nomes de estilos de linha aceitos */ char *lnome[] = {"SOLID_LINE","DOTTED_LINE","CENTER_LINE", "DASHED_LINE","USERBIT_LINE"}; /* Armazenamento de nomes de USERBIT_LINES */ char *lnome1[] = {"USERBIT_LINE1","USERBIT_LINE2","USERBIT_LINE3", "USERBIT_LINE4","USERBIT_LINE5"}; 57 DSC/CCT/UFCG Entidades Geométricas – entgeo1.c 2 int main(void) { /* Solicitacao de auto-detecao e declaracao de variaveis locais*/ int gdriver = DETECT, gmodo, coderro; int i, estilo, midx, midy, padrao; char estilostr[40], estilostr1[40]; {joseana, rangel}@dsc.ufcg.edu.br /* Inicialização do modo gráfico */ initgraph(&gdriver, &gmodo, ""); /* Leitura do resultado do processo de inicializacao */ coderro = graphresult(); if (coderro != grOk) /* Ocorrencia de erro */ { printf("Erro: %s\n", grapherrormsg(coderro)); printf("Pressione qualquer tecla para sair:"); getch(); exit(1); /* Finalizacao com erro */ } 58 Entidades Geométricas – entgeo1.c DSC/CCT/UFCG 3 midx = getmaxx() / 2; midy = getmaxy() / 2; {joseana, rangel}@dsc.ufcg.edu.br /* Variação da cor e extensão de uma linha */ for(i=1;i<=15;i++){ setcolor(i); line(5,5,20*i,20*i); delay(500); cleardevice(); } /* Variação da cor e dimensões de um retangulo vazio */ for(i=1;i<=15;i++){ setcolor(i); rectangle(5,5,15*i,15*i); delay(500); cleardevice(); } 59 DSC/CCT/UFCG Entidades Geométricas – entgeo1.c 4 {joseana, rangel}@dsc.ufcg.edu.br /* Variação da cor e extensão de uma elipse vazada*/ for(i=1;i<=15;i++){ setcolor(i); setlinestyle(estilo, padrao, 1); ellipse(300,200,i,25*i,15*i,8*i); delay(300); cleardevice(); } /* Variação das cores de borda e de preenchimento de um retângulo 3D */ for(i=1;i<=15;i++){ setcolor(i); setfillstyle(SOLID_FILL, 16-i); bar3d(200,200,400,400,50,50); outtextxy(280,300, "TESTE"); delay(500); cleardevice(); } 60 DSC/CCT/UFCG Entidades Geométricas – entgeo1.c 5 /* Definicao do padrao de uma linha pelo usuario */ padrao = 0x8888; for (estilo=SOLID_LINE; estilo<=USERBIT_LINE; estilo++) { /* Selecao do estilo da linha */ setlinestyle(estilo, padrao, 1); /* Conversao do estilo em string */ strcpy(estilostr, lnome[estilo]); setcolor(3*estilo); /* Alteracao da cor do tracado */ {joseana, rangel}@dsc.ufcg.edu.br line(0, 0, midx-10, midy); /* Tracado da linha */ /* Apresentacao de mensagem */ outtextxy(midx, midy, estilostr); } delay(500); /* Retencao do tracado na tela */ cleardevice(); 61 DSC/CCT/UFCG Entidades Geométricas – entgeo1.c 6 /* Definicao do estilo de uma linha pelo usuario */ estilo=SOLID_LINE; while(estilo<=USERBIT_LINE) { /* Selecao do estilo da linha */ setlinestyle(estilo, padrao, 1); /* Conversao do estilo em string */ strcpy(estilostr, lnome[estilo]); setcolor(3*(estilo+1)); /* Alteracao da cor do tracado */ {joseana, rangel}@dsc.ufcg.edu.br /* Tracado de linha */ line(midx-100, midy-100 + 20*estilo, midx-40, midy-100 + 20*estilo); } /* Apresentacao de mensagem */ outtextxy(midx, midy-105+20*estilo, estilostr); estilo++; delay(100); 62 DSC/CCT/UFCG Entidades Geométricas – entgeo1.c 7 delay(2000); cleardevice(); padrao = 0xFFFF; for (i=1; i<=5; i++) { /* Definicao do padrao de uma linha */ if(i<3) setlinestyle(USERBIT_LINE, padrao<<3*i,1); else setlinestyle(USERBIT_LINE, padrao<<3*i,3); /* Conversao do estilo em string */ strcpy(estilostr1, lnome1[i-1]); {joseana, rangel}@dsc.ufcg.edu.br setcolor(2*i+4); /* Alteracao da cor do tracado */ /* Tracado da linha */ line(midx-240, midy+20*(i-5),midx-30, midy+20*(i-5)); } /* Apresentacao de mensagem */ outtextxy(midx, midy-103+20*i, estilostr1); delay(100); 63 DSC/CCT/UFCG {joseana, rangel}@dsc.ufcg.edu.br } Entidades Geométricas – entgeo.c 8 getch(); closegraph(); /* Encerramento do modo grafico */ return 0; 64 DSC/CCT/UFCG Padrões de Preenchimento Seleção de Padrões e Cores Preenchimento de Regiões {joseana, rangel}@dsc.ufcg.edu.br Aquisição de Pixels 65 Seleção de Padrões e Cores DSC/CCT/UFCG Função para a configuração do padrão e da cor de um objeto a ser preenchido graficamente void far setfillstyle(int padrao, int cor); Função para a configuração de um padrão {joseana, rangel}@dsc.ufcg.edu.br de preenchimento definido pelo usuário NÃO atribuir o valor 12 (USER_FILL) ao parâmetro padrao da função setfillstyle Invocar void far setfillpattern(char *upadrao, int cor); far 66 Padrões de Preenchimento DSC/CCT/UFCG {joseana, rangel}@dsc.ufcg.edu.br # Nome Preenchimento 0 EMPTY_FILL Cor de fundo 1 SOLID_FILL Sólido 2 LINE_FILL ------- 3 LTSLASH_FILL / 4 SLASH_FILL / (linhas espessas) 5 BKSLASH_FILL \ (linhas espessas) 6 LTBKSLASH_FILL \ 7 HATCH_FILL Cruzado fino 8 XHATCH_FILL Cruzado espesso 9 INTERLEAVE_FILL Linhas entrelaçadas 10 WIDE_DOT_FILL Pontos muito espaçados 11 CLOSE_DOT_FILL Pontos pouco espaçados 12 Nome Padrão definido pelo usuário 67 DSC/CCT/UFCG Estilos de Linhas – padpreen.c 1 #include #include #include #include <stdlib.h> <string.h> <stdio.h> <conio.h> {joseana, rangel}@dsc.ufcg.edu.br /* Armazenamento de nomes de preenchimento de linha aceitos */ char *fnome[] = {"EMPTY_FILL","SOLID_FILL", "LINE_FILL","LTSLASH_FILL","SLASH_FILL", "BKSLASH_FILL",LTBKSLASH_FILL","HATCH_FILL", "XHATCH_FILL","INTERLEAVE_FILL","WIDE_DOT_FILL", "CLOSE_DOT_FILL","USER_FILL"}; char *fnome1[] = {"EMPTY_FILL P25","SOLID_FILL P25", "LINE_FILL P25","LTSLASH_FILL P25","SLASH_FILL P25", "BKSLASH_FILL P25","LTBKSLASH_FILL P25", "HATCH_FILL P25","XHATCH_FILL P25", "INTERLEAVE_FILL P25","WIDE_DOT_FILL P25", "CLOSE_DOT_FILL P25","USER_FILL P25"}; 68 DSC/CCT/UFCG Estilos de Linhas – padpreen.c 2 int main(void) { /* Solicitacao de auto-detecao e declaracao de variaveis locais*/ int gdriver = DETECT, gmodo, coderro; int i, j, estilo, midx, midy, padrao; /* Padrao de preenchimento definido pelo usuario */ char padrao1[8] = {0x00,0x00,0x00,0x00,0xF0,0xF0, 0xF0,0xF0}; {joseana, rangel}@dsc.ufcg.edu.br char estilostr[40], estilostr1[40]; /* Inicialização do modo gráfico */ initgraph(&gdriver, &gmodo, ""); /* Leitura do resultado do processo de inicializacao */ coderro = graphresult(); 69 DSC/CCT/UFCG Estilos de Linhas – padpreen.c 3 if (coderro != grOk) /* Ocorrencia de erro */ { printf("Erro: %s\n", grapherrormsg(coderro)); printf("Pressione qualquer tecla para sair:"); getch(); exit(1); /* Finalizacao com erro */ } {joseana, rangel}@dsc.ufcg.edu.br midx = getmaxx() / 2; midy = getmaxy() / 2; /* Definicao do padrao de preenchimento */ for (estilo = EMPTY_FILL; estilo < USER_FILL; estilo++) { /* Selecao de estilo de linha */ setfillstyle(estilo, estilo+3); /* Conversao do padrao de preenchimento em string */ strcpy(estilostr, fnome[estilo]); 70 DSC/CCT/UFCG Estilos de Linhas – padpreen.c 4 /* Configuracao da cor da borda do desenho */ setcolor(estilo+3); /* Preenchimento do retangulo 2D*/ bar3d(50, 50, midx-10, midy, 0, 0); {joseana, rangel}@dsc.ufcg.edu.br /* Apresentacao de mensagem */ outtextxy(midx, midy, estilostr); } delay(1000); /* Retencao do tracado na tela */ cleardevice(); /* Apagamento da tela */ 71 DSC/CCT/UFCG Estilos de Linhas – padpreen.c 5 /* Definicao do padrao de preenchimento */ for (estilo = EMPTY_FILL; estilo < USER_FILL; estilo++) { /* Selecao de estilo de linha */ setfillstyle(estilo, estilo+3); /* Conversao do padrao de preenchimento em string */ strcpy(estilostr1, fnome1[estilo]); /* Configuracao da cor da borda do desenho */ setcolor(estilo+3); {joseana, rangel}@dsc.ufcg.edu.br /* Preenchimento do retangulo 3D*/ bar3d(50, 50, midx-10, midy, 25, 1); /* Apresentacao de mensagem */ outtextxy(midx, midy, estilostr1); } delay(1000); /* Retencao do tracado na tela */ cleardevice(); /* Apagamento da tela */ 72 DSC/CCT/UFCG Estilos de Linhas – padpreen.c 6 for (i = 1; i < 15; i++) { /* Configuracao da cor da borda do desenho */ setcolor(15-i); for(j=0; j < 8; j++){ padrao1[j] = padrao1[j]^padrao1[j]<<1^padrao1[j]>>2; } /* Selecao de um padrao de preenchimento definido pelo usuario */ setfillpattern(padrao1, 15-i); {joseana, rangel}@dsc.ufcg.edu.br /* Preenchimento com o padrao selecionado*/ bar3d(50, 50, midx-10, midy, 25, 1); delay(2000); /* Retencao do tracado na tela */ cleardevice(); /* Apagamento da tela */ } } getch(); closegraph(); /* Encerramento do modo grafico */ return 0; 73 Preenchimento de Regiões I DSC/CCT/UFCG Função para o preenchimento de uma região com um padrão e uma cor {joseana, rangel}@dsc.ufcg.edu.br void floodfill (int x, int y, int cor); (x, y) ponto “semente” situado no interior da região a ser “inundada” por uma dada cor cor cor da borda da região 74 Preenchimento de Regiões II DSC/CCT/UFCG Função para o preenchimento de uma região com um padrão e uma cor {joseana, rangel}@dsc.ufcg.edu.br Recomendação Uso da função fillpoly ao invés de floodfill SEMPRE que possível Manutenção da compatibilidade de código com versões mais recentes floodfill NÃO é compatível com o driver IBM-8514 75 Preenchimento de Regiões III DSC/CCT/UFCG Função para o preenchimento de uma região com um padrão e uma cor Sintaxe da função fillpoly {joseana, rangel}@dsc.ufcg.edu.br void far fillpoly(int np, int far *pp); np número de pontos da borda do polígono a ser preenchido pp apontador para uma seqüência de np*2 inteiros, na qual cada par de inteiros fornece as coordenadas x e y de um ponto do polígono 76 DSC/CCT/UFCG Estilos de Linhas – preenpol.c 1 #include #include #include #include <graphics.h> <stdlib.h> <stdio.h> <conio.h> {joseana, rangel}@dsc.ufcg.edu.br int main(void) { int gdriver = DETECT, gmodo, coderro; int i, maxx, maxy; int poligono[4]; /* Array do poligono */ initgraph(&gdriver, &gmodo, ""); coderro = graphresult(); if (coderro != grOk) { printf("Erro: %s\n",grapherrormsg(errorcode)); printf(“Pressione qualquer tecla para encerrar!"); getch(); exit(1); } 77 DSC/CCT/UFCG Estilos de Linhas – preenpol.c 2 maxx = getmaxx(); maxy = getmaxy(); poligono[0] poligono[1] poligono[2] poligono[3] poligono[4] poligono[5] poligono[6] = = = = = = = 100; /* Primeiro vertice */ maxy/2; maxx-200; /* Segundo vertice */ 200; maxx/2; /* Terceiro vertice */ maxy/3; maxx/4; /* Quarto vertice, preenchimento {joseana, rangel}@dsc.ufcg.edu.br automatico */ poly[7] = maxy/3; /* Fechamento do poligono */ /* Laco para configuracao de padroes de preenchimento */ for (i=EMPTY_FILL; i<USER_FILL; i++) { setcolor(i); setfillstyle(i, i) 78 DSC/CCT/UFCG Estilos de Linhas – preenpol.c 3 fillpoly(4, poligono); /* Tracado de um poligono preenchido */ delay(1000); cleardevice(); {joseana, rangel}@dsc.ufcg.edu.br } } getch(); closegraph(); return 0; 79 Preenchimento de Regiões IV DSC/CCT/UFCG Função para o traçado e preenchimento de uma elipse {joseana, rangel}@dsc.ufcg.edu.br void fillellipse(int x, int y, int xr, int yr); (x, y) ponto central da elipse xr raio horizontal da elipse yr raio vertical da elipse yr xr (x, y) 80 DSC/CCT/UFCG Estilos de Linhas – prelipse.c 1 #include #include #include #include <graphics.h> <stdlib.h> <stdio.h> <conio.h> int main(void) { int gdriver = DETECT, gmodo, coderro; int xradius = yradius = 40; int midx, midy, i; {joseana, rangel}@dsc.ufcg.edu.br initgraph(&gdriver, &gmodo, ""); } coderro = graphresult(); if (coderro != grOk){ printf("Erro: %s\n", grapherrormsg(coderro)); printf("Pressione qualquer tecla para sair:"); getch(); exit(1); 81 DSC/CCT/UFCG Estilos de Linhas – prelipse.c 2 midx = getmaxx()/8; midy = getmaxy()/8; for (i = EMPTY_FILL; i < USER_FILL; i++) { setcolor(i); setfillstyle(i,i); {joseana, rangel}@dsc.ufcg.edu.br /* Tracado de uma elipse preenchida*/ fillellipse(midx*i/2, midy*i/2, xradius*i*i/(3+2*i), yradius*i*i/(4+i*i)); delay(1000); cleardevice(); } getch(); closegraph(); } return 0; 82 DSC/CCT/UFCG Preenchimento de Regiões V Função para o traçado e preenchimento de uma “fatia de pizza” (pieslice) {joseana, rangel}@dsc.ufcg.edu.br void pieslice(int x, int y, int ai, int af, int r); (x, y) ponto central da “fatia de pizza” ai ângulo inicial da fatia af ângulo final da fatia r raio da fatia af ai (x, y) r 83 DSC/CCT/UFCG Estilos de Linhas – fatpizza.c 1 #include #include #include #include #include <graphics.h> <stdlib.h> <stdio.h> <conio.h> int main(void) { int gdriver = DETECT, gmodo, coderro; int midx, midy; int ai = 0, af = 0, i = 0, j = 0, raio = 100, cor = 1; {joseana, rangel}@dsc.ufcg.edu.br initgraph(&gdriver, &gmodo, ""); coderro = graphresult(); if (coderro != grOk) { printf("Erro: %s\n", grapherrormsg(coderro)); printf("Pressione qualquer tecla para encerrar!"); getch(); exit(1); } 84 DSC/CCT/UFCG Estilos de Linhas – fatpizza.c 2 midx = getmaxx()/2; midy = getmaxy()/2; while(i<6) { for(af=0;af<360;af+=2) { setcolor(cor); setfillstyle(SOLID_FILL, cor); {joseana, rangel}@dsc.ufcg.edu.br /* Tracado de uma “fatia de pizza” */ pieslice(midx, midy, ai, af, raio); delay(2); } for(j=0;j<4;j++) { setcolor(15-cor); line(midx, midy,midx+100,midy+j); } 85 {joseana, rangel}@dsc.ufcg.edu.br DSC/CCT/UFCG } Estilos de Linhas – fatpizza.c 3 for(af=360;af>=0;af-=2) { setcolor(15-cor); setfillstyle(SOLID_FILL, 15-cor); pieslice(midx, midy, 359, af, raio); delay(2); } i++; cor++; } getch(); closegraph(); return 0; 86 DSC/CCT/UFCG Preenchimento de Regiões VI Função para o traçado e preenchimento de uma barra retangular {joseana, rangel}@dsc.ufcg.edu.br void bar(int e, int c, int d, int b); (e, c) coordenadas do pixel do canto superior esquerdo da barra (d, b) coordenadas do pixel do canto inferior direito da barra (e, c) (d, b) 87 DSC/CCT/UFCG Preenchimento de Regiões VII Função para o traçado e preenchimento de uma barra retangular tridimensional {joseana, rangel}@dsc.ufcg.edu.br void bar3d(int e, int c, int d, int b, int p, int t); (e, c) coordenadas do pixel do canto superior esquerdo da barra (d, b) coordenadas do pixel do canto inferior direito da barra p profundidade da barra t topflag (controla se um topo 3D será incorporado à barra) 88 Apresentação de Texto na tela Gráfica DSC/CCT/UFCG Função para a escrita de expressões literais na tela gráfica, a partir de uma locação especificada por um par de coordenadas void outtextxy (int x, int y, char *string); {joseana, rangel}@dsc.ufcg.edu.br Manutenção da compatibilidade do código em face do uso de várias fontes de texto Uso das funções textwidth e textheight para a determinação das dimensões da string 89 Configuração de Texto DSC/CCT/UFCG Função para a configuração de valores para os atributos do texto visualizado em tela gráfica {joseana, rangel}@dsc.ufcg.edu.br void settextstyle(int fnt, int dir, int tc); fnt estilo da fonte de texto dir direção da fonte Horizontal (da esquerda para a direita) e Vertical (rotacionada 90° no sentido anti-horário) tc tamanho do caractere visualizado em tela 90 DSC/CCT/UFCG # Estilo e Direção de Texto Nome Fonte de texto 0 DEFAULT_FONT Mapa de bits 8x8 1 TRIPLEX_FONT Triplex 2 SMALL_FONT Small 3 SANS_SERIF_FONT Sans-Serif 4 GOTHIC_FONT Gothic 5 SCRIPT_FONT Script 6 SIMPLEX_FONT Simplex Scrip {joseana, rangel}@dsc.ufcg.edu.br 7 TRIPLEX_SCR_FONT Triplex Script 8 COMPLEX_FONT Complex 9 EUROPEAN_FONT European 10 BOLD_FONT Bold # Nome Direção 0 HORIZ_DIR Esquerda para direita 1 VERT_DIR Baixo para cima 91 Tamanho de Caracteres {joseana, rangel}@dsc.ufcg.edu.br DSC/CCT/UFCG Valor de tc Efeito em outtext/ outtextxy 0 Ampliação da fonte (stroked) usando fator de ampliação default de caracteres (4) ou o tamanho do caractere definido pelo usuário (dado por setusercharsize) 1 Visualização de caracteres da fonte 8x8 (bitmapped) em um retângulo da tela contendo 8x8 pixels 2 Visualização de caracteres da fonte 8x8 (bitmapped) em um retângulo da tela contendo 16x16 pixels 3 .. . 10 Visualização de caracteres da fonte 8x8 (bitmapped) em um retângulo da tela contendo 24x24 pixels .. . Visualização de caracteres da fonte 8x8 (bitmapped) em um retângulo da tela contendo 80x80 pixels 92 Apagamento da Tela DSC/CCT/UFCG Estratégias de apagamento da tela Modo gráfico em uso void far cleardevice(void); Fora do modo gráfico {joseana, rangel}@dsc.ufcg.edu.br void clrscr(void); Apagamento da tela de texto, NÃO da tela gráfica!!! 93 DSC/CCT/UFCG Aquisição e Traçado de Pixels Função para a aquisição da cor de um pixel localizado nas coordenadas (x, y) unsigned getpixel(int x, int y); Função para o traçado de um pixel de uma dada cor nas coordenadas (x, y) {joseana, rangel}@dsc.ufcg.edu.br void putpixel(int x, int y, int cor); 94 DSC/CCT/UFCG Funções Não Gráficas Úteis int kbhit(void); /* include <conio.h> */ Verificação a existência de um caractere no {joseana, rangel}@dsc.ufcg.edu.br buffer de entrada pronto para leitura Em caso afirmativo Retorno de um inteiro não nulo (V) Caso contrário Retorno de zero (F) 95 DSC/CCT/UFCG Funções Não Gráficas Úteis int getch(void); /* include <conio.h> */ Leitura de um caractere do teclado e retorno {joseana, rangel}@dsc.ufcg.edu.br de seu valor ASCII (sem espera de um ENTER) 96 DSC/CCT/UFCG Joseana Macêdo Fechine José Eustáquio Rangel de Queiroz {joseana, rangel}@dsc.ufcg.edu.br {joseana, rangel}@dsc.ufcg.edu.br UNIVERSIDADE FEDERAL DE CAMPINA GRANDE CENTRO DE CIÊNCIAS E TECNOLOGIA DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO