Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Linguagem C-Introdução programação aplicações graficas, Notas de estudo de Engenharia Informática

Programação em linguagem c. Borland C 3.0

Tipologia: Notas de estudo

Antes de 2010

Compartilhado em 01/04/2009

nilson-maziero-9
nilson-maziero-9 🇧🇷

4.9

(7)

1 documento

1 / 81

Documentos relacionados


Pré-visualização parcial do texto

Baixe Linguagem C-Introdução programação aplicações graficas e outras Notas de estudo em PDF para Engenharia Informática, somente na Docsity! - LINGUAGEM C – INTRODUÇÃO À PROGRAMAÇÃO COM APLICAÇÕES GRÁFICAS Nilson Luiz Maziero Passo Fundo, setembro de 2008. SUMÁRIO Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 2 Introdução........................................................................................................................................ 4 Capítulo 1 ........................................................................................................................................ 5 1. Programação ............................................................................................................................... 5 1.1 Conceitos básicos de programação .......................................................................................... 5 1.2 Tipos de dados .......................................................................................................................... 5 1.3 Operações aritméticas............................................................................................................... 6 1.4 Operadores relacionais.............................................................................................................. 6 1.5 Operadores de incremento e decremento................................................................................. 6 1.6 Funções básicas........................................................................................................................ 7 1.6.1 Função clrscr( )....................................................................................................................... 7 1.6.2 Função printf( ) ....................................................................................................................... 7 1.6.3 Função getch( )....................................................................................................................... 7 1.6.4 Função scanf( )....................................................................................................................... 8 1.6.5 Função for( ) ........................................................................................................................... 9 1.6.6 Função while( ) ....................................................................................................................... 10 1.6.7 Função do while( ) .................................................................................................................. 11 1.6.8 Função if( )....else................................................................................................................... 12 1.6.9 Função delay( ) ....................................................................................................................... 12 1.6.10 Função sqrt( ) ....................................................................................................................... 13 1.6.11 Função sin().......................................................................................................................... 13 1.6.12 Função cos()......................................................................................................................... 13 1.6.13 Função tan() ......................................................................................................................... 13 1.6.14 Função atan() ....................................................................................................................... 13 1.7 Construção de funções do usuário............................................................................................ 13 1.8 Interface gráfica......................................................................................................................... 14 1.9 Funções gráficas ....................................................................................................................... 14 1.10 Programa de desenho de uma reta e um círculo .................................................................... 17 Capítulo 2 ........................................................................................................................................ 20 2. Aplicações ................................................................................................................................... 20 2.1Programa Parábola..................................................................................................................... 20 2.1.1 O que é uma parábola............................................................................................................ 20 2.1.2 Elementos da parábola........................................................................................................... 20 2.1.3 Processo de traçado............................................................................................................... 21 2.1.4 Desenvolvimento do algoritimo............................................................................................... 21 2.1.5 Fluxograma............................................................................................................................. 22 2.1.6 O programa básico ................................................................................................................. 22 2.1.7 O programa parábola – versão 1............................................................................................ 23 2.1.8 O programa parábola – versão 2............................................................................................ 24 2.1.9 O programa parábola – versão 3............................................................................................ 25 2.1.10 Comentários ......................................................................................................................... 26 2.2 Programa Elipse ........................................................................................................................ 27 2.2.1 O que é uma elipse................................................................................................................. 27 2.2.2 Elementos de uma elipse ....................................................................................................... 28 2.2.3 Processo dos círculos concêntricos ....................................................................................... 28 2.2.4 Desenvolvimento do algoritimo............................................................................................... 28 2.2.5 Fluxograma do programa ....................................................................................................... 29 2.2.6 Estrutura básica do programa ................................................................................................ 30 2.2.7 Desenvolvimento do programa............................................................................................... 31 2.2.8 Comentários ........................................................................................................................... 34 2.3 Programa espiral de Arquimedes .............................................................................................. 35 2.3.1 O que é uma espiral de Arquimedes ...................................................................................... 35 2.3.2 Elementos de uma espiral de Arquimedes............................................................................. 35 2.3.3 Processo de traçado............................................................................................................... 36 2.3.4 Desenvolvimento do algoritimo............................................................................................... 36 2.3.5 O programa ............................................................................................................................ 37 2.3.6 Comentários ........................................................................................................................... 38 Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 5 1 - PROGRAMAÇÃO Nos dias atuais, o uso da informática está em todas as atividades humanas, desde atividades industriais, comerciais, educacionais e até mesmo dentro de nossas casas, onde vários tipos de equipamentos já a utilizam sem que sejam percebidos. Deste modo, é interessante um conhecimento básico de programação para que o indvíduo possa entender este assunto como algo possível de ser utilizado, e não algo do outro mundo, que somente está acessível aos indivíduos super dotados. Os itens de programação aqui apresentados são aqueles necessários ao entendimento dos programas apresentados. Deve-se lembrar que a matemática é uma parte muito importante para o entendimento e execução de um programa de computador. 1.1 - CONCEITOS BÁSICOS DE PROGRAMAÇÃO A programação é um conjunto de instruções, descrita numa linguagem que o sistema operacional do computador consegue analisar, e que são executadas sequencialmente, de acordo com o que o programador determinou. Para escrever um programa, é necessário conhecer uma linguagem, onde se utiliza um compilador para transformar o programa escrito numa linguagem compreensível pelo ser humano, numa linguagem dita “linguagem de máquina”. Esta linguagem de máquina é escrita num formato que o computador consegue entender e processar rapidamente, mas para o ser humano é difícil. A linguagem de programação é composta por uma série de comandos, que são ordens para a execução de determinadas instruções, que são aquelas operações específicas do programa que o programador descreve para obter um resultado desejado. Além dos comandos, outro elemento importante são as variáveis, que são responsáveis pelo armazenamento das informações, que podem ser numéricas (números inteiros, números reais, etc.) e de caracteres (letras e palavras). Na linguagem C, se uma palavra que representa uma variável é escrita em letras minúsculas, e a mesma palavra é escrita com a letra inicial maiúscula, elas são consideradas variáveis diferentes. Após cada instrução de programa, deve ser colocado um ponto e vírgula ( ; ). 1.2 - TIPOS DE DADOS Na linguagem C, há vários tipos de dados como int, float e char, etc. Os tipos de dados irão definir os tipos de variáveis que serão utilizadas no programa, o que é feito pelo usuário. A definição das variáveis é função específica dos dados utilizados para resolver o problema. int Define uma variável que armazena um número inteiro. Um número inteiro é definido como: int num; num é uma variável inteira. int controle = 2; controle é uma variável inteira e armazena o valor 2. float Define uma variável que armazena um número real. Um número real é definido como: float valores; valores é uma variável real. float numero = 3.23; numero é uma variável real e armazena o valor 3,23. Obs.: Ao escrever um programa com número real, a parte inteira é separa da parte decimal por um ponto (.), e não uma vírgula (,). char Define uma variável que armazena um caracter, que pode ser uma letra um número, ou uma cadeia de caracteres, que é uma palavra. Um char é assim definido: char nome; nome é uma variável que armazena um caracter. char letra = ‘d’; letra é uma variável que armazena um caracter e que é o d. Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 6 char numero = ‘5’; numero é uma variável que armazena um caracter e que é o 5. Não é interpretado como o número 5, não podendo ser usado para cálculos. char nomes[5] = “joao”; nomes é uma variável que armazena um vetor de caracteres (cinco posições), mas no máximo quatro caracteres podem ser colocados. 1.3 - OPERAÇÕES ARITMÉTICAS ( = ) Atribuição Este sinal corresponde a atribuir um valor da variável do lado direito do sinal para a variável do lado esquerdo. Onde: a = b; a variável a assume o valor da variável b, e a variável b ainda permanece com o referido valor. c = 5; a variável c passa a armazenar o valor 5. b = c/a; a variável b passa a assumir o valor da divisão da variável c pela variável a. x = y = z; as variáveis x e y recebem o valor da variável z. ( + ) Adição c = a + b; Executa a adição de duas variáveis, a e b, que são armazenadas em c. d = a + b + c; Executa a adição de três variáveis, a, b e c, que são armazenadas em d. ( - ) Subtração c = a - b; Executa a subtração de uma variável da outra (a e b), onde o resultado é armazenado em c. c = a – b - d; Subtrair a variável b da variável a, e deste resultado subtrair a variável d. ( * ) Multiplicação c = a * b; Efetua a multiplicação das duas variáveis a e b, sendo o resultado armazenado em c. c = a * b * d; Efetua a multiplicação das três variáveis e o resultado é armazenado na variável c. ( / ) Divisão c = a / b; Efetua a divisão da variável a pela variável b, sendo o resultado armazenado na variável c. No caso da variável que recebe o resultado de uma operação aritmética, esta deve ser do tipo que resulta o dado. Uma variável inteira (int) não pode receber um resultado que é uma variável de ponto flutuante (float), pois a parte fracionária será suprimida. 1.4 - OPERADORES RELACIONAIS Os operadores relacionais se utilizam para a análise comparativa entre as variáveis. ( > ) maior que (a > b) O valor da variável a é maior que o da variável b. ( >= ) maior ou igual a (a >= b) O valor da variável a é maior ou igual ao da variável b. ( < ) menor que (a < b) O valor da variável a é menor que o da variável b. ( <= ) menor ou igual a (a <= b) O valor da variável a é menor ou igual ao da variável b. ( == ) igual (a == b) O valor da variável a é igual ao valor da variável b. ( != ) diferente (a != b) O valor da variável a é diferente do valor da variável b. 1.5 - OPERADORES DE INCREMENTO E DECREMENTO ( ++ ) Operador de incremento. Adiciona uma unidade a variável inteira j. j++; Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 7 ( -- ) Operador de decremento. Subtrai uma unidade a variável inteira j. j--; 1.6 – FUNÇÕES BÁSICAS São funções que executam um conjunto de instruções para o programador. Elas fazem parte da linguagem de programação utilizada. Na realidade, em diferentes linguagens de programação, os nomes das funções básicas são semelhantes. Isto permite extender o aprendizado de uma linguagem para outra. 1.6.1 - FUNÇÃO clrscr() Este comando limpa a tela quando no formato texto. O formato texto permite apenas que sejam escritos caracteres na tela. 1.6.2 - FUNÇÃO printf ( ) Permite apresentar na tela um resultado, que pode ser um número ou uma expressão. De acordo com o tipo de variável a ser escrita, deve-se especificar na função o seu formato. Especificação da variável: %d identifica uma variável inteira %f identifica uma variável real %c identifica uma variável caracter %s identifica uma uma variável que tem uma seqüência de caracteres Caracter de controle: \n nova linha – inicia o texto a ser escrito na linha seguinte formato: printf( < formato> , <var1>, <var2>,...); <formato> é o campo que especifica a impressão através de uma seqüência de caracteres que inicia e termina com aspas. <var1>,<var2>,... são expressões que serão impressas de acordo com a especificação feita em <formato>. printf ( “\nescreve o numero real: %f ”,numero ); Antes de imprimir na tela, deve ir para uma nova linha \n, imprime o texto escreve o numero real:, onde %f diz que a variável numero é um número real (float), e imprime o que estiver armazenado na variável numero. printf ( “ escreve o numero inteiro: %d \n”,numeroInteiro ); onde %d diz que a variável numeroInteiro representa um número inteiro (int). Depois de escrever deve pular para nova linha (\n), e imprime o que estiver armazenado na variável numeroInteiro. printf ( “ escreve caracteres: %s ”,nome ); onde %s diz que a variável nome representa um caracter (char) ou uma cadeia de caracteres ( char [ ] ). Escreve sem mudar de linha o que estu\iver armazenado na variável nome. 1.6.3 - FUNÇÃO getch ( ) A função lê um caracter introduzido pelo teclado. Ao encontrar este comando, o programa para esperando que seja introduzido uma informação pelo teclado, por apenas um toque. O valor da tecla é capturado pela função, donde pode-se escrever: char Letra; Letra = getch ( ); O que permite que seja capturado o valor da tecla e transferido para a variável Letra. Ou simplesmente getch( ); para interromper o programa a espera do toque em uma tecla para continuar. // Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 10 clrscr(); for (i=0; i<10; i++) { printf(“\n i*2= %d”,i*2 ); } getch(); } resultado: i*2= 0 i*2= 2 i*2= 4 i*2= 6 i*2= 8 i*2= 10 i*2= 12 i*2= 14 i*2= 16 i*2= 18 1.6.6 - FUNÇÃO while( ){ ... } Permite que uma instrução ou um grupo seja executado um certo número de vezes, enquanto uma determinada condição não ocorra. O teste é feito no início do laço. Comando utilizado quando não se conhece o número de interações a ser realizado. O comando testa a condição inicial entre parentesis e se for válida realiza os comandos que estão entre chaves {...}. j++ j=0 while(j<10) printf("ola!") Programa exemplo 4 #include <stdio.h> #include <conio.h> void main ( ) { int j=0; clrscr(); while( j<10) { printf ( “ olá! ” ); j++; } getch(); } resultado: ola! ola! ola! ola! ola! ola! ola! ola! ola! ola! Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 11 Nesta aplicação, o comando while() fica repetindo a expressão ola enquanto a variável j tem um valor menor que dez (j<10). A cada repetição, j é incrementado de um (j++;), sendo que j inicia com valor zero. Se a variável j fosse igual a 10 (j=10), seria impresso apenas uma vez. Como no comando printf() não há o caracter de controle \n, o resultado é impresso lado a lado. 1.6.7 - FUNÇÃO do { ... } while( ) Permite que uma instrução ou um grupo de instruções seja executado um determinado número de vezes, enquanto uma determinada condição não ocorra. O teste é feito no final do laço. Comando utilizado quando não se conhece o número de interações a ser realizado. Inicialmente são executados os comando que estão entre chaves {...}, e depois é realizado o teste do comando. j=0; do printf("ola!"); j++; while(j<10) Programa exemplo 5 #include <stdio.h> #include <conio.h> void main ( ) { int j=0; clrscr(); do { printf(“ olá!”); j++; } while( j<10); getch(); } resultado: ola! ola! ola! ola! ola! ola! ola! ola! ola! ola! Nesta aplicação, o comando while() fica repetindo a expressão olá enquanto a variável j tem um valor menor que dez ( j<10 ). A cada repetição, j é incrementado de um, sendo que j inicia com valor zero. Se a variável j fosse igual a 10 (j=10), não seria impresso nada. 1.6.8 - FUNÇÃO if ( ){...} ... else{...} Permite executar testes comparativos entre variáveis. if ( x > y) {printf ( “o valor de X é maior que o valor de Y”);} else { printf ( “o valor de Y é menor que o valor de X”);} Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 12 A instrução if( ) compara as variáveis X e Y. Se X é maior que Y, condição verdadeira, as instruções seguintes dentro das chaves {...} são executadas e ignora a opção else. Se o resultado da comparação é que Y é maior que X, a instrução seguinte é ignorada e passa para a instrução else, que será executado o que estiver dentro das chaves {...}. As instruções executadas diretamente pelo if ou else, são identificadas pelo conjunto de chaves. Depois do if( ) e dentro dos parenteses, podem se colocadas quaisquer tipos de comparação. if ... else{...} {...} Programa exemplo: #include <stdio.h> #include <conio.h> void main ( ) { int x =10, y = 5; clrscr(); if ( x > y) {printf ( “\n O valor de X é maior que o valor de Y.”);} else { printf ( “\n O valor de Y é menor que o valor de X.”);} x=5; y=10; if ( x > y) {printf ( “\n Agora o valor de X é maior que o valor de Y.”);} else { printf ( “\n Agora o valor de Y é menor que o valor de X.”);} getch(); } resultado: O valor de X é maior que o valor de Y. Agora o valor de Y é menor que o valor de X. 1.6.9 - FUNÇÃO delay(int) Esta função faz com que o programa pare um determinado tempo. Este valor de tempo é medido em milisegundos (1/1000 segundo), um segundo dividido em mil partes. Para que o programa pare durante meio segundo, deve-se escrever: delay(500);. Esta função pertence ao #include <dos.h>. 1.6.10 - FUNÇÃO double sqrt( double x ) Obtém o resultado da raiz quadrada de um número real de dupla precisão. Também pode ser colocada uma expressão matemática. Do resultado desta expressão será extraída a raiz quadrada, que é um número real de dupla precisão. sqrt( 16 ); Extrai a raiz quadrada do número 16. sqrt( a + b); Extrai a raiz quadrada do resultado da adição das variáveis a e b. 1.6.11 – FUNÇÃO double sin( double x ) (Anexo 1) Resulta no valor do seno de uma variável x, que é um número real de dupla precisão, resultando como valor um número real de dupla precisão. A variável x deve ser o valor do ângulo em radianos. sin(10); obtém o valor do seno de 10 (valor em radianos). Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 15 (x1,y1) (x2,y2) FUNÇÃO circle ( x,y,r ) Permite traçar um circulo, conhecendos-se as coordenadas do centro (x,y) e o valor do raio r. Estes pontos tanto podem ser variáveis do tipo int ou float (figura 1.1). rai o (x,y) FUNÇÃO setcolor( int ) Este comando permite que a cor da linha seja alterada, para isso pode ser passada o nome da cor ou seu numero inteiro (int) correspondente. As cores podem ser indicadas por números ou palavras como descrito a seguir: BLACK BLUE GREEN CYAN RED MAGENTA BROWN LIGHTGRAY DARKGRAY LIGHTBLUE LIGHTGREEN LIGHTCYAN LIGHTRED YELLOW WHITE Comando Cor 14 White Yellow13 12 Light Red Light Cyan11 10 Light Green 9 Light Blue Dark Gray8 Light Gray7 Brown6 Magenta5 4 Red 3 Cyan Green2 Blue1 Black0 # Nome da cor pode-se escrever: setcolor(YELLOW); ou setcolor(14); FUNÇÂO setbkcolor(int) Função que seleciona a cor de fundo da tela. O número inteiro pode ser entre 0 e 15, ou o nome da cor. FUNÇÂO settextstyle(int fnt,int dir,int tc) Esta função permite configurar os valores para os atributos do texto visualizado em tela gráfica. fnt indica o estilo de fonte do texto; dir direção em que a fonte deve ser escrita. Na horizontal ou vertical. tc Tamanho do caracter visualizado na tela Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 16 As tabelas abaixo indicam os valores destas variáveis. # fnt 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 7 TRIPLEX_SCR_FONT Triplex-script 8 COMPLEX_FONT Complex 9 EUROPEAN_FONT European 10 BOLD_FONT Bold # dir Nome Direção 0 HORIZ_DIR Esquerda para a direita 1 VERT_DIR De baixo para cima 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 (bit-mapped) em um retângulo da tela contendo 8x8 pixels 2 Visualização de caracteres da fonte 8x8 (bit-mapped) em um retângulo da tela contendo 16x16 pixels 3 Visualização de caracteres da fonte 8x8 (bit-mapped) em um retângulo da tela contendo 24x24 pixels ...... ............... 10 Visualização de caracteres da fonte 8x8 (bit-mapped) em um retângulo da tela contendo 80x80 pixels FUNÇÃO putpixel(int x, int y, int cor) Função que coloca um pixel na tela nas coordenadas (x,y) e acordo com a cor desejada. FUNÇÃO setlinestyle(int style, unsigned pattern, int thickness) Função de configuração do tipo de linha e da espessura Style – estilo, pode ser dado de acordo c om a tabela abaixo. DescriçãoNome# _ _ _ _ _ _ _..._..._..._ ............... Efeito Linha definida pelo usuárioUSERRBIT_LINE4 Linha tracejadaDASHED_LINE3 Linha tracejada pontilhada2 CENTER_LINE Linha pontilhadaDOTTED_LINE1 Linha cheia0 SOLID_LINE Thickness – espessura, varia com a quantidade de pixels. # Nome Descrição Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 17 1 NORM_WIDTH Espessura de 1 pixel 3 THICK_WIDTH Espessura de 3 pixels FUNÇÃO closegraph( ) Função responsável pela finalização do ambiente gráfico e retorno à tela normal, tela de texto. 1.10 - PROGRAMA PARA O DESENHO DE UMA RETA E UM CÍRCULO O programa a seguir permite executar o desenho de uma reta e de um círculo, onde as coordenadas de cada um podem ser alteradas para verificar os resultados. //Nome do arquivo DESENHA.C #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> //============================================================= void main() //define a funcao principal { //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1); // retorna codigo de erro } //===================== inicia o programa propriamente dito =========== setcolor(YELLOW); //desenha em amarelo line(100,200,400,350); //desenha uma reta setcolor(RED); //desenha em vermelho circle(90,150,50); //desenha um circulo //===================== final do programa propriamente dito ============ getch(); // espera que seja tocada uma tecla closegraph(); //fecha o modo gráfico } //==================== final do arquivo ============================ 1.11 Interpretação do código Este conjunto de instruções abaixo, corresponde a informação ao compilador dos arquivos necessários ao funcionamento do programa #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <dos.h> Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 20 F P D IR E T R IZ (a) (b) Figura 2.1 - Cone truncado por um plano paralelo a uma geratriz; desenho da parábola. 2.1.2 - Elementos de uma prábola Uma parábola é composta por vários elementos. Os mais importantes para o desenvolvimento do problema são descritos a seguir (figura 2.2): a) Diretriz: Reta perpendicular ao eixo. b) Eixo: Segmento de reta que contém o vértice e o foco da parábola. c) Parâmetro: distância da diretriz ao foco. d) Foco (F): centro da curva. d) Vértice (V): ponto de cruzamento da curva com o eixo. e) Raios vetores: distância do foco ao ponto P da curva e da diretriz ao ponto P da curva. Obs.: Numa parábola deve ser observada a seguinte condição de distância entre o ponto P da curva com o foco F e a diretriz. FP = Pdiretriz (figura 2.2). F P diretriz eixo foco vértice raio vetor parâmetro Figura 2.2 - Elementos de uma parábola. 2.1.3 - Processo de traçado A parábola inicia-se com o traçado do eixo e da diretriz, que são perpendiculares entre si (ângulo de 90°). Após, deve-se marcar o vértice (V) da parábola e o foco (F). Sendo que o vértice está localizado no ponto médio da distância entre o foco e a diretriz (figura 2.3 (a)). Como a distância de um ponto (P) da curva ao foco deve ser igual à distância do mesmo ponto (P) à diretriz, deve-se traçar retas paralelas a diretiz a partir do vértice da parábola. A distância entre as paralelas é arbitrária e, de preferência, que sejam iguais para facilitar o traçado. O próximo passo consiste em pegar a distância (d) (figura 2.3(a)) entre a diretriz e a primeira paralela, com o compasso, e colocar a ponta seca do compasso no foco e traçar um arco que corte a primeira paralela. A seguir pegar a distância da diretriz (d1) (figura 2.3(b)) até a segunda paralela. Colocar a ponta seca do compasso no foco e traçar arco para interseptar a segunda paralela, acima e abaixo do eixo. Novamente pegar a distância da diretriz (d2) (figura 2.3(c)) até a terceira paralela. Colocar a ponta seca do compasso no foco e traçar arco para interseptar a terceira paralela, acima e abaixo do eixo. Repetindo este procedimento, obtém-se os pontos por onde passa a parábola. A curva é então traçada a mão (figura 2.3(d)). Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 21 FV d d d FV d d d d1 d1 d1 V F d1 d d1 d d1 d d2 d2 d2 d2 FV d1 d1 d d d2 d1 d d2 (a) (b) (c) (d) Figura 2.3 - Processo de traçado da parábola 2.1.4 - Desenvolvimento do algoritmo Considerando a curva traçada, e analizando um ponto P(x,y) qualquer da curva (figura 2.4), pode- se verificar que a distância X da diretriz até ponto P(x,y), será exatamente a distância do foco F até o ponto P(x,y), onde (X = R). A coordenada Y deste ponto é resultante da dimensão do cateto maior do triângulo, e Dx, o cateto menor, será função da diferença entre a coordenada X e a distância do foco DF (figura 2.4). Assim, a distância do vértice até a diretriz é dada por: DV DF = 2 Dx DF x= −| |, sendo o resultado em módulo. logo, Y R Dx= −2 2 Considerando (xo,yo) como pontos de referência do sistema, tem-se as coordendas dos seguintes pontos: V (xo + DF/2, yo) F (xo + DF, yo) P (x, y) Assim: P(x) = xo + DV + Dx P(y) = yo + Y sendo DeltaX um incremento para descrever a curva. V F X Y R Dx DF xo,yo P(x,y) Figura 2.4 - Modelo geométrico para definição do modelo matemático. 2.1.5 – FLUXOGRAMA LÓGICO DO PROGRAMA Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 22 O fluxograma descreve a lógica do programa, onde os retangulos descrevem as instruções e os losangos os comandos de teste (if()) (figura 2.5). STocou alguma tecla? Desenha um trecho da curva entre dois pontos Calcula a posição do ponto P(x,y) da curva Desenha a diretriz e o eixo incrementa X Armazena coordenadas X e Y controle=1 N S controle>0 N fim Parâmetros da parábola: início Figura 2.5 - Fluxograma do programa parábola. 2.1.6 - O programa básico O programa apresentado a seguir é uma estrutura que servirá para o desenvolvimento de todos os programas deste trabalho. A partir destes conceitos, serão implemtados os programa, sendo acrescentadas novas funções e instruções, e a cada novidade, na evolução de um programa, serão escritos em negrito para salientar. #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> //======================================================== void main()//define a funcao principal { //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 25 yOld=y; // armazena a coordenada Y delay(10); //o programa para por 10 milisegundos } //===================== final do programa propriamente dito ============ getch(); closegraph(); } //==================== final do arquivo ================================== Comentários Nesta outra versão, foi introduzido o comando while( !kbhit( ) ), que faz com que o programa fique num laço até que seja tocada uma tecla para então sair. Os novos includes: #include <math.h> é devido ao uso da função matemática sqrt(). #include <dos.h> é devido ao uso da função matemática delay(). 2.1.9 - O programa parábola - versão 3 Na versão 3, são acrescentadas as funções e variáveis para que seja desenhado ramo abaixo do eixo da parábola (figura 2.6). //PROGRAMA PARABOLA.C #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #include <math.h> //============================================================= float quad(float x) // funcao para elevar ao quadrado um numero aramzenado na variável X { return (x*x); } //============================================================= void main() //define a funcao principal { //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas float xo=50; //coordenada X inicial float yo=240; //coordenada Y inicial float distanciaFocal=30; float focoX=xo+distanciaFocal; //coordenada X do foco float focoY=yo; //coordenada Y do foco float x=xo+(distanciaFocal/2); //coordendada X inicial do ponto P da curva float y=yo; //coordendada Y inicial do ponto P da curva float xOld=x; // armazena a coordenada anterior X float yOld=y; // armazena a coordenada anterior Y float Dx; // Incremento de X float xold=x; // armazena variavel X para desenhar abaixo do eixo float yold=y; // armazena variavel Y para desenhar abaixo do eixo //=================== final das variaveis do programa=========== //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 26 printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== line(xo-50,yo,xo+680,yo); //desenho da diretriz line(xo,yo-240,xo,yo+240); //desenho do eixo circle(focoX,focoY,2); //desenho do foco while(!kbhit( )) { x=x+1; Dx=abs(focoX-x); //calcula Dx y=yo-sqrt(quad(x-xo)-quad(Dx)); //calcula a coordenada Y acima do eixo setcolor(YELLOW); //muda a cor para amarelo line(xOld,yOld,x,y); //desenha um trecho da curva acima do eixo xOld=x; //armazena a coordenada X yOld=y; // armazena a coordenada Y y=yo+sqrt(quad(x-xo)-quad(Dx)); //calcula a coordenada Y abaixo do eixo line(xold,yold,x,y); //desenha a curva abaixo do eixo xold=x; yold=y; delay(10); //o programa para por 10 milisegundos } //===================== final do programa propriamente dito ============ getch(); closegraph(); } //==================== final do arquivo ================================== 2.1.10 - Comentários Após rodar esta versão, experimente alterar o valor das variáveis para os novos valores escritos a seguir: float xo=80; //coordenada X inicial float yo=240; //coordenada Y inicial float distanciaFocal=70; Como resultado, surgirá uma parábola diferente. As variáveis xo e yo, permitem mudar a posição que a parábola será desenhada. A variável distanciaFocal, permite alterar a forma da parábola. Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 27 Figura 2.6 – Desenho resultante na tela. 2.2 - PROGRAMA ELIPSE O programa elipse apresenta o desenho de uma elipse. O algoritimo é desenvolvido baseado no processo dos circulos concêntricos. 2.2.1 - O que é uma elipse Uma elipse é uma curva plana fechada resultante da secção de um cilindro reto por um plano oblíquo a base do cilindro (figura 2.7(a)). Também pode ser obtida pela seção de um cone reto por um plano oblíquo a base (figura 2.7(b)). ELIPSE Figura 2.7 - Obtenção da elipse por secção de um sólido (a) cilindro - (b) cone. 2.2.2 - Elementos de uma elipse Uma elipse possui vários elementos a serem identificados para executar a sua representação gráfica. Aqui são apresentados os mais importantes, que são (figura 2.8): a) Diâmetro maior: Também chamado de eixo maior (distância AB ). b) Diâmetro menor: Também chamado de eixo maior (distância CD). Os diâmetros maior e menor são perpendiculares entre sí. Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 30 Desenha um trecho da curva entre dois pontos Calcula a posição do ponto P(x,y) da curva Desenha os diâmetros e os focos Armazena coordenadas X e Y varia ângulo alfa N início Determina a posição dos focos F1 e F2 Calcula a semi distância focal Parâmetros da elipse: Coordenadas do centro (x0,y0) Diâmetro Maior Diâmetro Menor Focos - F1 e F2 Ponto da curva P(x,y) Tocou alguma tecla? fim S Figura 2.12 - Fluxograma do programa elipse. 2.2.6 - Estrutura básica do programa #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #include <math.h> //======================================================== void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1); // retorna codigo de erro } Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 31 //============= inicia o programa propriamente dito =========== //========== final do programa propriamente dito =========== getch(); closegraph(); }//1 //============= final do arquivo ================ 2.2.7 - Desenvolvimento do programa Versão 1: Na Versão 1 é feito o desenho do diâmetro maior e do menor da elipse, tomando como referência o centro da elipse (cruzamento dos diametros (xo,yo)) Deste modo, para dertminar as duas retas a serem desenhadas a partir do centro tem-se (figura 2.13): A(x) = xo - DiametroMaior/2 A(y) = yo B(x) = xo + DiametroMaior/2 B(y) = yo C(x) = xo C(y) = yo - DiametroMenor/2 D(x) = xo D(y) = yo + DiametroMenor/2 xo,yo A D C B xo+DiametroMaior/2,yo xo-DiametroMaior/2,yo xo,yo-DiametroMenor/2 xo,yo+DiametroMenor/2 Figura 2.13 - Determinação dos vértices da elipse. #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #include <math.h> //============================================================= void main() //define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== int xo=320,yo=240; //coordenadas do centro da elipse int DiametroMaior=400,DiametroMenor=200; //diametros da elipse //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 32 getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== line(xo-DiametroMaior/2,yo,xo+DiametroMaior/2,yo); //tracado do diametro maior line(xo,yo-DiametroMenor/2,xo,yo+DiametroMenor/2); //tracado do dismetro menor //===================== final do programa propriamente dito ============ getch(); closegraph(); }//1 //==================== final do arquivo ================================== Versão 2: Na versão é determinada a posição dos dois focos F1 F2, a partir do centro da elipse. Isto pode ser visto na figura 2.11 e na equação 3. Onde F e F’, podem ser agora denominadas de F1 e F2. F1 = xo - FO (3) F2 = xo + FO (4) Nas respectivas posições, traça-se um círculo para localizar os focos. #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #include <math.h> //============================================================= float dobro(float x) { return( x*x); } //============================================================= void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== int xo=320,yo=240; //coordenadas do centro da elipse int DiametroMaior=400,DiametroMenor=200; //diametros da elipse float SemiDistanciaFocal; //distancia do centro da alipse até o foco float F1,F2; // focos //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 35 Figura 2.14 – Desenho da elipse na tela. 2.3 - PROGRAMA ESPIRAL DE ARQUIMEDES O programa executa o traçado de uma espiral de arquimedes. 2.3.1 - O que é uma Espiral de Arquimedes A espiral de Arquimedes é a trajetória resultante do deslocamento de um ponto (P) com velocidade retilínea uniforme sobre uma reta que possui movimento de rotação uniforme em torno de um centro (figura 2.15). Ponto P(x,y) em translação sobre a reta reta em rotação centro Figura 2.15 - Espiral de Arquimedes. 2.3.2 - Elementos de uma espiral de Arquimedes (figura 2.16) a) Centro: centro de rotação da reta que descreve a espiral b) Espira: uma volta completa da reta que descreve a respiral. c) Passo: distância entre duas espiras. passo espira centro Figura 2.16 - Elementos da espiral de Arquimedes. Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 36 2.3.3 - Processo de traçado Inicia-se com o traçado de uma circunferência que vai determinar uma volta da espiral (uma espira). Divide-se esta circunferência num número de partes iguais (por exemplo 12 - figura 2.17(a)). O raio desta circunferência também deve ser dividido na mesma quantidade em que a circunferência foi dividida. Pelos divisões do raio, serão determinados os pontos por onde a curva passa (figura 2.17(b)). Para determinar os pontos da curva, deve-se traçar um arco que tem o centro da circunferência, e ser traçado no espaço da divisão da circunferência. Para cada nova divisão do raio, traça-se o arco que avança uma divisão da circunferência (figura 2.17(c)). Com a determinação dos pontos, traçar a curva que passa pelos respectivos pontos (figura 2.17(d)). (a) (b) (c) (d) Figura 2.17 - Traçado da espiral de Arquimedes. 2.3.4 - Desenvolvimento do algoritmo Considerando um ponto P(x,y) da espiral (figura 2.18), pode-se deduzir que a coordenada deste ponto é dependente do valor do raio vetor, do ângulo α, e do número de partes analisadas. O raio e o ângulo α são divididos em igual número de partes. Assim, o incremento do raio e do ângulo produrem os movimentos de rotação e translação. Variação do raio: ∆raio raio numeroPartes = raio raio raio= + ∆ Variação do ângulo: ∆α = °360 numeroPartes α α α= + ∆ Posição do ponto P a partir do centro da espiral: x raio= .cosα y raio= .senα Coordenadas a partir da origem do sistema: P(x) = CoordX + x P(y) = CoordY + y α ponto P(x,y) (coordX,coordY) Figura 2.18 - Parâmetros de cálculo da espiral de Arquimedes. Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 37 2.3.5 - O programa #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #include <math.h> //============================================================= void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== float Passo=30; // Passo da espiral - Equivale ao raio da circunferencia de tracado float Dpasso=0.0; //variacao do passo float raio=0.0; // raio de desenho float alfa=0.0; // angulo de posicao float Dalfa=0.0; // incremento do angulo float x,y; // coordenadas do ponto da curva int divisao=24; // numero de divisoes em analise float coordX=320,coordY=240; // coordenadas de posicao do centro da espiral float xo=coordX,yo=coordY; // coordenadas anteriores do ponto da curva //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== Dpasso=Passo/divisao; //calcula o incremento do raio Dalfa=M_PI/divisao; //calcula o incremento do angulo alfa setlinestyle(SOLID_LINE,SOLID_FILL,THICK_WIDTH); setcolor(YELLOW); // especifica a cor amarela para a curva while(!kbhit()) { raio=raio+Dpasso; //incrementa o raio alfa=alfa+Dalfa; //incrementa o angulo alfa x=coordX+raio*cos(alfa); //calcula coordenada X do ponto y=coordY+raio*sin(alfa); //calcula coordenada Y do ponto line(x,y,xo,yo); //desenha a curva xo=x; //armazena a coordenada antiga de X yo=y; //armazena a coordenada antiga de Y delay(50); // tempo de parada } //===================== final do programa propriamente dito ============ getch(); Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 40 Neste programa, é desenvolvido o traçado da falsa espiral de dois centros. #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #include <math.h> //============================================================= void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== int C1x=300,C1y=240; //centro 1 da falsa espiral int C2x,C2y; //centro 2 da falsa espiral int Cx,Cy; //centro da espiral para calculo float distancia=20; //distancia entre centros float Raio=0; // raio de tra'cado float teta=0; // angulo de calculo float Px,Py; // coordenadas da curva float POx,POy; // coordenadas anteriores float Dteta=0; // incremento do angulo float controlaTeta=0; //controle do angulo a cada 180 graus float controlaCentro=1; // controla a alternacia dos centros //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\bc45\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== Dteta=M_PI/36; // incremento do angulo C2x=C1x+distancia; //coordenada X do segundo centro Cx=C1x; //coordenada X do centro generico C2y=Cy=C1y; // coordenada Y do segundo centro e do centro generico POx=C2x; // coordenadas antigas POy=C2y; Raio=Raio+distancia; while(!kbhit()) { if(controlaTeta>M_PI) { controlaTeta=0; Raio=Raio+distancia; if(controlaCentro==1){Cx=C2x;controlaCentro=-1;} else{Cx=C1x;controlaCentro=1;} } circle(C1x,C1y,2); circle(C2x,C2y,2); Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 41 Px=Cx+Raio*cos(teta); Py=Cy+Raio*sin(teta); teta=teta+Dteta; setcolor(YELLOW); line(POx,POy,Px,Py); setcolor(WHITE); POx=Px; POy=Py; controlaTeta=controlaTeta+Dteta; delay(120); } //===================== final do programa propriamente dito ============ getch(); closegraph(); }//1 //==================== final do arquivo ================================== 2.4.6 - Comentários Após digitar o programa, execute para ver os resultados. Pode-se experimentar alterar os valores das variáveis C1x, C2y e distancia. Execute o programa e observe os resultados (figura 2.23). Figura 2.23 – Falsa espiral de dois centros 2.4.8 - Animação Gráfica Neste segundo programa são introduzidos conceitos de animação gráfica, de modo a representar o efeito do fio que está enrolado entre os pontos C1 eC2 e um ponto da curva P(x,y) (figura 2.22). A animação gráfica consiste em desenhar um objeto numa posição, apagar, e redesenhar este mesmo objeto em outra posição ou sob nova configuração. Em computação gráfica, o processo consiste em desenhar um objeto em qualquer cor, diferente da de fundo, redesenhar este objeto na mesma posição, somente que agora deve ser desenhado com a cor da tela de fundo. Após, desenhar o objeto na próxima posição ou configuração com a cor diferente da cor de fundo da tela. Com a repetição deste processo, e com velocidade desejada, pode-se obter o efeito de animação. Há outros processos que podem ser utilizados. #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #include <math.h> //============================================================= void main()//define a funcao principal Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 42 {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== int C1x=300,C1y=240; int C2x,C2y; int Cx,Cy; float distancia=50; float Raio=0,teta=0; float Px,Py; float POx,POy; float Dteta=0; float controlaTeta=0; float controlaCentro=1; int controle=0; // controla o início da animação //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\bc45\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== Dteta=M_PI/36; C2x=C1x+distancia; Cx=C1x; C2y=Cy=C1y; POx=C2x; POy=C2y; Raio=Raio+distancia; while(!kbhit()) { if(controle==1) { setcolor(BLACK); //troca a cor de desemho line(Cx,Cy,POx,POy); //desenha a linha agora com a cor de fundo da tela setcolor(WHITE); //troca a cor de desenho } controle=1; if(controlaTeta>M_PI) { controlaTeta=0; Raio=Raio+distancia; if(controlaCentro==1){Cx=C2x;controlaCentro=-1;} else{Cx=C1x;controlaCentro=1;} } circle(C1x,C1y,2); circle(C2x,C2y,2); Px=Cx+Raio*cos(teta); Py=Cy+Raio*sin(teta); teta=teta+Dteta; Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 45 β α θ= − onde θ =      arctg comprimentoArco Raio O ponto P1(x1,y1) é dado por: P x Raio1( ) .cos= α P y Raio1( ) .sen= α P(x,y) α θ β Raio comprimento do arco P1(x1,y1) raioVetor círculo de base evolvente Figura 2.27 – Especificação do algoritmo. 2.5.5 - O programa – Traçado da evolvente do círculo #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #include <math.h> //============================================================= double quad(double x) //funcao do usuário { return (x*x); } //============================================================= void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== float Raio=20; //raio da circunferencia de base float raioVetor; //raio da curva float x,y; // coordenadas da curva float Dalfa; //incremento do angulo alfa float alfa=0,beta,teta; //angulos float comprimentoArco; float coordX=320,coordY=240; //coordenadas do centro da circunferencia de base float xOld=coordX+Raio,yOld=coordY; // coordenadas anteriores da curva //=================== inicializa ambiente grafico ============== gdriver=DETECT; Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 46 initgraph(&gdriver,&gmode,"c:\\bc45\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== Dalfa=2*M_PI/48; alfa=Dalfa; while(!kbhit()) { circle(coordX,coordY,Raio); //desenha o circulo de base comprimentoArco=Raio*alfa; // calcula o comprimento do arco desenrolado teta=atan(comprimentoArco/Raio); // calcula o angulo teta beta=alfa-teta; // calcula o angulo beta raioVetor=sqrt(quad(comprimentoArco)+quad(Raio)); //calcula o raio maior x=coordX+raioVetor*cos(beta); //determina o ponto X da curva y=coordY+raioVetor*sin(beta); //determina o ponto Y da curva setcolor(YELLOW); line(xOld,yOld,x,y); xOld=x;yOld=y; //armazena as coordenadas anteriores alfa=alfa+Dalfa; // incrementa o angulo alfa delay(100); // tempo de parada } //===================== final do programa propriamente dito ============ getch(); closegraph(); }//1 //================== final do arquivo ============================== 2.5.6 - O programa – Traçado da evolvente do círculo com animação da reta #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #include <math.h> //============================================================= double quad(double x) { return (x*x); } //============================================================= void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 47 float Raio=20; //raio da circunferencia de base float raioVetor; //raio da curva float x,y; // coordenadas da curva float Dalfa; //incremento do angulo alfa float alfa=0,beta,teta; //angulos float comprimentoArco; float coordX=320,coordY=240; //coordenadas do centro da circunferencia de base float xOld=coordX+Raio,yOld=coordY; // coordenadas anteriores da curva float x1=xOld,y1=yOld; // coordenadas do ponto do raio sobre a circunferencia de base int controle=0; //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\bc45\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== Dalfa=2*M_PI/48; alfa=Dalfa; while(!kbhit()) { if(controle==1) { setcolor(BLACK); line(xOld,yOld,x1,y1); setcolor(WHITE); } circle(coordX,coordY,Raio); //desenha o circulo de base x1=coordX+Raio*cos(alfa); //calcula ponto X do raio sobre a circunferencia de base y1=coordY+Raio*sin(alfa); //calcula o ponto Y do raio sobre a circunferencia de base comprimentoArco=Raio*alfa; // calcula o comprimento do arco desenrolado teta=atan(comprimentoArco/Raio); // calcula o angulo teta beta=alfa-teta; // calcula o angulo beta raioVetor=sqrt(quad(comprimentoArco)+quad(Raio)); //calcula o raio maior x=coordX+raioVetor*cos(beta); //determina o ponto X da curva y=coordY+raioVetor*sin(beta); //determina o ponto Y da curva setcolor(RED); line(x,y,x1,y1); setcolor(YELLOW); line(xOld,yOld,x,y); xOld=x;yOld=y; //armazena as coordenadas anteriores alfa=alfa+Dalfa; // incrementa o angulo alfa delay(100); // tempo de parada controle=1; } Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 50 //============================================================= //============================================================= void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== float x1=50,y1=240; float x=x1,y=y1; int Raio=25; float Dx; float xOld=x; int controle=0; //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\bc45\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== Dx=2*M_PI*Raio/24; y=y1-Raio; while(!kbhit()) { if(controle==1) { setcolor(BLACK); circle(xOld,y1-Raio,Raio); setcolor(WHITE); } line(x1,y1,x1+500,y1); circle(x,y1-Raio,Raio); xOld=x; x=x+Dx; controle=1; delay(50); } //===================== final do programa propriamente dito ============ getch(); closegraph(); }//1 //================== final do arquivo ============================== versão 2 – Simulação do movimento de rotação Para isso, é utilizada a representação de um ponto sobre a circinferência que troca de posição produzindo o efeito de rotação. #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #include <math.h> Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 51 //============================================================= //============================================================= void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== float x1=50,y1=240; float x=x1,y=y1; float Raio=25; float Dx; float xOld=x; int controle=0; float cx=x1,cy=y1; float alfa,Dalfa; float cxOld=cx,cyOld=cy; //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\bc45\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== Dx=2*M_PI*Raio/24; y=y1-Raio; Dalfa=M_PI/24; alfa=0; while(!kbhit()) { if(controle==1) { setcolor(BLACK); circle(xOld,y,Raio); circle(cxOld,cyOld,2); setcolor(WHITE); } line(x1,y1,x1+500,y1); circle(x,y,Raio); setcolor(YELLOW); cy=y+Raio*cos(alfa); cx=x-Raio*sin(alfa); circle(cx,cy,2); xOld=x; cxOld=cx; cyOld=cy; x=x+Dx; delay(50); controle=1; alfa=alfa+Dalfa; Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 52 } //===================== final do programa propriamente dito ============ getch(); closegraph(); }//1 //================== final do arquivo ============================== versão 3 – Traçado da curva #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #include <math.h> //============================================================= //============================================================= void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== float x1=50,y1=240; float x=x1,y=y1; float Raio=25; float Dx; float xOld=x; int controle=0; float cx=x1,cy=y1; float alfa,Dalfa; float cxOld=cx,cyOld=cy; //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\bc45\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== Dx=2*M_PI*Raio/24; Dalfa=2*M_PI/24; alfa=0; y=y1-Raio; while(!kbhit()) { if(controle==1) { setcolor(BLACK); circle(xOld,y,Raio); circle(cxOld,cyOld,2); setcolor(WHITE); } line(x1,y1,x1+500,y1); circle(x,y,Raio); Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 55 Para definir os limites, deve-se considerar a bola nas duas posições extremas. Como a bola é representada a partir das coordenadas do centro (x,y) e do raio, estes fatores servirão de elementos para a análise da posição da bola durante o deslocamento. Na figura 2.36, estão representadas as situações. O limite esquerdo, é definido como sendo a distância da origem até a borda do retângulo, e mais o raio da do círculo. O limite direito, a dimensão máxima da tela em X, menos a borda do retângulo e menos o raio da circunferência. Estas duas considerações permitem definir qual a coordenada X limite que deve ser desenhado o círculo. Estas considerações geram as seguintes condições: Se X <=10, então se desloque na direção de X positivo (deslocamento para direita). Se X >= (maxX-10-Raio), então se desloque na direção de X negativo (deslocamento para esquerda). Figura 2.36 – Condições limites na direção X. b) Bola choca-se com o limite superior e inferior Na figura 2.37 estão descritas as situações em que a bola se choca com os limites do retângulo quando esta se desloca na direção vertical. O limite superior, é definido como sendo a distância da origem até a borda do retângulo, e mais o raio da do círculo (figura 2.37). O limite inferior, a dimensão máxima da tela em Y, menos a borda do retângulo e menos o raio da circunferência. Estas duas considerações permitem definir qual a coordenada Y limite que deve ser desenhado o círculo. Estas considerações geram as seguintes condições: Se Y <=10, então se desloque na direção de Y positivo (deslocamento para baixo). Se Y >= (maxY-10-Raio), então se desloque na direção de Y negativo (deslocamento para cima). Figura 2.37 – Condições limites na direção Y. Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 56 Ao se analisar simultaneamente os deslocamento nas direções X e Y, pode-se analisar uma trajetória onde X e Y variam continuamente. A execução do programa para representar esta primeira situação é dividida em etapas, pode-se enumerá-las a seguir: 1) Traçado do limite da tela; 2) Traçado do circulo que representa a bola; 3) Movimento da bola em X; 4) Movimento da bola em Y; 5) Estabelecimento das condições de contorno na direção X; 6) Estabelecimento das condições de contorno na direção Y; A seguir é apresentado o programa básico e após a evolução dos vários passos nos programas. 2.7.4 - PROGRAMA BÁSICO O programa a seguir deve ser copiado integralmente, respeitando se as letras são maiúsculas ou minúsculas. Os caracteres (//) definem que: o que estiver após ele, na respectiva linha, não será interpretado pelo programa. O arquivo a seguir, deve ser salvo como projeto1.c. Versão 1 #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> //============================================================= void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== //===================== final do programa propriamente dito ============ getch(); closegraph(); }//1 //==================== final do arquivo ================================== Ao rodar o programa, aparecerá uma tela escura, pois não foi ainda programado nada. Toque uma tecla para sair do programa. Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 57 2.7.5 - PROGRAMAÇÃO 2.7.6 - DEFINIÇÃO DO ESPAÇO DE MOVIMENTO DA BOLA Para desenhar um retângulo utiliza-se da função (figura 2.38): rectangle(x1,y1,x2,y2) onde x1 e y1 correspondem as coordenadas do primeiro canto do retângulo. As coordenadas x2 e y2 as coordenadas do canto oposto. Figura 2.38 – Definição de um retângulo. Para a situação específica fica assim: Rectangle(10,10,maxX-10,maxY-10) Onde os valores de maxX e maxY, são capturados através das funções getmaxx() e getmaxy(), que retornam as coordenadas máxima da tela. Ao mesmo tempo são criadas duas variáveis para armazenar estes valores, que são: maxX e maxY (figura 2.38). O programa deverá ser complementado com as linhas escritas em negrito. Versão 2 #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> //============================================================= void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas int maxX,maxY; //=================== final das variaveis do programa=========== //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== maxX=getmaxx(); //captura coordenada maxima de X maxY=getmaxy(); //captura coordenada maxima de Y Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 60 { setcolor(BLACK); //pinta de preto circle(xo,yo,Raio); // desenha circulo em preto sobre o existente setcolor(WHITE); // pinta de branco } rectangle(10,10,maxX-10,maxY-10); x=x+valorX; //acrescenta valorX na coordenada X circle(x,y,Raio); xo=x; //armazena a variavel x em xo para poder apagar o desenho yo=y; //armazena a variavel y em yo para poder apagar o desenho controle++; //acrescenta um na variavel controle delay(4); // para o programa por um tempo de 4 milisegundos } //===================== final do programa propriamente dito ============ //getch(); closegraph(); }//1 //==================== final do arquivo ================================== Ao rodar o programa com a inserção das novas linhas, pode-se observar que o círculo se desloca para a direita e some da tela, isto ocorre porque não há limites para estabelecer o fim do movimento. O computador não reconhece o retângulo desenhado como um limite real. É necessário descrever este limite. Faça um teste cancelando toda a função if(), verá que serão desenhados um círculo após o outro, pois o anterior não será apagado. //if(controle>1) // após o primeiro desenho o programa começa apagar //{ //setcolor(BLACK); // define a cor de desenho como preta //circle(xo,yo,R); // desenha o círculo em preto sobre o existente //} Para determinar o limite de deslocamento da bola na direção de X, para a direita, deve-se observar a situação limite que ocorre quando o círculo toca o lado do retângulo (figura 2.40). Nesta condição, deve-se determinar qual é a posição das coordenadas do centro do círculo, pois são elas que controlam o círculo. Versão 5 #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> //============================================================= void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas int maxX,maxY; int x=100,y=100,Raio=25; //coordenadas inicias do circulo int valorX=1,valorY=1; //valor de incremento de deslocamento do circulo int controle=1; //variavel de controle para apagar o circulo int xo,yo; //coordenadas anteriores do centro do circulo //=================== final das variaveis do programa=========== //=================== inicializa ambiente grafico ============== gdriver=DETECT; Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 61 initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== maxX=getmaxx(); //captura coordenada maxima de X maxY=getmaxy(); //captura coordenada maxima de Y while(!kbhit()) //o programa fica dentro do laco at'e uma tecla ser tocada { if(controle>1) { setcolor(BLACK); //pinta de preto circle(xo,yo,Raio); // desenha circulo em preto sobre o existente setcolor(WHITE); // pinta de branco } rectangle(10,10,maxX-10,maxY-10); if(x>=(maxX-10-Raio)){valorX=-1;} // se atingir o lado direito, deve retornar x=x+valorX; //acrescenta valorX na coordenada X circle(x,y,Raio); xo=x; //armazena a variavel x em xo para poder apagar o desenho yo=y; //armazena a variavel y em yo para poder apagar o desenho controle++; //acrescenta um na variavel controle delay(4); // para o programa por um tempo de 4 milisegundos } //===================== final do programa propriamente dito ============ //getch(); closegraph(); }//1 //==================== final do arquivo ================================== Ao rodar o programa, verá que o círculo ao tocar no lado direito do retângulo, imediatamente retornará em sentido contrário, em direção ao lado esquerdo, sendo que continuará indefinidamente, pois não foi estabelecido o respectivo limite. O retorno é feito através do incremento valorX que é –1. Para estabelecer o limite do lado esquerdo, deve-se observar a situação limite (figura 2.40), onde a coordenada X do centro do círculo é definida por: x = 10 + R (figura 2.40), onde se o valor de x for menor que esta coordenada, o círculo deve inverter o sentido de movimento, devido ao incremento valorX que é 1. Versão 6 #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> //============================================================= void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 62 int maxX,maxY; int x=100,y=100,Raio=25; //coordenadas inicias do circulo int valorX=1,valorY=1; //valor de incremento de deslocamento do circulo int controle=1; //variavel de controle para apagar o circulo int xo,yo; //coordenadas anteriores do centro do circulo //=================== final das variaveis do programa=========== //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== maxX=getmaxx(); //captura coordenada maxima de X maxY=getmaxy(); //captura coordenada maxima de Y while(!kbhit()) //o programa fica dentro do laco at'e uma tecla ser tocada { if(controle>1) { setcolor(BLACK); //pinta de preto circle(xo,yo,Raio); // desenha circulo em preto sobre o existente setcolor(WHITE); // pinta de branco } rectangle(10,10,maxX-10,maxY-10); if(x>=(maxX-10-Raio)){valorX=-1;} // se atingir o lado direito, deve retornar if(x<=(10+Raio)){valorX=1;} //se atingir o lado esquerdo, deve retornar x=x+valorX; //acrescenta valorX na coordenada X circle(x,y,Raio); xo=x; //armazena a variavel x em xo para poder apagar o desenho yo=y; //armazena a variavel y em yo para poder apagar o desenho controle++; //acrescenta um na variavel controle delay(4); // para o programa por um tempo de 4 milisegundos } //===================== final do programa propriamente dito ============ //getch(); closegraph(); }//1 //==================== final do arquivo ================================== Para obter o movimento da bola no sentido vertical, deve-se estabelecer os limites e o seu deslocamento. Cancele as condições de deslocamento horizontal e implemente as condições verticais. Versão 7 #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 65 xo=x; //armazena a variavel x em xo para poder apagar o desenho yo=y; //armazena a variavel y em yo para poder apagar o desenho controle++; //acrescenta um na variavel controle delay(4); // para o programa por um tempo de 4 milisegundos } //===================== final do programa propriamente dito ============ //getch(); closegraph(); }//1 //==================== final do arquivo ================================== O resultado após rodar o programa é a obtenção do movimento da bola em um ângulo de 45°. O que é dado pelos valores de valoX=1 e valorY=1. Se os valores das variáveis forem alterados, outras trajetórias serão obtidas. 2.7.8 - IMPLEMENTAÇÃO DA RAQUETE A raquete é representada por um retângulo. Ela terá movimento contínuo entre os lados inferior (y=maxY-10) e superior (y=10) do retângulo, sendo que o seu sentido poderá ser alterado pelo usuário quando desejar (figura 2.36). Para modelar esta situação, considerar o retângulo desenhado a partir da posição x=500 e y=y1 (onde y1 corresponde a uma posição y qualquer). Sendo o comprimento de 50 pixels e a largura de 10 pixels. O retângulo que representa a raquete será então representado por (figura 2.36). figura 2.40 – Limites de deslocamento da raquete. A raquete é então representada por: rectangle(500,y1,505,y1+50) Para ter o controle do sentido de deslocamento da raquete, ou seja, para cima ou para baixo, é necessário implementar as teclas UpKey ( ↑ ) para subir, DownKey ( ↓ ) para descer e da tecla Esc para sair do programa. Para isso são necessárias as seguintes definições: #define UpKey 80 #define DnKey 72 #define EscKey 27 Também é necessário acrescentar as seguintes variáveis do programa: int y1=10; int valorY1=20; int y1o; unsigned char ch; int teste=0; Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 66 A função while(!kbhit()) é substituida pela nova função while(teste= =0), para permitir que ao ser tocada uma tecla, esta seja lida e efetuada a troca do sentido de movimento da raquete. Dentro da condição if(controle>1), é acrescentada a função rectangle(500,y1o,505,y1o+50); para que o retângulo (raquete) seja apagado. if(kbhit()!=0) Esta função é ativada quando uma tecla é tocada, de preferencia se forem uma das definidas DnKey, UpKey ou Esc. { ch=getch(); Esta função faz a leitura da tecla switch(ch) Função que permite a escolha de uma das opções descritas a seguir { case DnKey : valorY1=2; A raquete se desloca para cima dois pixels de cada vez break; case UpKey : valorY1=-2; a raquete se desloca para baixo dois pixels de cada vez break; case EscKey :teste=1; Sai do programa break; } } if(y1<=10){valorY1=1;} Se a raquete atingir esta posição, superior, ela inverte automaticamente o sentido de deslocamento if(y1>=(maxY-60)){valorY1=-1;} Se a raquete atingir esta posição, inferior, ela inverte automaticamente o sentido de deslocamento rectangle(500,y1,505,y1+50); Desenha o retângulo em branco y1o=y1; Guarda a posição do retângulo para depois apagar Para implementar o restante do programa, salve o programa projeto1.c, como projeto2.c. Como resultado, o retângulo se desloca somente para um lado e desaparece da tela. Se cancelar com Esc, e depois rodar novamente, utilize as teclas UpKey ( ↑ ) e DownKey ( ↓ ) para efetuar o controle. Pode-se observar que é possível mudar de direção o deslocamento da raquete. Porém, se deixar, a raquete sumirá da tela. Para isso, é necessário criar os limites verticais da tela para a raquete. Para que o retângulo fique se deslocando continuamente entre os lados superior e inferior do retângulo de contorno, é necessário definir os limites. Para isso são definidas duas condições: if(y1<=10) { valorY1=1;} limite do lado superior if(y1>= (maxY-60)) { valorY1=-1;} limite do lado inferior (ver figura 2.41) sendo valorY1 o incremento a ser dado no movimento da raquete. Veja o programa a seguir como fica. Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 67 Figura 2.41 – Posições extremas da raquete. Versão 9 #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #define UpKey 72 #define DnKey 80 #define EscKey 27 //============================================================= void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas int maxX,maxY; int x=100,y=100,Raio=25; //coordenadas inicias do circulo int valorX=1,valorY=1; //valor de incremento de deslocamento do circulo int controle=1; //variavel de controle para apagar o circulo int xo,yo; //coordenadas anteriores do centro do circulo int y1=10; //posicao inicial da raquete int y1o; //coordenada anterior da raquete int valorY1=1; //incremento de movimento da raquete unsigned char ch; //define uma variavel para receber o sinal do teclado int teste=0; //condicao para entrar no loop //=================== final das variaveis do programa=========== //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== maxX=getmaxx(); //captura coordenada maxima de X Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 70 //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== maxX=getmaxx(); //captura coordenada maxima de X maxY=getmaxy(); //captura coordenada maxima de Y while(teste==0) //o programa fica dentro do laco at'e uma tecla ser tocada { if(controle>1) { setcolor(BLACK); //pinta de preto circle(xo,yo,Raio); // desenha circulo em preto sobre o existente rectangle(500,y1o,505,y1o+50); //desenha a raqute sobre a existente setcolor(WHITE); // pinta de branco } if(y1<=10){valorY1=1;} //se bater no lado superior, inverte descendo if(y1>=(maxY-60)){valorY1=-1;} //se bater no lado inferior, inverte subindo rectangle(10,10,maxX-10,maxY-10); if(x>=(maxX-10-Raio)){valorX=-1;} // se atingir o lado direito, deve retornar para esquerda if(x<=(10+Raio)){valorX=1;} //se atingir o lado esquerdo, deve retornar para direita if(y>=(maxY-10-Raio)){valorY=-1;} //se atingir o lado inferior, retorna para cima if(y<=(10+Raio)){valorY=1;} //se atingir o lado superior, retorna para baixo if(kbhit()) { ch=getch(); switch(ch) { case DnKey: valorY1=1; break; case UpKey: valorY1=-1; break; case EscKey: teste=1; break; } } rectangle(500,y1,505,y1+50); y1o=y1; y1=y1+valorY1; //acrescenta valorY1 na coordenada Y1 x=x+valorX; //acrescenta valorX na coordenada X y=y+valorY; //acrescenta valorY na coordenada Y circle(x,y,Raio); xo=x; //armazena a variavel x em xo para poder apagar o desenho yo=y; //armazena a variavel y em yo para poder apagar o desenho controle++; //acrescenta um na variavel controle Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 71 delay(4); // para o programa por um tempo de 4 milisegundos } //===================== final do programa propriamente dito ============ //getch(); closegraph(); }//1 //==================== final do arquivo ================================== Rodar o programa para obter os resultados. Versão 12 #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #define UpKey 72 #define DnKey 80 #define EscKey 27 //============================================================= void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas int maxX,maxY; int x=100,y=100,Raio=25; //coordenadas inicias do circulo int valorX=1,valorY=1; //valor de incremento de deslocamento do circulo int controle=1; //variavel de controle para apagar o circulo int xo,yo; //coordenadas anteriores do centro do circulo int y1=10; //posicao inicial da raquete int y1o; //coordenada anterior da raquete int valorY1=1; //incremento de movimento da raquete unsigned char ch; //define uma variavel para receber o sinal do teclado int teste=0; //condicao para entrar no loop //=================== final das variaveis do programa=========== //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== maxX=getmaxx(); //captura coordenada maxima de X maxY=getmaxy(); //captura coordenada maxima de Y while(teste==0) //o programa fica dentro do laco at'e uma tecla ser tocada { if(controle>1) { setcolor(BLACK); //pinta de preto Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 72 circle(xo,yo,Raio); // desenha circulo em preto sobre o existente rectangle(500,y1o,505,y1o+50); //desenha a raqute sobre a existente setcolor(WHITE); // pinta de branco } rectangle(10,10,maxX-10,maxY-10); if(x>=(maxX-10-Raio)){valorX=-1;} // se atingir o lado direito, deve retornar para esquerda if(x<=(10+Raio)){valorX=1;} //se atingir o lado esquerdo, deve retornar para direita if(y>=(maxY-10-Raio)){valorY=-1;} //se atingir o lado inferior, retorna para cima if(y<=(10+Raio)){valorY=1;} //se atingir o lado superior, retorna para baixo if(kbhit()) { ch=getch(); switch(ch) { case DnKey: valorY1=1; break; case UpKey: valorY1=-1; break; case EscKey: teste=1; break; } } if((x>=475 && x<=476) && (y>y1) && (y<(y+50))){valorX=-1;} if(y1<=10){valorY1=5;} //se bater no lado superior, inverte descendo if(y1>=(maxY-60)){valorY1=-1;} //se bater no lado inferior, inverte subindo rectangle(500,y1,505,y1+50); y1o=y1; y1=y1+valorY1; //acrescenta valorY1 na coordenada Y1 x=x+valorX; //acrescenta valorX na coordenada X y=y+valorY; //acrescenta valorY na coordenada Y circle(x,y,Raio); xo=x; //armazena a variavel x em xo para poder apagar o desenho yo=y; //armazena a variavel y em yo para poder apagar o desenho controle++; //acrescenta um na variavel controle delay(4); // para o programa por um tempo de 4 milisegundos } //===================== final do programa propriamente dito ============ //getch(); closegraph(); }//1 //==================== final do arquivo ================================== Comentários Este programa apresenta princípios básicos de animação e controle do programa através do teclado. Este jogo simples demonstra claramente a lógica aplicada em computação para a representação de imagens simples. A raquete somente tem efeito quando a bola atinge ela de frente. Pense em como implementar um placar para que o jogador saiba o status do jogo. CAPÍTULO 3 Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 75 Função tangente: tanα = b a Pitágoras : 222 bac += c b a α ANEXO 2 – CÓDIGO DO TECLADO Tecla Retorno Tecla Retorno Tecla Retorno Tecla Retorno 1 2 A 30 N 49 Esc 1 2 3 B 48 O 24 Home 71 3 4 C 46 P 25 End 79 Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 76 4 5 D 32 Q 16 PgUp 73 5 6 E 18 R 19 PgDn 81 6 7 F 33 S 31 Seta Alto 72 7 8 G 34 T 20 Seta Baixo 80 8 9 H 35 U 22 Seta Esquerda 75 9 10 I 23 V 47 Seta Direita 77 0 11 J 36 X 45 Enter 28 K 37 W 17 Tab 15 L 38 Y 21 Barra Espaço 57 M 20 Z 44 Tecla Retorno Tecla Retorno Tecla Retorno Apenas Alt+ Ctrl+ F1 59 F1 104 F1 94 F2 60 F2 105 F2 95 F3 61 F3 106 F3 96 F4 62 F4 107 F4 97 F5 63 F5 108 F5 98 F6 64 F6 109 F6 99 F7 65 F7 110 F7 100 F8 66 F8 111 F8 101 F9 67 F9 112 F9 102 F10 68 F10 113 F10 103 F11 87 F12 88 ANEXO 3 - O AMBIENTE DO TURBO C 3.0 O TURBO C 3.0 é um compilador simples e versátil, ideal para aqueles que pretendem iniciar-se no aprendizado da linguagem C. O objetivo desta seção é passar ao usuário os conhecimentos mínimos necessários para que possa editar, compilar e executar os programas deste livro. Para maiores informações, pode-se utilizar o próprio Help do TURBO C, ou consultar Arakaki, 1990. Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 77 As opções do menu (figura 1) são dispostas horizontalemnte na parte superior do editor. Para desativar um menu basta teclar ESC. Figura 1 – Tela básica do Turbo C 3.0. Na figura 2, a opção ativa do menu é o FILE, o qual abre um menu em cascata que oferece uma série de opções de comando. Os seguintes comandos estão disponíveis: NEW: Carrega no editor um novo arquivo cujo nome é NONAME.CPP; OPEN: Carrega um arquivo na janela de edição. Se o arquivo não existir será criado; SAVE: Salva o arquivo que está sendo editado e, caso o arquivo tenha o nome NONAME.CPP, um novo nome de arquivo será solicitado para o arquivo ser salvo; SAVE AS: Salva o arquivo que está sendo editado com um novo nome a ser especificado; SAVE ALL: Salva o arquivo que está sendo editado; CHANGE DIR: Muda o diretório corrente; PRINT: Imprime o arquivo que está sendo editado; DOS SHELL: Retorna ao sistema operacional sem abandonar o Turbo C; QUIT: Abandona o Turbo C e retorna ao sistema operacional. As opções apresentadas junto aos comandos no menu, podem ser ativadas através das teclas especificadas. Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 80 RUN: Executa o programa; PROGRAM RESET: Cancela o programa em execução; GO TO CURSOR: Executa o programa até o comando onde se encontra o cursor na tela de edição; TRACE INTO: Permite entrar numa função para depurar; STEP OVER: Executa uma função sem depurá-la. Figura 6 – Menu Run Na figura 7, são apresentados alguns comandos do menu COMPILE: COMPILE: Compila o programa verificando os erros; MAKE: Constrói o arquivo executável. Figura 7 – Menu Compile. Na figura 8, são apresentados alguns comandos do menu HELP: Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 81 CONTENTS: Ajuda do do compilador. Basta clicar em cima do texto colorido e teclar Enter. INDEX: Permite efetuar a busca com o nome dos comandos de programação a partir da digitação do nome do comando. Figura 8 – Menu Help. CONSTRUINDO UM PROGRAMA Inicialmente o programa deve ser editado, ou seja, digitado todo o texto que compreende o programa conforme está descrito no livro. Logo após o início da digitação, salvar o arquivo no diretório escolhido com um nome definido. É um bom costume salvar o arquivo de tempos em tempos (tecle F2). Após o arquivo ser todo digitado, salve-o, e tecle Ctrl-F9, ao mesmo tempo. Deste modo o arquivo será compilado e executado. Se o arquivo contiver erros, será apresentada uma janela na parte inferior do editor, que colocando o cursor e clicando sobre uma linha que indica erro, será apresentado no editor o onde está o erro encontrado na compilação. Corrija o erro e rode tecle Ctrl-F9 para compilar o programa novamente. Os erros normalmente são devidos a digitação. Olhe com atenção o que está escrito no programa no livro e o que foi digitado. Podem também ocorrer erros devido ao erro de lógica ou devido a configuração do compilador.
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved