You are on page 1of 81

- LINGUAGEM C INTRODUO PROGRAMAO COM APLICAES GRFICAS

Nilson Luiz Maziero

Passo Fundo, setembro de 2008. SUMRIO

Linguagem C Introduo programao com aplicaes grficas

2008

Introduo........................................................................................................................................ 4 Captulo 1 ........................................................................................................................................ 5 1. Programao ............................................................................................................................... 5 1.1 Conceitos bsicos de programao .......................................................................................... 5 1.2 Tipos de dados .......................................................................................................................... 5 1.3 Operaes aritmticas............................................................................................................... 6 1.4 Operadores relacionais.............................................................................................................. 6 1.5 Operadores de incremento e decremento................................................................................. 6 1.6 Funes bsicas........................................................................................................................ 7 1.6.1 Funo clrscr( )....................................................................................................................... 7 1.6.2 Funo printf( ) ....................................................................................................................... 7 1.6.3 Funo getch( )....................................................................................................................... 7 1.6.4 Funo scanf( )....................................................................................................................... 8 1.6.5 Funo for( ) ........................................................................................................................... 9 1.6.6 Funo while( ) ....................................................................................................................... 10 1.6.7 Funo do while( ) .................................................................................................................. 11 1.6.8 Funo if( )....else ................................................................................................................... 12 1.6.9 Funo delay( ) ....................................................................................................................... 12 1.6.10 Funo sqrt( ) ....................................................................................................................... 13 1.6.11 Funo sin().......................................................................................................................... 13 1.6.12 Funo cos()......................................................................................................................... 13 1.6.13 Funo tan() ......................................................................................................................... 13 1.6.14 Funo atan() ....................................................................................................................... 13 1.7 Construo de funes do usurio............................................................................................ 13 1.8 Interface grfica......................................................................................................................... 14 1.9 Funes grficas ....................................................................................................................... 14 1.10 Programa de desenho de uma reta e um crculo .................................................................... 17 Captulo 2 ........................................................................................................................................ 20 2. Aplicaes ................................................................................................................................... 20 2.1Programa Parbola..................................................................................................................... 20 2.1.1 O que uma parbola ............................................................................................................ 20 2.1.2 Elementos da parbola........................................................................................................... 20 2.1.3 Processo de traado............................................................................................................... 21 2.1.4 Desenvolvimento do algoritimo............................................................................................... 21 2.1.5 Fluxograma............................................................................................................................. 22 2.1.6 O programa bsico ................................................................................................................. 22 2.1.7 O programa parbola verso 1............................................................................................ 23 2.1.8 O programa parbola verso 2............................................................................................ 24 2.1.9 O programa parbola verso 3............................................................................................ 25 2.1.10 Comentrios ......................................................................................................................... 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 crculos concntricos ....................................................................................... 28 2.2.4 Desenvolvimento do algoritimo............................................................................................... 28 2.2.5 Fluxograma do programa ....................................................................................................... 29 2.2.6 Estrutura bsica do programa ................................................................................................ 30 2.2.7 Desenvolvimento do programa............................................................................................... 31 2.2.8 Comentrios ........................................................................................................................... 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 traado............................................................................................................... 36 2.3.4 Desenvolvimento do algoritimo............................................................................................... 36 2.3.5 O programa ............................................................................................................................ 37 2.3.6 Comentrios ........................................................................................................................... 38

Nilson Luiz Maziero

nmaziero@terra.com.br

Linguagem C Introduo programao com aplicaes grficas

2008

2.4 Programa falsa espiral de dois centros ..................................................................................... 38 2.4.1 O que uma falsa espiral de dois centros ............................................................................. 38 2.4.2 Elementos de uma falsa espiral de dois centros .................................................................... 38 2.4.3 Processo de traado............................................................................................................... 39 2.4.4 Desenvolvimento do algoritimo............................................................................................... 39 2.4.5 Desenvolvimento do programa............................................................................................... 40 2.4.7 Comentrios ........................................................................................................................... 41 2.4.8 Animao grfica.................................................................................................................... 41 2.4.9 Comentrios ........................................................................................................................... 43 2.5 Programa evolvente do crculo .................................................................................................. 43 2.5.1 O que uma evolvente do crculo .......................................................................................... 43 2.5.2 Elementos de uma evolvente do crculo................................................................................. 44 2.5.3 Processo de traado............................................................................................................... 44 2.5.4 Desenvolvimento do algoritimo............................................................................................... 44 2.5.5 O programa evolvente do crculo ........................................................................................... 45 2.5.6 Programa de traado da evolvente do crculo com animao da reta ................................... 46 2.5.7 Comentrios ........................................................................................................................... 48 2.6 Programa ciclide regular.......................................................................................................... 48 2.6.1 O que uma ciclide regular.................................................................................................. 48 2.6.2 Elementos de uma ciclide regular ........................................................................................ 48 2.6.3 Processo de traado............................................................................................................... 49 2.6.4 Desenvolvimento do algoritimo............................................................................................... 49 2.6.6 Desenvolvimento do programa............................................................................................... 49 2.7 Jogo de tnis ............................................................................................................................. 53 2.7.1 O problema ............................................................................................................................. 53 2.7.2 Soluo do problema.............................................................................................................. 54 2.7.3 Entendimento da lgica do problema ..................................................................................... 54 2.7.4 Programa bsico .................................................................................................................... 56 2.7.5 Programao .......................................................................................................................... 57 2.7.6 Definio do espao de movimento da bola........................................................................... 57 2.7.7 Animao................................................................................................................................ 59 2.7.8 Implementao da raquete..................................................................................................... 65 Captulo 3 ........................................................................................................................................ 73 3. Desafios....................................................................................................................................... 73 3.1 Problemas a serem resolvidos .................................................................................................. 73 BIBLIOGRAFIA................................................................................................................................ 74 ANEXO 1 Definies matemticas .............................................................................................. 75 ANEXO 2 Cdigo do teclado ....................................................................................................... 76 ANEXO 3 O ambiente do Turbo C ............................................................................................... 77

INTRODUO

Nilson Luiz Maziero

nmaziero@terra.com.br

Linguagem C Introduo programao com aplicaes grficas

2008

Considerando que o aprendizado de um assunto est relacionado ao interesse que o mesmo desperta sobre o indivduo e de como o assunto apresentado. Tambm que imagens servem como atrativos para despertar a curiosidade para o aprendizado. Assim, este trabalho enfoca o uso da computao grfica como objeto de trabalho para a aprendizagem dos princpios de programao em linguagem C. O trabalho inicia com a introduo dos comandos bsicos para a programao em linguagem C; comandos estes utilizados nos programas exemplo apresentados. No a inteno deste trabalho descrever um tratado sobre programao em linguagem C, mas mostrar que possvel e fcil de aprender a programar. Deste modo, os contedos so apresentados na forma de problemas grficos a serem resolvidos, apresentando inicialmente um estudo sobre o problema a ser resolvido e as definies necessrias. Posteriormente, apresentada a soluo matemtica para o problema, independente do programa de computador. Os problemas estudados so os traados de curvas matemticas conhecidas, mas que so analisadas sobre o enfoque grfico, baseando-se nos conceitos de desenho geomtrico. Juntamente com o trabalho, acompanham os programas executveis para que o usurio possa ver os resultados a serem atingidos ao final do desenvolvimento de cada programa. Os programas fontes esto escritos no trabalho, o que obriga o leitor a digit-los, e consequentemente a conhecer os comandos que foram utilizados, complementando assim a forma de aprendizagem. O leitor poder observar que os programas desenvolvidos, podem ser reutilizados posteriormente com algumas alteraes para o problema seguinte. Todos os programas so feitos em linguagem C para o ambiente DOS, onde pode-se utilizar o compilador TURBO C 3.0, encontrado na internet. Para outras informaes e dvidas a rsspeito desta apostila, pode-se contatactar atravs do email nmaziero@terra.com.br.

CAPTULO 1

Nilson Luiz Maziero

nmaziero@terra.com.br

Linguagem C Introduo programao com aplicaes grficas

2008

1 - PROGRAMAO Nos dias atuais, o uso da informtica est em todas as atividades humanas, desde atividades industriais, comerciais, educacionais e at mesmo dentro de nossas casas, onde vrios tipos de equipamentos j a utilizam sem que sejam percebidos. Deste modo, interessante um conhecimento bsico de programao para que o indvduo possa entender este assunto como algo possvel de ser utilizado, e no algo do outro mundo, que somente est acessvel aos indivduos super dotados. Os itens de programao aqui apresentados so aqueles necessrios ao entendimento dos programas apresentados. Deve-se lembrar que a matemtica uma parte muito importante para o entendimento e execuo de um programa de computador.

1.1 - CONCEITOS BSICOS DE PROGRAMAO A programao um conjunto de instrues, descrita numa linguagem que o sistema operacional do computador consegue analisar, e que so executadas sequencialmente, de acordo com o que o programador determinou. Para escrever um programa, necessrio conhecer uma linguagem, onde se utiliza um compilador para transformar o programa escrito numa linguagem compreensvel pelo ser humano, numa linguagem dita linguagem de mquina. Esta linguagem de mquina escrita num formato que o computador consegue entender e processar rapidamente, mas para o ser humano difcil. A linguagem de programao composta por uma srie de comandos, que so ordens para a execuo de determinadas instrues, que so aquelas operaes especficas do programa que o programador descreve para obter um resultado desejado. Alm dos comandos, outro elemento importante so as variveis, que so responsveis pelo armazenamento das informaes, que podem ser numricas (nmeros inteiros, nmeros reais, etc.) e de caracteres (letras e palavras). Na linguagem C, se uma palavra que representa uma varivel escrita em letras minsculas, e a mesma palavra escrita com a letra inicial maiscula, elas so consideradas variveis diferentes. Aps cada instruo de programa, deve ser colocado um ponto e vrgula ( ; ).

1.2 - TIPOS DE DADOS Na linguagem C, h vrios tipos de dados como int, float e char, etc. Os tipos de dados iro definir os tipos de variveis que sero utilizadas no programa, o que feito pelo usurio. A definio das variveis funo especfica dos dados utilizados para resolver o problema. int Define uma varivel que armazena um nmero inteiro. Um nmero inteiro definido como: int num; num uma varivel inteira. int controle = 2; controle uma varivel inteira e armazena o valor 2. float Define uma varivel que armazena um nmero real. Um nmero real definido como: float valores; valores uma varivel real. float numero = 3.23; numero uma varivel real e armazena o valor 3,23. Obs.: Ao escrever um programa com nmero real, a parte inteira separa da parte decimal por um ponto (.), e no uma vrgula (,).

char Define uma varivel que armazena um caracter, que pode ser uma letra um nmero, ou uma cadeia de caracteres, que uma palavra. Um char assim definido: char nome; nome uma varivel que armazena um caracter. char letra = d; letra uma varivel que armazena um caracter e que o d.

Nilson Luiz Maziero

nmaziero@terra.com.br

Linguagem C Introduo programao com aplicaes grficas

2008

char numero = 5; numero uma varivel que armazena um caracter e que o 5. No interpretado como o nmero 5, no podendo ser usado para clculos. char nomes[5] = joao; nomes uma varivel que armazena um vetor de caracteres (cinco posies), mas no mximo quatro caracteres podem ser colocados.

1.3 - OPERAES ARITMTICAS ( = ) Atribuio Este sinal corresponde a atribuir um valor da varivel do lado direito do sinal para a varivel do lado esquerdo. Onde: a = b; a varivel a assume o valor da varivel b, e a varivel b ainda permanece com o referido valor. c = 5; a varivel c passa a armazenar o valor 5. b = c/a; a varivel b passa a assumir o valor da diviso da varivel c pela varivel a. x = y = z; as variveis x e y recebem o valor da varivel z. ( + ) Adio c = a + b; Executa a adio de duas variveis, a e b, que so armazenadas em c. d = a + b + c; Executa a adio de trs variveis, a, b e c, que so armazenadas em d. ( - ) Subtrao c = a - b; Executa a subtrao de uma varivel da outra (a e b), onde o resultado armazenado em c. c = a b - d; Subtrair a varivel b da varivel a, e deste resultado subtrair a varivel d. ( * ) Multiplicao c = a * b; Efetua a multiplicao das duas variveis a e b, sendo o resultado armazenado em c. c = a * b * d; Efetua a multiplicao das trs variveis e o resultado armazenado na varivel c. ( / ) Diviso c = a / b; Efetua a diviso da varivel a pela varivel b, sendo o resultado armazenado na varivel c. No caso da varivel que recebe o resultado de uma operao aritmtica, esta deve ser do tipo que resulta o dado. Uma varivel inteira (int) no pode receber um resultado que uma varivel de ponto flutuante (float), pois a parte fracionria ser suprimida.

1.4 - OPERADORES RELACIONAIS Os operadores relacionais se utilizam para a anlise comparativa entre as variveis. ( > ) maior que (a > b) O valor da varivel a maior que o da varivel b. ( >= ) maior ou igual a ( < ) menor que (a >= b) O valor da varivel a maior ou igual ao da varivel b.

(a < b) O valor da varivel a menor que o da varivel b. (a <= b) O valor da varivel a menor ou igual ao da varivel b.

( <= ) menor ou igual a ( == ) igual ( != ) diferente

(a == b) O valor da varivel a igual ao valor da varivel b. (a != b) O valor da varivel a diferente do valor da varivel b.

1.5 - OPERADORES DE INCREMENTO E DECREMENTO ( ++ ) Operador de incremento. Adiciona uma unidade a varivel inteira j. j++;

Nilson Luiz Maziero

nmaziero@terra.com.br

Linguagem C Introduo programao com aplicaes grficas

2008

( -- )

Operador de decremento. Subtrai uma unidade a varivel inteira j. j--;

1.6 FUNES BSICAS So funes que executam um conjunto de instrues para o programador. Elas fazem parte da linguagem de programao utilizada. Na realidade, em diferentes linguagens de programao, os nomes das funes bsicas so semelhantes. Isto permite extender o aprendizado de uma linguagem para outra. 1.6.1 - FUNO clrscr() Este comando limpa a tela quando no formato texto. O formato texto permite apenas que sejam escritos caracteres na tela. 1.6.2 - FUNO printf ( ) Permite apresentar na tela um resultado, que pode ser um nmero ou uma expresso. De acordo com o tipo de varivel a ser escrita, deve-se especificar na funo o seu formato. Especificao da varivel: %d identifica uma varivel inteira %f identifica uma varivel real %c identifica uma varivel caracter %s identifica uma uma varivel que tem uma seqncia 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 impresso atravs de uma seqncia de caracteres que inicia e termina com aspas. <var1>,<var2>,... so expresses que sero impressas de acordo com a especificao 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 varivel numero um nmero real (float), e imprime o que estiver armazenado na varivel numero. printf ( escreve o numero inteiro: %d \n,numeroInteiro ); onde %d diz que a varivel numeroInteiro representa um nmero inteiro (int). Depois de escrever deve pular para nova linha (\n), e imprime o que estiver armazenado na varivel numeroInteiro. printf ( escreve caracteres: %s ,nome ); onde %s diz que a varivel nome representa um caracter (char) ou uma cadeia de caracteres ( char [ ] ). Escreve sem mudar de linha o que estu\iver armazenado na varivel nome. 1.6.3 - FUNO getch ( ) A funo l um caracter introduzido pelo teclado. Ao encontrar este comando, o programa para esperando que seja introduzido uma informao pelo teclado, por apenas um toque. O valor da tecla capturado pela funo, donde pode-se escrever: char Letra; Letra = getch ( ); O que permite que seja capturado o valor da tecla e transferido para a varivel Letra. Ou simplesmente getch( ); para interromper o programa a espera do toque em uma tecla para continuar. //

Nilson Luiz Maziero

nmaziero@terra.com.br

Linguagem C Introduo programao com aplicaes grficas

2008

A colocao de duas barras em seqncia, interpretado que o que est escrito aps as duas barras, e na mesma linha, no seja interpretado pelo programa. Utiliza-se para a colocao de comentrios no programa, ou o cancelamento de partes do programa que no sero usados mas interessante que estejam no arquivo do programa. Digite o programa a seguir e rode no compilador para ver o resultado (ver anexo 3). Programa exemplo 1 #include <stdio.h> //cabeario necessrio para identificar os comandos utilizados. #include <conio.h> void main() // indica a funo principal { float numero = 3.8; int numeroInteiro = 5; char nome = h; char nomeCompleto[5] =joao; clrscr(); // limpa a tela

printf ( escreve o numero real: %f ,numero ); printf ( \n escreve o numero inteiro: %d ,numeroInteiro ); printf ( \n escreve caracter: %c ,nome ); printf ( \n escreve nome completo: %s ,nomeCompleto ); getch(); } // termino da funcao principal

resultado: escreve o numero real: 3.8 escreve o numero inteiro: 5 escreve o caracter: h escreve nome completo: joao 1.6.4 - FUNO scanf ( ) Permite ler um conjunto de informaes introduzidas pelo teclado. formato: scanf(<formato>,<end1>,<end2>,...); <formato> a especificao semelhante ao printf( ); <end1>,<end2>,... correspondem aos endereos onde os dados devem ser lidos. int num; printf ( tecle um numero); scanf ( %d,&num); (informa o tipo de dado, captura o endereo da varivel) O smbolo & na frente da varivel permite que o programa leia o endereo da memria onde est armazenado o valor da varivel. Programa exemplo 2 #include <stdio.h> #include <conio.h> void main() { float numero; int numeroInteiro; char nome; char nomeCompleto[10]; clrscr(); // limpa a tela
nmaziero@terra.com.br

Nilson Luiz Maziero

Linguagem C Introduo programao com aplicaes grficas

2008

printf ( Digite um numero real: ); scanf ( %f, &numero); printf ( Digite um numero inteiro: ); scanf ( %d, &numeroInteiro); printf ( Digite um caracter: ); nome = getch(); printf ( \n Digite at 9 caracteres : ); scanf ( %s, &nomeCompleto ); printf ( \n\n O numero real e: %f ,numero ); printf ( \n O numero inteiro e: %d ,numeroInteiro ); printf ( \n O caracter e: %c ,nome ); printf ( \n A sequencia de caracteres e: %s ,nomeCompleto ); getch(); } resultado: Digite um numero real: 5.2 ( tecle o nmero 5.2 e tecle Enter) Digite um numero inteiro: 3 (tecle o nmero 3 e tecle Enter) Digite um caracter: a (tecle o caracter a e tecle Enter) Digite ate 9 caracteres: abcdefghi (tecle os caracteres abcdefghi e tecle Enter) O numero real e: 5.2 O numero inteiro e: 3 O caracter e: a A sequencia de 9 caracteres e: abcdefghi 1.6.5 - FUNO for( ) Permite que uma instruo ou um grupo de instrues seja executado um determinado nmero de vezes que especificado. O nmero de vezes que as instrues devem ser executadas deve ser conhecido exatamente. int i; for(i=0;i<10;i++){printf(\nola!);} Esta instruo diz para o comando for executar um lao com o que est dentro das chaves, iniciando o contador i=0; at que o contador i seja menor que dez (i<10), e a cada volta no lao acrescentar o valor um no contador i (i++). A palavra ola! ser escrita dez vezes uma abaixo da outra. O programa exemplo 3 faz com que o valor do contador i seja multiplicado por 2 a cada lao executado eplo comando for( ).

for (i=0; i<10 i++)

printf("\n i*2 = %d",i*2)

Programa exemplo 3 #include <stdio.h> #include <conio.h> void main ( ) { int i;

Nilson Luiz Maziero

nmaziero@terra.com.br

Linguagem C Introduo programao com aplicaes grficas

2008

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 - FUNO while( ){ ... } Permite que uma instruo ou um grupo seja executado um certo nmero de vezes, enquanto uma determinada condio no ocorra. O teste feito no incio do lao. Comando utilizado quando no se conhece o nmero de interaes a ser realizado. O comando testa a condio inicial entre parentesis e se for vlida realiza os comandos que esto entre chaves {...}.

j=0

while(j<10)

printf("ola!")

j++

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!

Nilson Luiz Maziero

nmaziero@terra.com.br

10

Linguagem C Introduo programao com aplicaes grficas

2008

Nesta aplicao, o comando while() fica repetindo a expresso ola enquanto a varivel j tem um valor menor que dez (j<10). A cada repetio, j incrementado de um (j++;), sendo que j inicia com valor zero. Se a varivel j fosse igual a 10 (j=10), seria impresso apenas uma vez. Como no comando printf() no h o caracter de controle \n, o resultado impresso lado a lado. 1.6.7 - FUNO do { ... } while( ) Permite que uma instruo ou um grupo de instrues seja executado um determinado nmero de vezes, enquanto uma determinada condio no ocorra. O teste feito no final do lao. Comando utilizado quando no se conhece o nmero de interaes a ser realizado. Inicialmente so executados os comando que esto 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 aplicao, o comando while() fica repetindo a expresso ol enquanto a varivel j tem um valor menor que dez ( j<10 ). A cada repetio, j incrementado de um, sendo que j inicia com valor zero. Se a varivel j fosse igual a 10 (j=10), no seria impresso nada. 1.6.8 - FUNO if ( ){...} ... else{...} Permite executar testes comparativos entre variveis. 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);}

Nilson Luiz Maziero

nmaziero@terra.com.br

11

Linguagem C Introduo programao com aplicaes grficas

2008

A instruo if( ) compara as variveis X e Y. Se X maior que Y, condio verdadeira, as instrues seguintes dentro das chaves {...} so executadas e ignora a opo else. Se o resultado da comparao que Y maior que X, a instruo seguinte ignorada e passa para a instruo else, que ser executado o que estiver dentro das chaves {...}. As instrues executadas diretamente pelo if ou else, so identificadas pelo conjunto de chaves. Depois do if( ) e dentro dos parenteses, podem se colocadas quaisquer tipos de comparao.

else{...}

if

{...}

...

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 - FUNO delay(int) Esta funo 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 funo pertence ao #include <dos.h>.

1.6.10 - FUNO double sqrt( double x ) Obtm o resultado da raiz quadrada de um nmero real de dupla preciso. Tambm pode ser colocada uma expresso matemtica. Do resultado desta expresso ser extrada a raiz quadrada, que um nmero real de dupla preciso. sqrt( 16 ); Extrai a raiz quadrada do nmero 16. sqrt( a + b); Extrai a raiz quadrada do resultado da adio das variveis a e b. 1.6.11 FUNO double sin( double x ) (Anexo 1) Resulta no valor do seno de uma varivel x, que um nmero real de dupla preciso, resultando como valor um nmero real de dupla preciso. A varivel x deve ser o valor do ngulo em radianos. sin(10); obtm o valor do seno de 10 (valor em radianos).
Nilson Luiz Maziero nmaziero@terra.com.br

12

Linguagem C Introduo programao com aplicaes grficas

2008

sin(a + b); Resulta no valor do seno da soma das variveis a e b. 1.6.12 FUNO double cos( double x ) (Anexo 1) Resulta no valor do cosseno de uma varivel x, que um nmero real de dupla preciso, resultando como valor um nmero real de dupla preciso. A varivel x deve ser o valor do ngulo em radianos. cos(10); obtm o valor do cosseno de 10 (valor em radianos). cos(a + b); Resulta no valor do cosseno da soma das variveis a e b. 1.6.13 FUNO double tan( double x ) (Anexo 1) Resulta no valor da tangente de uma varivel x, que um nmero real de dupla preciso, resultando como valor um nmero real de dupla preciso. A varivel x deve ser o valor do ngulo em radianos. tan(10); obtm o valor da tangente de 10 (valor em radianos). sin(a + b); Resulta no valor do seno da soma das variveis a e b. 1.6.14 FUNO double asin( double x ) Resulta no valor do arco seno de uma varivel x, que um nmero real de dupla preciso, resultando como valor um nmero real de dupla preciso. asin(10); obtm o valor do arco seno de 10, resultando no valor do ngulo em radianos. asin(a + b); Resulta no valor do arco seno da soma das variveis a e b. 1.6.15 FUNO double acos( double x ) Resulta no valor do arco cosseno de uma varivel x, que um nmero real de dupla preciso, resultando como valor um nmero real de dupla preciso. acos(10); obtm o valor do arco cosseno de 10, resultando no valor do ngulo em radianos. acos(a + b); Resulta no valor do arco cosseno da soma das variveis a e b, valor resultante do ngulo em radianos. 1.6.16 FUNO double atan( double x ) Resulta no valor do arco tangente de uma varivel x, que um nmero real de dupla preciso, resultando como valor um nmero real de dupla preciso. atan(10); obtm o valor do arco tangente de 10, resultando no valor do ngulo em radianos. atan(a + b); Resulta no valor do arco seno da soma das variveis a e b, valor resultante do ngulo em radianos. Obs.: Ver no anexo 1, as definies matemticas das funes acima.

1.7 - CONSTRUO DE FUNES DO USURIO So utilizadas quando necessrio repetir em vrios trechos do programa o mesmo conjunto de instrues. Deste modo, este conjunto de instrues transformado numa funo e chamado sempre que necessrio. float quad ( float x) { return ( x * x ); } Esta funo recebe a varivel x, e multiplica por ele mesmo, resultando no quadrado do respectivo nmero, e devolvendo o resultado. A palavra float, antes do nome da funo quad, indica que a funo devolve um valor que um nmero real. A expresso float x, indica que a funo deve receber um valor que um nmero real, que passa para dentro da funo atravs da varivel x. A expresso return, devolve o resultado do que estiver dentro do parentesis. Logo, pode-se escrever: float resultado; resultado = quad (5 );

Onde o resultado o valor de 25.

1.8 - INTERFACE GRFICA A interface grfica permite que sejam executados desenhos atravs do computador. Para isso, a interface deve ser inicializada atravs de algumas instrues adequadas.
Nilson Luiz Maziero nmaziero@terra.com.br

13

Linguagem C Introduo programao com aplicaes grficas

2008

Por exemplo, deve ser colocado um include especial no programa: #include <graphics.h>, que permite que as instrues grficas possam ser interpretadas, transformando a tela para formato grfico. A tela no formato grfico definida como tendo 640x480 pixels, que so pontos na tela que podem ser acesos. O sistema de coordenadas da tela grfica igual ao sistema de coordenadas cartesiano, possuindo os eixos X e Y. Porm, possui algumas alteraes. Por exemplo, a origem est posicionada no canto esquerdo superior, sendo o eixo X positivo da esquerda para a direita. J o eixo Y positivo, de cima para baixo (figura 1.1).
X

ra

io

y1

(x3,y3)

(x1,y1)

reta

x1

640 pixels
Figura 1.1 - Representao da tela grfica. O trecho de programa descrito a seguir, o responsvel pela inicializao do ambiente grfico do compilador C (TURBO C 3.0). Se o teste if(errorcode != grOk), resultar num valor diferente de grOk, que identificou corretamente os arquivos, o programa, emite mensagens a respeito do erro. No caso de erro, normalmente a falta do arquivo egavga.bgi, que possui as informaes grficas. Sendo que o compilador no conhece o caminho (path) de onde ele est. necessrio indicar atravs da seqncia Options-Linker-Libraries e assinalar Graphics Library, no editor do TURBO C.

//=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); //inicializao com a indicao do caminho 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 } //=========================================================

1.9 FUNES GRFICAS Alguns destes comandos so apresentados a seguir: FUNO line (x1,y1,x2,y2 ) Permite o traado de uma reta conhecendo-se as coordenadas do ponto inicial (x1,y1) e do ponto final (x2,y2). Estes pontos tanto podem ser variveis do tipo int ou float (figura 1.1).

480 pixels

(x2,y2)

Nilson Luiz Maziero

nmaziero@terra.com.br

14

Linguagem C Introduo programao com aplicaes grficas

2008

(x2,y2)

(x1,y1)
FUNO circle ( x,y,r ) Permite traar um circulo, conhecendos-se as coordenadas do centro (x,y) e o valor do raio r. Estes pontos tanto podem ser variveis do tipo int ou float (figura 1.1).

io ra
(x,y)

FUNO 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 nmeros ou palavras como descrito a seguir:
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Nome da cor Black Blue Green Cyan Red Magenta Brown Light Gray Dark Gray Light Blue Light Green Light Cyan Light Red Yellow White Comando BLACK BLUE GREEN CYAN RED MAGENTA BROWN LIGHTGRAY DARKGRAY LIGHTBLUE LIGHTGREEN LIGHTCYAN LIGHTRED YELLOW WHITE Cor

pode-se escrever: setcolor(YELLOW); ou setcolor(14); FUNO setbkcolor(int) Funo que seleciona a cor de fundo da tela. O nmero inteiro pode ser entre 0 e 15, ou o nome da cor. FUNO settextstyle(int fnt,int dir,int tc) Esta funo permite configurar os valores para os atributos do texto visualizado em tela grfica. fnt indica o estilo de fonte do texto; dir direo em que a fonte deve ser escrita. Na horizontal ou vertical. tc Tamanho do caracter visualizado na tela

Nilson Luiz Maziero

nmaziero@terra.com.br

15

Linguagem C Introduo programao com aplicaes grficas

2008

As tabelas abaixo indicam os valores destas variveis. # fnt 0 1 2 3 4 5 6 7 8 9 10 Nome DEFAULT_FONT TRIPLEX_FONT SMALL_FONT SANS_SERIF_FONT GOTHIC_FONT SCRIPT_FONT SIMPLEX_FONT TRIPLEX_SCR_FONT COMPLEX_FONT EUROPEAN_FONT BOLD_FONT Fonte de texto Mapa de bits 8x8 Triplex Small Sans-serif Gothic Script Simplex Triplex-script Complex European Bold

# dir 0 1

Nome HORIZ_DIR VERT_DIR

Direo Esquerda para a direita De baixo para cima

Valor de tc 0

1 2 3 ...... 10

Efeito em outtext/outtextxy Ampliao da fonte (stroked) usando fator de ampliao default de caracteres (4) ou o tamanho do caractere definido pelo usurio (dado por setusercharsize) Visualizao de caracteres da fonte 8x8 (bit-mapped) em um retngulo da tela contendo 8x8 pixels Visualizao de caracteres da fonte 8x8 (bit-mapped) em um retngulo da tela contendo 16x16 pixels Visualizao de caracteres da fonte 8x8 (bit-mapped) em um retngulo da tela contendo 24x24 pixels ............... Visualizao de caracteres da fonte 8x8 (bit-mapped) em um retngulo da tela contendo 80x80 pixels

FUNO putpixel(int x, int y, int cor) Funo que coloca um pixel na tela nas coordenadas (x,y) e acordo com a cor desejada.

FUNO setlinestyle(int style, unsigned pattern, int thickness) Funo de configurao do tipo de linha e da espessura Style estilo, pode ser dado de acordo c om a tabela abaixo.
# 0 1 2 3 4 Nome SOLID_LINE DOTTED_LINE CENTER_LINE DASHED_LINE USERRBIT_LINE Descrio Efeito Linha cheia Linha pontilhada ............... Linha tracejada pontilhada ______ Linha tracejada Linha definida pelo usurio _..._..._..._

Thickness espessura, varia com a quantidade de pixels.


# Nome Descrio

Nilson Luiz Maziero

nmaziero@terra.com.br

16

Linguagem C Introduo programao com aplicaes grficas

2008

1 3

NORM_WIDTH THICK_WIDTH

Espessura de 1 pixel Espessura de 3 pixels

FUNO closegraph( ) Funo responsvel pela finalizao do ambiente grfico e retorno tela normal, tela de texto.

1.10 - PROGRAMA PARA O DESENHO DE UMA RETA E UM CRCULO O programa a seguir permite executar o desenho de uma reta e de um crculo, 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 grfico } //==================== final do arquivo ============================

1.11 Interpretao do cdigo Este conjunto de instrues abaixo, corresponde a informao ao compilador dos arquivos necessrios ao funcionamento do programa #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <dos.h>
Nilson Luiz Maziero nmaziero@terra.com.br

17

Linguagem C Introduo programao com aplicaes grficas

2008

A funo void main(), corresponde ao programa propriamente dito. As instrues escritas entre as duas chaves definiro o programa. void main() {//1 ............ ............ }//1 A seguir h um espao onde so definidas as variveis utilizadas no programa para a identificao do ambiente grfico. As variveis so definidas como nmeros inteiros, int. //================= definicao das variaveis ================ int gdriver,gmode,errorcode; //=== variaveis graficas No espao a seguir, esto definidas as variveis utilizadas no programa, isto por uma questo de organizao, pois na linguagem C, as variveis podem ser criadas em qualquer parte do programa. //============ variaveis do programa ====================== //========== final das variaveis do programa ================== O conjunto de instrues a seguir permite inicializar o ambiente grfico, de modo a localizar os arquivos necessrios ao programa. Se forem encontrados os arquivos grficos, o programa funcionar normalmente. Do contrrio apresentar mensagens na tela como estas: Erro do adaptador grafico Falta o arquivo EGAVGA.BGI Pressione alguma tecla para retornar: //========== 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 alguma tecla para retornar:"); getch(); exit(1); // retorna codigo de erro } Neste prximo espao, ser escrito o programa propriamente dito. //============inicia o programa propriamente dito ========== //========== final do programa propriamente dito =============

Nas ltimas linhas, o programa espera que seja tocada qualquer tecla, finalizando o ambiente grfico e o programa. getch(); closegraph(); return 0; }//1 //================ final do arquivo ====================

Nilson Luiz Maziero

nmaziero@terra.com.br

18

Linguagem C Introduo programao com aplicaes grficas

2008

Comentrios: O programa desenha uma reta e um cculo, apresentando o formato de como deve ser escrito um programa grfico. Na primeira linha do programa est escrito: //Nome do arquivo DESENHA.C, que interpretado como um comentrio pelo compilador devido as duas barras inclinadas (//), e apenas indica o nome do programa. Nas linhas a seguir, esto os #include, que especificam os arquivos do compilador C que devem ser agregados ao programa para que o compilador possa interpretar as instrues escritas. As linhas escritas em negrito correspondem ao programa propriamente dito. Resultado Aps rodar o programa, aparecer como resultado o desenho de uma reta em amarelo e de um crculo em vermelho. Experimente alterar o valor das coordenadas nas funes line(), circle() e setcolor(); comparando os resultados obtidos.

CAPTULO 2

2. APLICAES Neste captulo so implementadas as aplicaes grficas que envolvem a definio do problema, busca da soluo, e a soluo final que o programa. 2.1 - PROGRAMA PARBOLA O desenho da parbola a ser desenvolvido baseado no traado grfico que considera que um ponto (P) sobre a parbola possui a mesma distncia ao foco e a diretriz (figura 2.1 (b)). 2.1.1 - O que uma parbola Uma parbola uma curva plana infinita resultante da seo de um cone reto por um plano paralelo a uma das geratrizes (figura 2.1 (a)). A parbola o lugar geomtrico dos pontos de um plano cuja relao entre a distncias de cada ponto P da curva ao foco F e diretriz equidistante (igual) (figura 2.1(b)).

Nilson Luiz Maziero

nmaziero@terra.com.br

19

Linguagem C Introduo programao com aplicaes grficas

2008

DIRETRIZ

(a) (b) Figura 2.1 - Cone truncado por um plano paralelo a uma geratriz; desenho da parbola. 2.1.2 - Elementos de uma prbola Uma parbola composta por vrios elementos. Os mais importantes para o desenvolvimento do problema so descritos a seguir (figura 2.2): a) Diretriz: Reta perpendicular ao eixo. b) Eixo: Segmento de reta que contm o vrtice e o foco da parbola. c) Parmetro: distncia da diretriz ao foco. d) Foco (F): centro da curva. d) Vrtice (V): ponto de cruzamento da curva com o eixo. e) Raios vetores: distncia do foco ao ponto P da curva e da diretriz ao ponto P da curva. Obs.: Numa parbola deve ser observada a seguinte condio de distncia entre o ponto P da curva com o foco F e a diretriz. FP = Pdiretriz (figura 2.2).
P diretriz

raio vetor foco eixo

F vrtice

parmetro

Figura 2.2 - Elementos de uma parbola. 2.1.3 - Processo de traado A parbola inicia-se com o traado do eixo e da diretriz, que so perpendiculares entre si (ngulo de 90). Aps, deve-se marcar o vrtice (V) da parbola e o foco (F). Sendo que o vrtice est localizado no ponto mdio da distncia entre o foco e a diretriz (figura 2.3 (a)). Como a distncia de um ponto (P) da curva ao foco deve ser igual distncia do mesmo ponto (P) diretriz, deve-se traar retas paralelas a diretiz a partir do vrtice da parbola. A distncia entre as paralelas arbitrria e, de preferncia, que sejam iguais para facilitar o traado. O prximo passo consiste em pegar a distncia (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 traar um arco que corte a primeira paralela. A seguir pegar a distncia da diretriz (d1) (figura 2.3(b)) at a segunda paralela. Colocar a ponta seca do compasso no foco e traar arco para interseptar a segunda paralela, acima e abaixo do eixo. Novamente pegar a distncia da diretriz (d2) (figura 2.3(c)) at a terceira paralela. Colocar a ponta seca do compasso no foco e traar arco para interseptar a terceira paralela, acima e abaixo do eixo. Repetindo este procedimento, obtm-se os pontos por onde passa a parbola. A curva ento traada a mo (figura 2.3(d)).

Nilson Luiz Maziero

nmaziero@terra.com.br

20

Linguagem C Introduo programao com aplicaes grficas

2008

d2 d1 d V d F V d d1 d F V d d1 d1 d F V d d1 d1 d

d2

d2

d2

d d1

d d1 d2

d d1 d2

(a)

(b)

(c)

(d)

Figura 2.3 - Processo de traado da parbola 2.1.4 - Desenvolvimento do algoritmo Considerando a curva traada, e analizando um ponto P(x,y) qualquer da curva (figura 2.4), podese verificar que a distncia X da diretriz at ponto P(x,y), ser exatamente a distncia do foco F at o ponto P(x,y), onde (X = R). A coordenada Y deste ponto resultante da dimenso do cateto maior do tringulo, e Dx, o cateto menor, ser funo da diferena entre a coordenada X e a distncia do foco DF (figura 2.4). Assim, a distncia do vrtice at a diretriz dada por:

Dx =| DF x|,

DF 2 2 2 sendo o resultado em mdulo. logo, Y = R Dx DV =

Considerando (xo,yo) como pontos de referncia 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.

P(x,y) X Y R V xo,yo DF
Figura 2.4 - Modelo geomtrico para definio do modelo matemtico.

F Dx

2.1.5 FLUXOGRAMA LGICO DO PROGRAMA

Nilson Luiz Maziero

nmaziero@terra.com.br

21

Linguagem C Introduo programao com aplicaes grficas

2008

O fluxograma descreve a lgica do programa, onde os retangulos descrevem as instrues e os losangos os comandos de teste (if()) (figura 2.5).
incio

Parmetros da parbola:

Desenha a diretriz e o eixo

Tocou alguma tecla?

S fim

N incrementa X

Armazena coordenadas XeY

Calcula a posio do ponto P(x,y) da curva

controle=1

N controle>0

S Desenha um trecho da curva entre dois pontos

Figura 2.5 - Fluxograma do programa parbola. 2.1.6 - O programa bsico O programa apresentado a seguir uma estrutura que servir para o desenvolvimento de todos os programas deste trabalho. A partir destes conceitos, sero implemtados os programa, sendo acrescentadas novas funes e instrues, e a cada novidade, na evoluo de um programa, sero 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");

Nilson Luiz Maziero

nmaziero@terra.com.br

22

Linguagem C Introduo programao com aplicaes grficas

2008

getch(); exit(1);// retorna codigo de erro } //============= inicia o programa propriamente dito =========== //========== final do programa propriamente dito =========== getch(); closegraph(); //fecha o formato grafico } //============= final do arquivo ================

2.1.7 - O programa parbola - verso 1 A verso 1, o programa bsico acrescido das novas instrues para que sejam desenhados a diretriz, o eixo e o foco da parbola. //PROGRAMA PARABOLA.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 float xo=50; //coordenada inicial X cruzamento diretriz-eixo float yo=240; //coordenada inicial Y cruzamento diretriz-eixo float distanciaFocal=30; // DF float focoX=xo+distanciaFocal; //coordenada X do foco float focoY=yo; //coordenada Y do foco //=================== 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 =========== line(xo-50,yo,xo+680,yo); //desenha a diretriz line(xo,yo-240,xo,yo+240); //desenha o eixo circle(focoX,focoY,2); //desenha o foco //===================== final do programa propriamente dito ============ getch(); closegraph();//fecha o formato grafico } //==================== final do arquivo ================================== Comentrios Aps compilar e rodar o programa (ctrl-F9), basta tocar uma tecla para que o mesmo volte para o editor. Neste programa somente apareceu a estrutura para a construo da parbola, o eixo e a diretriz.

Nilson Luiz Maziero

nmaziero@terra.com.br

23

Linguagem C Introduo programao com aplicaes grficas

2008

2.1.8 - O programa parbola - verso 2 Na verso 2, so acrescentadas as funes e variveis para que seja desenhado ramo acima do eixo da parbola. //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 armazenado na varivel 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 //=================== 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 =========== 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 o novo valor de Dx y=yo-sqrt(quad(x-xo)-quad(Dx)); //calcula a coordenada Y acima do eixo setcolor(YELLOW); line(xOld,yOld,x,y); xOld=x; //muda a cor para amarelo //desenha um trecho da curva acima do eixo

//armazena a coordenada X

Nilson Luiz Maziero

nmaziero@terra.com.br

24

Linguagem C Introduo programao com aplicaes grficas

2008

yOld=y; delay(10);

// armazena a coordenada Y //o programa para por 10 milisegundos

} //===================== final do programa propriamente dito ============ getch(); closegraph(); } //==================== final do arquivo ================================== Comentrios Nesta outra verso, foi introduzido o comando while( !kbhit( ) ), que faz com que o programa fique num lao at que seja tocada uma tecla para ento sair. Os novos includes: #include <math.h> devido ao uso da funo matemtica sqrt(). #include <dos.h> devido ao uso da funo matemtica delay(). 2.1.9 - O programa parbola - verso 3 Na verso 3, so acrescentadas as funes e variveis para que seja desenhado ramo abaixo do eixo da parbola (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 varivel 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");

Nilson Luiz Maziero

nmaziero@terra.com.br

25

Linguagem C Introduo programao com aplicaes grficas

2008

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); y=yo-sqrt(quad(x-xo)-quad(Dx));

//calcula Dx //calcula a coordenada Y acima do eixo

setcolor(YELLOW); line(xOld,yOld,x,y); xOld=x; yOld=y;

//muda a cor para amarelo //desenha um trecho da curva acima do eixo

//armazena a coordenada X // armazena a coordenada Y //calcula a coordenada Y abaixo do eixo //desenha a curva abaixo do eixo

y=yo+sqrt(quad(x-xo)-quad(Dx)); line(xold,yold,x,y); 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 - Comentrios Aps rodar esta verso, experimente alterar o valor das variveis 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 parbola diferente. As variveis xo e yo, permitem mudar a posio que a parbola ser desenhada. A varivel distanciaFocal, permite alterar a forma da parbola.

Nilson Luiz Maziero

nmaziero@terra.com.br

26

Linguagem C Introduo programao com aplicaes grficas

2008

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

2.2.1 - O que uma elipse Uma elipse uma curva plana fechada resultante da seco de um cilindro reto por um plano oblquo a base do cilindro (figura 2.7(a)). Tambm pode ser obtida pela seo de um cone reto por um plano oblquo a base (figura 2.7(b)).
ELIPSE

Figura 2.7 - Obteno da elipse por seco de um slido (a) cilindro - (b) cone.

2.2.2 - Elementos de uma elipse Uma elipse possui vrios elementos a serem identificados para executar a sua representao grfica. Aqui so apresentados os mais importantes, que so (figura 2.8): a) Dimetro maior: Tambm chamado de eixo maior (distncia AB ). b) Dimetro menor: Tambm chamado de eixo maior (distncia CD). Os dimetros maior e menor so perpendiculares entre s.

Nilson Luiz Maziero

nmaziero@terra.com.br

27

Linguagem C Introduo programao com aplicaes grficas

2008

c) Vrtices: Extremidades dos dimetros maior e menor (pontos A, B C e D). d) Centro: Interseo dos dimetros maior e menor (ponto O). e) Focos: Centro dos raios vetores. A elipse tem dois focos (F e F). e) Raios vetores: Distncia do foco a um ponto da curva (ponto P). Assim, pode-se escrever: AB = FP + F'P.

A F

B F'

D
Figura 2.8 - Elementos da elipse. 2.2.3 - Processo dos circulos concntricos O processo dos circulos concntricos um dos processos grficos utilizado para desenhar uma elipse com instrumentos (figura 2.9). Os dois circulos concntricos correspondem aos crculos traados tendo como centro o centro da elipse e o raio da circunferncia externa a metade do dimetro maior e o da circunferncia interna a metade do dimetro menor (figura 2.9(a)). O prximo passo corresponde a dividir uma das circunferncias em partes iguais, por exemplo, a maior. A partir de cada diviso, so traados raios que cortam a circunferncia interna (figura 2.9(a)). Traando-se linhas horizontais a partir da interseo dos raios com a circunferncia interna e retas verticais a partir da interseco dos raios com a circunferncia externa, resultam na interseo destas duas retas que resultam num ponto (P) pertencente a elipse (figura 2.9(b)). Realizando este traado para cada diviso, possvel obter uma srie de pontos da elipse. A unio destes pontos resulta no traado da curva (figura 2.9(c)).

(a)

(b)

(c)

Figura 2.9 - Traado da elipse pelo processo dos crculos concntricos.

2.2.4 - Desenvolvimento do algoritmo O algoritmo baseado no processo grfico dos circulos concntricos. Deste modo, deve-se aliar a matemtica e o desenho geomtrico para achar a soluo do problema. Inicialmente, determina-se a posio de um ponto aleatrio da elipse. Pode utilizar-se de um dos pontos determinado pelas divises iguais da circunferncia externa. Na figura 2.10, pode-se observar que a determinao das coordenadas P(x,y) de um ponto qualquer, a partir do centro da elipse, pode ser obtida considerando-se o ngulo (), e a relao dele com os raios das circunferncias interna e externa. Deste modo, fazendo-se variar o ngulo () de um valor conhecido, possvel determinar uma srie de pontos da elipse e efetuar o seu traado.

Nilson Luiz Maziero

nmaziero@terra.com.br

28

Linguagem C Introduo programao com aplicaes grficas

2008

Assim, pode-se calcular as coordenadas do ponto P(x,y) (figura 2.10) atravs das seguintes relaes: x = Raio . cos (1) y = raio . sen (2) P(x)=xo+x P(y)=yo+y

C
Raio
io ra

P(x,y)

D (xo,yo)

Figura 2.10 - Determinao das coordenadas de um ponto da curva. O traado dos raios vetores, que so na realidade os elementos do traado pelo processo do fio, so obtidos unindo cada foco ao ponto da curva em anlise. Para isso, necessrio saber a posio de cada foco que determinado da seguinte forma (figura 2.11):

FO = AO 2 CO 2 (3)
Onde FO denominada de semi-distncia focal (figura 2.11).

C
AO C =F

A F

B F'

Figura 2.11 - Determinao da posio dos focos. 2.2.5 - Fluxograma do programa O fluxograma apresenta a lgica de construo do programa. Inicialmente so definidas as variveis do programa, calculados os parmetros principais e desenvolvida a formulao para o desenho da curva (figura 2.12).

Nilson Luiz Maziero

nmaziero@terra.com.br

29

Linguagem C Introduo programao com aplicaes grficas

2008

incio Parmetros da elipse: Coordenadas do centro (x0,y0) Dimetro Maior Dimetro Menor Focos - F1 e F2 Ponto da curva P(x,y) Calcula a semi distncia focal

Determina a posio dos focos F1 e F2

Tocou alguma tecla?

S fim

N varia ngulo alfa Desenha os dimetros e os focos Armazena coordenadas XeY Calcula a posio do ponto P(x,y) da curva Desenha um trecho da curva entre dois pontos

Figura 2.12 - Fluxograma do programa elipse.

2.2.6 - Estrutura bsica 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 }

Nilson Luiz Maziero

nmaziero@terra.com.br

30

Linguagem C Introduo programao com aplicaes grficas

2008

//============= inicia o programa propriamente dito =========== //========== final do programa propriamente dito =========== getch(); closegraph(); }//1 //============= final do arquivo ================

2.2.7 - Desenvolvimento do programa Verso 1: Na Verso 1 feito o desenho do dimetro maior e do menor da elipse, tomando como referncia 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 B(x) = xo + DiametroMaior/2 C(x) = xo D(x) = xo A(y) = yo B(y) = yo

C(y) = yo - DiametroMenor/2 D(y) = yo + DiametroMenor/2

xo,yo-DiametroMenor/2 xo+DiametroMaior/2,yo

A xo-DiametroMaior/2,yo

xo,yo

D xo,yo+DiametroMenor/2

Figura 2.13 - Determinao dos vrtices 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");

Nilson Luiz Maziero

nmaziero@terra.com.br

31

Linguagem C Introduo programao com aplicaes grficas

2008

getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== line(xo-DiametroMaior/2,yo,xo+DiametroMaior/2,yo); line(xo,yo-DiametroMenor/2,xo,yo+DiametroMenor/2); //tracado do diametro maior //tracado do dismetro menor

//===================== final do programa propriamente dito ============ getch(); closegraph(); }//1 //==================== final do arquivo ==================================

Verso 2: Na verso determinada a posio dos dois focos F1 F2, a partir do centro da elipse. Isto pode ser visto na figura 2.11 e na equao 3. Onde F e F, podem ser agora denominadas de F1 e F2. F1 = xo - FO (3) F2 = xo + FO (4) Nas respectivas posies, traa-se um crculo 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 ===========
Nilson Luiz Maziero nmaziero@terra.com.br

32

Linguagem C Introduo programao com aplicaes grficas

2008

//calculo da semi distancia focal SemiDistanciaFocal=sqrt( dobro(DiametroMaior/2)-dobro(DiametroMenor/2) ); //posicao dos focos no eixo X F1=xo-SemiDistanciaFocal; F2=xo+SemiDistanciaFocal; //desenho dos focos circle(F1,yo,2); //posio do foco circle(F2,yo,2); //posio do foco 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 ==================================

Verso 3: Nesta verso, executado o traado da elipse, sendo esta executada atravs de pequenas retas. A metodologia utilizada para determinar as coordenadas da curva, est explicada no desenvolvimento do algoritmo, nas equaes 1 e 2.

#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 float SemiDistanciaFocal; // Distancia do centro da elipse at o foco float F1,F2; //posicao dos focos no eixo X float Dalfa,alfa=0; float xOld,yOld; //pontos anteriores int x,y; //pontos 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

Nilson Luiz Maziero

nmaziero@terra.com.br

33

Linguagem C Introduo programao com aplicaes grficas

2008

} //===================== inicia o programa propriamente dito =========== //calculo da semi distancia focal SemiDistanciaFocal=sqrt( dobro(DiametroMaior/2)-dobro(DiametroMenor/2) ); //posicao dos focos no eixo X F1=xo-SemiDistanciaFocal; F2=xo+SemiDistanciaFocal; //desenho dos focos circle(F1,yo,2); circle(F2,yo,2); Dalfa=M_PI/36; xOld=xo+DiametroMaior/2; yOld=yo; //divide a circunferencia em 72 partes // coordenada X inicial // coordenada Y inicial

setlinestyle(SOLID_LINE,SOLID_FILL,THICK_WIDTH); while(!kbhit()) { setcolor(WHITE); line(xo-DiametroMaior/2,yo,xo+DiametroMaior/2,yo); line(xo,yo-DiametroMenor/2,xo,yo+DiametroMenor/2); alfa=alfa-Dalfa; x=xo+(DiametroMaior/2)*cos(alfa); y=yo+(DiametroMenor/2)*sin(alfa); setcolor(YELLOW); line(xOld,yOld,x,y); xOld=x; yOld=y;

//tracado do diametro maior //tracado do dismetro menor

// calculas as coordenadas X // calculas as coordenadas Y // Desenha a elipse

//armazenas pontos anteriores //armazenas pontos anteriores

delay(40); //tempo de retardo } //===================== final do programa propriamente dito ============ getch(); closegraph(); }//1 //==================== final do arquivo ==================================

Basta rodar o programa e ver a formao de uma elipse pelo processo dos crculos concntricos (figura 2.14).

2.2.8 - Comentrios Aps rodar esta verso, experimente alterar o valor das variveis para os novos valores escritos a seguir: float DiametroMaior=200,DiametroMenor=400; Como resultado, surgir uma elipse em posiao diferente. As variveis xo e yo, permitem mutar a posio que a elipse ser desenhada. Experimente alterar DiametroMaior=300 e DiametroMenor=300.

Nilson Luiz Maziero

nmaziero@terra.com.br

34

Linguagem C Introduo programao com aplicaes grficas

2008

Figura 2.14 Desenho da elipse na tela.

2.3 - PROGRAMA ESPIRAL DE ARQUIMEDES O programa executa o traado de uma espiral de arquimedes. 2.3.1 - O que uma Espiral de Arquimedes A espiral de Arquimedes a trajetria resultante do deslocamento de um ponto (P) com velocidade retilnea uniforme sobre uma reta que possui movimento de rotao uniforme em torno de um centro (figura 2.15).
centro
Ponto P(x,y) em translao sobre a reta

reta em rotao

Figura 2.15 - Espiral de Arquimedes. 2.3.2 - Elementos de uma espiral de Arquimedes (figura 2.16) a) Centro: centro de rotao da reta que descreve a espiral b) Espira: uma volta completa da reta que descreve a respiral. c) Passo: distncia entre duas espiras.
centro

espira

passo

Figura 2.16 - Elementos da espiral de Arquimedes.

Nilson Luiz Maziero

nmaziero@terra.com.br

35

Linguagem C Introduo programao com aplicaes grficas

2008

2.3.3 - Processo de traado Inicia-se com o traado de uma circunferncia que vai determinar uma volta da espiral (uma espira). Divide-se esta circunferncia num nmero de partes iguais (por exemplo 12 - figura 2.17(a)). O raio desta circunferncia tambm deve ser dividido na mesma quantidade em que a circunferncia foi dividida. Pelos divises do raio, sero determinados os pontos por onde a curva passa (figura 2.17(b)). Para determinar os pontos da curva, deve-se traar um arco que tem o centro da circunferncia, e ser traado no espao da diviso da circunferncia. Para cada nova diviso do raio, traa-se o arco que avana uma diviso da circunferncia (figura 2.17(c)). Com a determinao dos pontos, traar a curva que passa pelos respectivos pontos (figura 2.17(d)).

(a)

(b)

(c)

(d)

Figura 2.17 - Traado 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 nmero de partes analisadas. O raio e o ngulo so divididos em igual nmero de partes. Assim, o incremento do raio e do ngulo produrem os movimentos de rotao e translao. Variao do raio:

raio =

raio numeroPartes 360 numeroPartes

raio = raio + raio

Variao do ngulo:

= +
x = raio.cos

Posio do ponto P a partir do centro da espiral: Coordenadas a partir da origem do sistema: P(x) = CoordX + x P(y) = CoordY + y

y = raio.sen

ponto P(x,y)

Figura 2.18 - Parmetros de clculo da espiral de Arquimedes.

(coordX,coordY)

Nilson Luiz Maziero

nmaziero@terra.com.br

36

Linguagem C Introduo programao com aplicaes grficas

2008

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; alfa=alfa+Dalfa;

//incrementa o raio //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; yo=y; //armazena a coordenada antiga de X //armazena a coordenada antiga de Y

delay(50); // tempo de parada } //===================== final do programa propriamente dito ============ getch();

Nilson Luiz Maziero

nmaziero@terra.com.br

37

Linguagem C Introduo programao com aplicaes grficas

2008

closegraph(); }//1 //================= final do arquivo ==============================

2.3.6 - Comentrios O desenho obtido da espiral de Arquimedes est na figura 2.19. Aps rodar o programa, experimente alterar o valor de algumas variveis iniciais como: Passo=60; divisao=4;

Figura 2.19 Desenho da Espiral de Arquimedes na tela.


2.4 - PROGRAMA FALSA ESPIRAL DE DOIS CENTROS 2.4.1 - O que uma falsa espiral de dois centros Uma falsa espiral de dois centros resultante da trajetria do movimento de um ponto em torno de dois ou mais centros, produzindo um movimento no uniforme. Considerando dois centros alinhados, e que um fio est enrolado nos dois pontos, ao serem desenrolado o fio e mantendo-o esticado, a trajetria da extremidade resulta na falsa espiral de dois centros. Se o fio estiver enrolado em torno de um polgono (mais de dois centros) resultar numa outra espiral (figura 2.20).

C1

R1

Figura 2.20 Falsa espiral de dois centros 2.4.2 - Elementos de uma falsa espira de dois centros a) Centro b) Espira c) Passo d) Ncleo 2.4.3 - Processo de traado

R3

C2

R2

Nilson Luiz Maziero

nmaziero@terra.com.br

38

Linguagem C Introduo programao com aplicaes grficas

2008

Inicia-se com o traado a reta que passa pelos pontos P1 e P2 (figura 2.21), os quais determinam o centro da espiral (figura 2.21(a)). O traado da espiral feito considerando que enrolado um fio flexvel em torno dos pontos P1 e P2, feito o enrolamento no sentido horrio, sendo que a ponta do fio coincide com o ponto P2. O traado da espiral corresponde ao desenrolamento do fio no sentido anti-horrio (figura 2.21(b)), o que produz o arco descrito pelo raio R1. Que inicia no ponto P2, centro no pomnto P1, e termina no prolongamento da reta que passa pelos pontos P1 e P2. Como o fio vai desenrolando, o centro de traado do arco R2 (figura 2.21( c)) passa a ser o ponto P2. O arco traado at atingir o prolongamento da reta que passa pelos pontos P1 e P2. No momento em que o arco atinge esta reta, o centro do arco passa novamente para o ponto P1. O arco de Raio R3 (figura 2.21(d)), possui agora o centro em P1, e traado de modo semelhante ao arco de raio R1. Se este processo for repedido, obtm-se o traado de uma falsa espiral de dois centros.

R3

R1

C1

C2

C1

C2

C1
R2

C2

C1

R1

C2

R2

(a)

(b)

(c)

(d)

Figura 2.21 Traado da falsa espiral de dois centros.

2.4.4 - Desenvolvimento do algoritmo O desenvolvimento do algoritmo corresponde a interpretao do traado descrito anteriormente. A determinao do ponto P(x,y) corresponde ao ponto da curva necessrio ao traado da mesma. Para isso necessrio determinar as coordenadas do ponto P(x,y) para cada trecho de 180, sendo que para cada trecho, o raio deve ser alterado e o centro de rotao tambm (figura 2.22). Para o trecho de 0 a 180, o centro C1 e o raio R1. Para 0< <180 P1(x)=C1(x) + R1.cos P2(y)= C1(y) + R1.sen Para 180< <360 P1(x)=C2(x) + R2.cos P2(y)= C2(y) + R2.sen

Assim alternando a cada 180 o deslocamento do centro de rotao.


P1(x,y)

R1

C1 C2
R2

C1

C2

P2(x,y)

Figura 2.22 desenvolvimento do algoritmo. 2.4.5 - Desenvolvimento do programa

Nilson Luiz Maziero

nmaziero@terra.com.br

39

Linguagem C Introduo programao com aplicaes grficas

2008

Neste programa, desenvolvido o traado 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);

Nilson Luiz Maziero

nmaziero@terra.com.br

40

Linguagem C Introduo programao com aplicaes grficas

2008

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 - Comentrios Aps digitar o programa, execute para ver os resultados. Pode-se experimentar alterar os valores das variveis 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 - Animao Grfica Neste segundo programa so introduzidos conceitos de animao grfica, 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 animao grfica consiste em desenhar um objeto numa posio, apagar, e redesenhar este mesmo objeto em outra posio ou sob nova configurao. Em computao grfica, o processo consiste em desenhar um objeto em qualquer cor, diferente da de fundo, redesenhar este objeto na mesma posio, somente que agora deve ser desenhado com a cor da tela de fundo. Aps, desenhar o objeto na prxima posio ou configurao com a cor diferente da cor de fundo da tela. Com a repetio deste processo, e com velocidade desejada, pode-se obter o efeito de animao. 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

Nilson Luiz Maziero

nmaziero@terra.com.br

41

Linguagem C Introduo programao com aplicaes grficas

2008

{//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 incio da animao //=================== 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); line(Cx,Cy,POx,POy); setcolor(WHITE); } controle=1;

//troca a cor de desemho //desenha a linha agora com a cor de fundo da tela //troca a cor de desenho

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;
Nilson Luiz Maziero nmaziero@terra.com.br

42

Linguagem C Introduo programao com aplicaes grficas

2008

setcolor(YELLOW); line(POx,POy,Px,Py); setcolor(RED); line(Cx,Cy,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.9 - Comentrios Nesta verso final, o programa apresenta o desenho do traado da falsa espiral de dois centros, e apresenta o raio vetor se movimentando, como se fosse um fio enrolado entre o centro da falsa espiral, como descrito no traado. Experimente cancelar o seguinte trecho: /*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 }*/ Salve o programa e rode para observar o que acontece.

2.5 - PROGRAMA EVOLVENTE DO CRCULO 2.5.1 - O que uma evolvente do crculo A evolvente do crculo a curva resultante da trajetria de um ponto que est sobre uma reta, sendo que esta reta rola tangente, e sem escorregar, em torno de um crculo estacionrio (figura 2.24). Esta curva utilizada na construo do perfil de dentes de engrenagens.
EVOLVENTE

CRCULO DE BASE

P(x,y)

RETA

Figura 2.24 Desenho de uma evolvente do crculo. 2.5.2 - Elementos de uma evolvente do crculo a) Crculo de base: Crculo sobre o qual a reta rola para gerar a evolvente do crculo (figura 2.25).

Nilson Luiz Maziero

nmaziero@terra.com.br

43

Linguagem C Introduo programao com aplicaes grficas

2008

EVOLVENTE

CRCULO DE BASE

P(x,y)

FIO ESTICADO

Figura 2.25 Considerando um fio esticado. 2.5.3 - Processo de traado Como o movimento da reta em torno do crculo um movimento uniforme, para se determinar os pontos da curva necessrio interromper este movimento de modo a determinar a posio do ponto em anlise a cada instante. Para isso se determinam pontos de anlise para o traado. Assim, primeiramente a circunferncia de base dividida num determinado nmero de partes, sendo que quanto maior, maior a preciso do traado (figura 2.65(a)). Se imaginarmos esta reta a partir de um fio enrolado em torno do da circunferncia de base sendo desenrolado e mantido esticado, pode-se ver que ele ser tangente a circunferncia, e que seu comprimento extamente igual ao comprimento do arco de circunferncia ao qual estava enrolado. A partir das divises da circunferncia, so traadas retas tangentes (figura 2.26(a)). Sobre as tangentes so marcados os comprimentos dos arcos, igual ao comprimento do arco entre cada diviso (figura 2.26(b)). A unio dos pontos extremos sobre as tangentes, com uma curva, resulta na evolvente do crculo Figura 2.26(c)).

(a)

(b)
Figura 2.26 Traado da evolvente do crculo.

(c)

2.5.4 - Desenvolvimento do algoritmo O algoritmo deve determinar as coordendas do ponto P(x,y) para que possa ser traada a evolvente do crculo (figura 2.27).

P ( x ) = raioVetor .cos

P ( y ) = raioVetor .sen

raioVetor =

( comprimntoArco) 2 + ( Raio) 2

comprimentoArco = Raio.
sendo o ngulo que varia em funo do problema.

Nilson Luiz Maziero

nmaziero@terra.com.br

44

Linguagem C Introduo programao com aplicaes grficas

2008

onde

= arctg

comprimentoArco Raio

O ponto P1(x1,y1) dado por:

P1( x ) = Raio.cos

P1( y ) = Raio.sen
crculo de base

raioVetor

P(x,y)
evolvente

Raio

P1(x1,y1)

comprimento do arco

Figura 2.27 Especificao do algoritmo.

2.5.5 - O programa Traado da evolvente do crculo #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #include <math.h> //============================================================= double quad(double x) //funcao do usurio { 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;

Nilson Luiz Maziero

nmaziero@terra.com.br

45

Linguagem C Introduo programao com aplicaes grficas

2008

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; alfa=alfa+Dalfa; delay(100); //armazena as coordenadas anteriores // incrementa o angulo alfa // tempo de parada

} //===================== final do programa propriamente dito ============ getch(); closegraph(); }//1 //================== final do arquivo ==============================

2.5.6 - O programa Traado da evolvente do crculo com animao 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===========

Nilson Luiz Maziero

nmaziero@terra.com.br

46

Linguagem C Introduo programao com aplicaes grficas

2008

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); x1=coordX+Raio*cos(alfa); y1=coordY+Raio*sin(alfa); //desenha o circulo de base //calcula ponto X do raio sobre a circunferencia de base //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; alfa=alfa+Dalfa; delay(100); controle=1; } //armazena as coordenadas anteriores // incrementa o angulo alfa // tempo de parada

Nilson Luiz Maziero

nmaziero@terra.com.br

47

Linguagem C Introduo programao com aplicaes grficas

2008

//===================== final do programa propriamente dito ============ getch(); closegraph(); }//1 //================== final do arquivo ==============================

2.5.7 - Comentrios Realize alterao no valor das variveis para verificar o tipo de resultado nos desenhos.

Figura 2.28 Evolvente do crculo.

2.6 - PROGRAMA CICLIDE REGULAR 2.6.1 - O que uma ciclide regular Chama-se ciclide a curva descrita por um ponto fixo num crculo mvel que rola sem escorregar sobre uma reta (figura 2.29). 2.6.2 - Elementos de uma ciclide regular (figura 2.29) a) Crculo gerador: Crculo que rola sem escorregar sobre a reta diretora. b) Reta diretora: reta onde o circulo gerador rola.

circulo gerador

.D

reta diretora

Figura 2.29 Ciclide regular. 2.6.3 Processo de traado O traado iniciado com o desenho de um crculo de dimetro D (figura 2.30). De de uma reta com o comprimento da circunferncia (D), tangente a este crculo. Aps deve-se dividir o crculo em partes iguais, neste caso em 12 partes.
Nilson Luiz Maziero nmaziero@terra.com.br

48

Linguagem C Introduo programao com aplicaes grficas

2008

A partir de cada diviso sobre a circunferncia, traar retas horizontais e paralelas a reta que possui o comprimento.

.D
Figura 2.30 Traado inicial da ciclide regular.

.D

A reta que passa pelo centro do circuloo deve ser dividida em 12 partes iguais. Pegando o compasso com o raio do crculo diretor, deve-se coloc-lo em cada marcao e traar um arco sobre uma linha horizontal, simulando o deslocamento do crculo. A unio destes pontos resulta numa ciclide regular.

.D
Figura 2.31 - Traado final da ciclide regular.

.D

2.6.4 - Desenvolvimento do algoritmo O ponto (x1,y1) (figura 2.32) corresponde ao ponto inial do traado da curva bemcomo o ponto de refencia para o desenvolvimento do algoritmo. O ponto (Cx,Cy) corresponde a um ponto qualquer que esta sobre o crculo que rola sobre a reta sem escorregar. Na realidade, corresponde a posio de uma das 12 divises do crculo.

(x,y) (Cx,Cy)

(x1,y1)

Figura 2.32 Coordenadas do ponto da ciclide regular.

2.6.5 - Desenvolvimento do programa Verso 1 Animao do deslocamento do crculo sobre a reta #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #include <math.h>

Nilson Luiz Maziero

nmaziero@terra.com.br

49

Linguagem C Introduo programao com aplicaes grficas

2008

//============================================================= //============================================================= 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 ==============================

verso 2 Simulao do movimento de rotao Para isso, utilizada a representao de um ponto sobre a circinferncia que troca de posio produzindo o efeito de rotao. #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #include <math.h>

Nilson Luiz Maziero

nmaziero@terra.com.br

50

Linguagem C Introduo programao com aplicaes grficas

2008

//============================================================= //============================================================= 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;

Nilson Luiz Maziero

nmaziero@terra.com.br

51

Linguagem C Introduo programao com aplicaes grficas

2008

} //===================== final do programa propriamente dito ============ getch(); closegraph(); }//1 //================== final do arquivo ==============================

verso 3 Traado 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);

Nilson Luiz Maziero

nmaziero@terra.com.br

52

Linguagem C Introduo programao com aplicaes grficas

2008

setcolor(YELLOW); cy=y+Raio*cos(alfa); cx=x-Raio*sin(alfa); circle(cx,cy,2); line(cx,cy,cxOld,cyOld); xOld=x; cxOld=cx; cyOld=cy; x=x+Dx; controle=1; delay(50); alfa=alfa+Dalfa; } //===================== final do programa propriamente dito ============ getch(); closegraph(); }//1 //================== final do arquivo ==============================

Figura 2.33 - ciclide regular. 2.7 - JOGO DE TENIS 2.7.1 - O PROBLEMA O problema a ser resolvido consiste da construo de um jogo. Neste jogo tem-se uma bola que se desloca com velocidade constante e que se movimenta em trajetria retilnea at atingir um obstculo. Um obstculo pode ser o limite do jogo (tela do computador delimitada por um retngulo), ou um objeto interno ao retngulo, que representa uma raquete para rebater a bola (figura 2.34). A raquete ter movimento vertical em dois sentidos (para cima e para baixo) continuamente, sendo que o jogador poder alterar o sentido de deslocamento atravs do teclado(,). No momento em que a raquete atingir o limite superior ou inferior, o sentido de deslocamento dever inverter, deslocando-se at o prximo limite, ou at que seja indicada outra ao. Ao atingir um obstculo, a bola deve se deslocar numa direo a 90 a partir da trajetria que originou o choque com obstculo (figura 2.34). Considerar que no h interferncia do atrito e da energia cintica com relao ao choque.

Nilson Luiz Maziero

nmaziero@terra.com.br

53

Linguagem C Introduo programao com aplicaes grficas

2008

Figura 2.34 - Ilustrao do problema. 2.7.2 - SOLUO DO PROBLEMA A soluo do problema passa por quatro etapas bsicas: a) Entendimento da lgica do problema; b) Soluo matemtica em funo das condies de contorno; c) Fluxograma da soluo; d) Programao da soluo do problema. A resoluo ser feita em etapas, sendo construdo o programa medida que determinadas situaes so descritas e resolvidas, de modo a se tornar interessante, no ficando enfadonha toda a demonstrao de uma teoria. 2.7.3 - ENTENDIMENTO DA LGICA DO PROBLEMA A lgica de funcionamento do problema pode ser analisada em partes. Deste modo, so apresentadas a seguir as situaes limites da bola com relao ao limite do jogo. a) Bola choca-se com o limite esquerdo e direito Ocorre quando uma determinada situao fsica se apresenta. Deve-se saber, que a tela representada por pixels, pontos que so acesos ou apagados durante o programa para representar as informaes grficas. Para executar um desenho, deve-se conhecer as coordenadas onde ser realizada a representao grfica. Deste modo, na figura 2.35, est representado o princpio da representao do sistema de coordenadas, onde a origem, se situa no canto esquerdo superior da tela. O sentido do eixo +X representado da esquerda para a direita. O sentido +Y representado de cima para baixo. Assim, o canto esquerdo superior a origem (0,0) e canto direito inferior, designado como (maxX,maxY), sendo os respectivos valores das variveis dependentes do nmero de pixels da tela (p. exe: 640x480 pixels). Para representar internamente um retngulo, necessrio conhecer-se as coordenadas de dois de seus vrtices. Assim o canto esquerdo superior foi definido com (10,10), e o canto direito inferior (maxX-10,maxY-10), mantendo uma margem constante de dez pixels em volta.

Figura 2.35 Definio dos limites da tela.

Nilson Luiz Maziero

nmaziero@terra.com.br

54

Linguagem C Introduo programao com aplicaes grficas

2008

Para definir os limites, deve-se considerar a bola nas duas posies extremas. Como a bola representada a partir das coordenadas do centro (x,y) e do raio, estes fatores serviro de elementos para a anlise da posio da bola durante o deslocamento. Na figura 2.36, esto representadas as situaes. O limite esquerdo, definido como sendo a distncia da origem at a borda do retngulo, e mais o raio da do crculo. O limite direito, a dimenso mxima da tela em X, menos a borda do retngulo e menos o raio da circunferncia. Estas duas consideraes permitem definir qual a coordenada X limite que deve ser desenhado o crculo. Estas consideraes geram as seguintes condies: Se X <=10, ento se desloque na direo de X positivo (deslocamento para direita). Se X >= (maxX-10-Raio), ento se desloque na direo de X negativo (deslocamento para esquerda).

Figura 2.36 Condies limites na direo X. b) Bola choca-se com o limite superior e inferior Na figura 2.37 esto descritas as situaes em que a bola se choca com os limites do retngulo quando esta se desloca na direo vertical. O limite superior, definido como sendo a distncia da origem at a borda do retngulo, e mais o raio da do crculo (figura 2.37). O limite inferior, a dimenso mxima da tela em Y, menos a borda do retngulo e menos o raio da circunferncia. Estas duas consideraes permitem definir qual a coordenada Y limite que deve ser desenhado o crculo. Estas consideraes geram as seguintes condies: Se Y <=10, ento se desloque na direo de Y positivo (deslocamento para baixo). Se Y >= (maxY-10-Raio), ento se desloque na direo de Y negativo (deslocamento para cima).

Figura 2.37 Condies limites na direo Y.

Nilson Luiz Maziero

nmaziero@terra.com.br

55

Linguagem C Introduo programao com aplicaes grficas

2008

Ao se analisar simultaneamente os deslocamento nas direes X e Y, pode-se analisar uma trajetria onde X e Y variam continuamente. A execuo do programa para representar esta primeira situao dividida em etapas, pode-se enumer-las a seguir: 1) Traado do limite da tela; 2) Traado do circulo que representa a bola; 3) Movimento da bola em X; 4) Movimento da bola em Y; 5) Estabelecimento das condies de contorno na direo X; 6) Estabelecimento das condies de contorno na direo Y; A seguir apresentado o programa bsico e aps a evoluo dos vrios passos nos programas. 2.7.4 - PROGRAMA BSICO O programa a seguir deve ser copiado integralmente, respeitando se as letras so maisculas ou minsculas. Os caracteres (//) definem que: o que estiver aps ele, na respectiva linha, no ser interpretado pelo programa. O arquivo a seguir, deve ser salvo como projeto1.c. Verso 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 no foi ainda programado nada. Toque uma tecla para sair do programa.

Nilson Luiz Maziero

nmaziero@terra.com.br

56

Linguagem C Introduo programao com aplicaes grficas

2008

2.7.5 - PROGRAMAO 2.7.6 - DEFINIO DO ESPAO DE MOVIMENTO DA BOLA Para desenhar um retngulo utiliza-se da funo (figura 2.38): rectangle(x1,y1,x2,y2) onde x1 e y1 correspondem as coordenadas do primeiro canto do retngulo. As coordenadas x2 e y2 as coordenadas do canto oposto.

Figura 2.38 Definio de um retngulo. Para a situao especfica fica assim: Rectangle(10,10,maxX-10,maxY-10) Onde os valores de maxX e maxY, so capturados atravs das funes getmaxx() e getmaxy(), que retornam as coordenadas mxima da tela. Ao mesmo tempo so criadas duas variveis para armazenar estes valores, que so: maxX e maxY (figura 2.38). O programa dever ser complementado com as linhas escritas em negrito. Verso 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

Nilson Luiz Maziero

nmaziero@terra.com.br

57

Linguagem C Introduo programao com aplicaes grficas

2008

rectangle(10,10,maxX-10,maxY-10); //===================== final do programa propriamente dito ============ getch(); closegraph(); }//1 //==================== final do arquivo ================================== Ao rodar este programa, dever aparecer o desenho de um retngulo na tela. A seguir toque qualquer tecla para o programa terminar. Para desenhar um crculo na tela, utiliza-se da funo circle(x,y,r), onde x e y correspondem as coordenadas do centro do crculo, e r o raio do crculo. Deste modo sero acrescentadas novas informaes no programa que so o desenho do crculo e as variveis x=100, y=100 e R=25. Isto permite desenhar o crculo numa posio especfica da tela (figura 2.39).

Figura 2.39 Definio do crculo. Verso 3 #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; //=================== 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

Nilson Luiz Maziero

nmaziero@terra.com.br

58

Linguagem C Introduo programao com aplicaes grficas

2008

rectangle(10,10,maxX-10,maxY-10); circle(x,y,Raio); //===================== final do programa propriamente dito ============ getch(); closegraph(); }//1 //==================== final do arquivo ================================== Aps salvar, ao rodar o programa dever aparecer o desenho do respectivo crculo.

2.7.7 - ANIMAO A animao pode ser obtida atravs do processo de desenhar e apagar o desenho, e redesenhlo em outra posio. No computador, o processo de apagar corresponde a pintar o desenho da mesma cor da tela de fundo. Para isso so implementadas algumas seqncias a serem seguidas. Deve-se cancelar a funo getch(). A funo while() permite que o programa fique executando as instrues que esto dentro do lao, at que uma condio especfica ocorra, neste caso, uma tecla seja tocada. Verso 4 #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; 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)

Nilson Luiz Maziero

nmaziero@terra.com.br

59

Linguagem C Introduo programao com aplicaes grficas

2008

{ 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 insero das novas linhas, pode-se observar que o crculo se desloca para a direita e some da tela, isto ocorre porque no h limites para estabelecer o fim do movimento. O computador no reconhece o retngulo desenhado como um limite real. necessrio descrever este limite. Faa um teste cancelando toda a funo if(), ver que sero desenhados um crculo aps o outro, pois o anterior no ser apagado. //if(controle>1) // aps o primeiro desenho o programa comea apagar //{ //setcolor(BLACK); // define a cor de desenho como preta //circle(xo,yo,R); // desenha o crculo em preto sobre o existente //} Para determinar o limite de deslocamento da bola na direo de X, para a direita, deve-se observar a situao limite que ocorre quando o crculo toca o lado do retngulo (figura 2.40). Nesta condio, deve-se determinar qual a posio das coordenadas do centro do crculo, pois so elas que controlam o crculo. Verso 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;

Nilson Luiz Maziero

nmaziero@terra.com.br

60

Linguagem C Introduo programao com aplicaes grficas

2008

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;} x=x+valorX; 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 crculo ao tocar no lado direito do retngulo, imediatamente retornar em sentido contrrio, em direo ao lado esquerdo, sendo que continuar indefinidamente, pois no foi estabelecido o respectivo limite. O retorno feito atravs do incremento valorX que 1. Para estabelecer o limite do lado esquerdo, deve-se observar a situao limite (figura 2.40), onde a coordenada X do centro do crculo definida por: x = 10 + R (figura 2.40), onde se o valor de x for menor que esta coordenada, o crculo deve inverter o sentido de movimento, devido ao incremento valorX que 1. Verso 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
Nilson Luiz Maziero nmaziero@terra.com.br

// se atingir o lado direito, deve retornar

//acrescenta valorX na coordenada X

61

Linguagem C Introduo programao com aplicaes grficas

2008

int maxX,maxY; int x=100,y=100,Raio=25; int valorX=1,valorY=1; int controle=1; int xo,yo;

//coordenadas inicias do circulo //valor de incremento de deslocamento do circulo //variavel de controle para apagar o circulo //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 condies de deslocamento horizontal e implemente as condies verticais. Verso 7 #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h>
Nilson Luiz Maziero nmaziero@terra.com.br

62

Linguagem C Introduo programao com aplicaes grficas

2008

#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; 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 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 //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 ==================================

Nilson Luiz Maziero

nmaziero@terra.com.br

63

Linguagem C Introduo programao com aplicaes grficas

2008

O resultado obtido o deslocamento da bola somente no sentido vertical dentro dos limites do retngulo. O prximo passo liberara as linhas do cancelamento para o sistema funcionar completamente, com a bola se deslocando em 45 e chocando-se contra as paredes. Verso 8 #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; 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 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 x=x+valorX; //acrescenta valorX na coordenada X y=y+valorY; //acrescenta valorY na coordenada Y circle(x,y,Raio);
Nilson Luiz Maziero nmaziero@terra.com.br

64

Linguagem C Introduo programao com aplicaes grficas

2008

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 aps rodar o programa a obteno do movimento da bola em um ngulo de 45 . O que dado pelos valores de valoX=1 e valorY=1. Se os valores das variveis forem alterados, outras trajetrias sero obtidas.

2.7.8 - IMPLEMENTAO DA RAQUETE A raquete representada por um retngulo. Ela ter movimento contnuo entre os lados inferior (y=maxY-10) e superior (y=10) do retngulo, sendo que o seu sentido poder ser alterado pelo usurio quando desejar (figura 2.36). Para modelar esta situao, considerar o retngulo desenhado a partir da posio x=500 e y=y1 (onde y1 corresponde a uma posio y qualquer). Sendo o comprimento de 50 pixels e a largura de 10 pixels. O retngulo que representa a raquete ser ento representado por (figura 2.36).

figura 2.40 Limites de deslocamento da raquete. A raquete ento 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, necessrio implementar as teclas UpKey ( ) para subir, DownKey ( ) para descer e da tecla Esc para sair do programa. Para isso so necessrias as seguintes definies: #define UpKey 80 #define DnKey 72 #define EscKey 27 Tambm necessrio acrescentar as seguintes variveis do programa: int y1=10; int valorY1=20; int y1o; unsigned char ch; int teste=0;

Nilson Luiz Maziero

nmaziero@terra.com.br

65

Linguagem C Introduo programao com aplicaes grficas

2008

A funo while(!kbhit()) substituida pela nova funo 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 condio if(controle>1), acrescentada a funo rectangle(500,y1o,505,y1o+50); para que o retngulo (raquete) seja apagado. if(kbhit()!=0) Esta funo ativada quando uma tecla tocada, de preferencia se forem uma das definidas DnKey, UpKey ou Esc. { ch=getch(); Esta funo faz a leitura da tecla switch(ch) Funo que permite a escolha de uma das opes 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 posio, superior, ela inverte automaticamente o sentido de deslocamento if(y1>=(maxY-60)){valorY1=-1;} Se a raquete automaticamente o sentido de deslocamento atingir esta posio, inferior, ela inverte

rectangle(500,y1,505,y1+50); Desenha o retngulo em branco y1o=y1; Guarda a posio do retngulo para depois apagar

Para implementar o restante do programa, salve o programa projeto1.c, como projeto2.c. Como resultado, o retngulo 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 possvel mudar de direo o deslocamento da raquete. Porm, se deixar, a raquete sumir da tela. Para isso, necessrio criar os limites verticais da tela para a raquete. Para que o retngulo fique se deslocando continuamente entre os lados superior e inferior do retngulo de contorno, necessrio definir os limites. Para isso so definidas duas condies: 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.

Nilson Luiz Maziero

nmaziero@terra.com.br

66

Linguagem C Introduo programao com aplicaes grficas

2008

Figura 2.41 Posies extremas da raquete. Verso 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
Nilson Luiz Maziero nmaziero@terra.com.br

67

Linguagem C Introduo programao com aplicaes grficas

2008

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 raquete 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; } } 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 ================================== Agora, a raquete fica limitada regio do retngulo. Para determinar a posio de choque da bola com a raquete, necessrio fixar as condies de quando e como ocorrer o choque. O choque ocorrer, considerando que a bola se desloca da esquerda para a direita, quando ela estiver a uma distncia do raio com relao a raquete, ou seja, 475 pixels (figura 2.42). No sentido vertical, deve-se considerar que a bola somente colidir com a raquete se as duas estiverem em posio adequada. Isto pode ser visto na figura 2.42, onde o centro da bola deve estar

Nilson Luiz Maziero

nmaziero@terra.com.br

68

Linguagem C Introduo programao com aplicaes grficas

2008

abaixo da posio y1, e tambm acima da posio (y1+50). Se isto ocorrer, a bola deve retornar no sentido contrrio do deslocamento em x. Deste modo pode ser escrita seguinte expresso. if((x>=475 && x<= 476) && (y>=y1) && (y<=y1+50)){valorX=-1;} Esta condio especifica que o centro do crculo (x,y) deva estar entre as coordenadas do lado da raquete (figura 2.42).

Figura 2.42 Posies de controle da bola em relao a raquete. Verso 10 #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===========

Nilson Luiz Maziero

nmaziero@terra.com.br

69

Linguagem C Introduo programao com aplicaes grficas

2008

//=================== 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
Nilson Luiz Maziero nmaziero@terra.com.br

70

Linguagem C Introduo programao com aplicaes grficas

2008

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

Nilson Luiz Maziero

nmaziero@terra.com.br

71

Linguagem C Introduo programao com aplicaes grficas

2008

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 ================================== Comentrios Este programa apresenta princpios bsicos de animao e controle do programa atravs do teclado. Este jogo simples demonstra claramente a lgica aplicada em computao para a representao 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. CAPTULO 3

Nilson Luiz Maziero

nmaziero@terra.com.br

72

Linguagem C Introduo programao com aplicaes grficas

2008

3. DESAFIOS O objetivo deste captulo apresentar uma srie de problemas que podem ser resolvidos utilizando os conhecimentos adquiridos no estudo, para instigar o leitor a prosseguir nos estudos.

3.1 PROBLEMAS A SEREM RESOLVIDOS O objetivo desta lista de problemas, instigar o leitor para os desafios de utilizar os conhecimentos adquiridos no estudo do contedo apresentado. A metodologia a ser utilizada, deve ser a mesma apresentada no livro, que acredito se adequar ao referido estudo. Partes dos programas desenvolvidos podem ser utilizadas nas solues, o que torna mais rpida a programao, mtodo muito utilizado de copiar partes j desenvolvidas em outros programas.

PROBLEMA 1: Desenvolver o programa de traado de uma hiprbole. PROBLEMA 2: Desenvolver o programa de traado de uma ciclide alongada. PROBLEMA 3: Desenvolver o programa de traado de uma ciclide encurtada. PROBLEMA 4: Desenvolver o programa de traado de uma epiciclide alongada. PROBLEMA 5: Desenvolver o programa de traado de uma epiciclide encurtada. PROBLEMA 6: Desenvolver o programa de traado de uma hipociclide encurtada. PROBLEMA 7: Desenvolver o programa de traado de uma hipociclide alongada. PROBLEMA 8: Desenvolver o programa de traado de uma de uma parbola com a animao do desenho dos raios vetores. PROBLEMA 9: Programa de animao para o processo de traado do raios vetores para a elipse. PROBLEMA 10: Desenvolver o programa para o traado de uma hipociclide regular PROBLEMA 11: Melhorar o programa jogo de tnis: a) Incluir o deslocamento para a esquerda e para a direita da rquete; b) um contador de pontos para cada vez que a bola bate no lado direito da tela.

BIBLIOGRAFIA Arakaki, Reginaldo; Arakaki, Julio;Angerami, Paulo Mattos; Aoki, Osvaldo Luis; Salles, Djalma de Souza;.-2.ed.-Rio de Janeiro:LTC-Livros Tcnicos e Cientficos Ed.,1990. Carvalho, Benjamin de A.. Desenho Geomtrico. Editora Ao Livro Tcnico. So Paulo, 19..

Nilson Luiz Maziero

nmaziero@terra.com.br

73

Linguagem C Introduo programao com aplicaes grficas

2008

Fechine, J. Machado, Queiroz, Jos E. R. Grficos em C usando Turbo C 3.0. Notas de aula. Janurio, Antnio Jaime. Desenho Geomtrico. Florianpolis: Ed. da UFSC, 2000. Mizrahi, Victorine Viviane. Treinamento em linguagem C. So Paulo: McGraw-Hill, 1990. Rangel, Alcyr Pinheiro. Curvas. Universidade Federal do Rio de Janeiro, Rio de Janeiro,1982.

ANEXO 1 DEFINIES MATEMTICAS


Funo seno:

sen = cos =

b c a c
nmaziero@terra.com.br

Funo cosseno:

Nilson Luiz Maziero

74

Linguagem C Introduo programao com aplicaes grficas

2008

Funo tangente:

tan =

b a

Pitgoras :

c2 = a2 + b2

b a

ANEXO 2 CDIGO DO TECLADO

Tecla 1 2 3

Retorno 2 3 4

Tecla A B C

Retorno 30 48 46

Tecla N O P

Retorno 49 24 25

Tecla Esc Home End

Retorno 1 71 79

Nilson Luiz Maziero

nmaziero@terra.com.br

75

Linguagem C Introduo programao com aplicaes grficas

2008

4 5 6 7 8 9 0

5 6 7 8 9 10 11

D E F G H I J K L M

32 18 33 34 35 23 36 37 38 20

Q R S T U V X W Y Z

16 19 31 20 22 47 45 17 21 44

PgUp PgDn Seta Alto Seta Baixo Seta Esquerda Seta Direita Enter Tab Barra Espao

73 81 72 80 75 77 28 15 57

Tecla Apenas F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12

Retorno 59 60 61 62 63 64 65 66 67 68 87 88

Tecla Alt+ F1 F2 F3 F4 F5 F6 F7 F8 F9 F10

Retorno 104 105 106 107 108 109 110 111 112 113

Tecla Ctrl+ F1 F2 F3 F4 F5 F6 F7 F8 F9 F10

Retorno 94 95 96 97 98 99 100 101 102 103

ANEXO 3 - O AMBIENTE DO TURBO C 3.0

O TURBO C 3.0 um compilador simples e verstil, ideal para aqueles que pretendem iniciar-se no aprendizado da linguagem C. O objetivo desta seo passar ao usurio os conhecimentos mnimos necessrios para que possa editar, compilar e executar os programas deste livro. Para maiores informaes, pode-se utilizar o prprio Help do TURBO C, ou consultar Arakaki, 1990.

Nilson Luiz Maziero

nmaziero@terra.com.br

76

Linguagem C Introduo programao com aplicaes grficas

2008

As opes do menu (figura 1) so dispostas horizontalemnte na parte superior do editor. Para desativar um menu basta teclar ESC.

Figura 1 Tela bsica do Turbo C 3.0. Na figura 2, a opo ativa do menu o FILE, o qual abre um menu em cascata que oferece uma srie de opes de comando. Os seguintes comandos esto disponveis: NEW: Carrega no editor um novo arquivo cujo nome NONAME.CPP; OPEN: Carrega um arquivo na janela de edio. Se o arquivo no 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 diretrio 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 opes apresentadas junto aos comandos no menu, podem ser ativadas atravs das teclas especificadas.

Nilson Luiz Maziero

nmaziero@terra.com.br

77

Linguagem C Introduo programao com aplicaes grficas

2008

Figura 2 Menu File Na figura 3, esto localizados os comandos da janela do editor. Estes comandos permitem movimentar a tela. O cursor pode ser movimentado atravs das teclas de seta.

Figura 3 Comandos da janela. Na figura 4 est representado o arquivo NONAME01.CPP aberto para a edio.

Nilson Luiz Maziero

nmaziero@terra.com.br

78

Linguagem C Introduo programao com aplicaes grficas

2008

Figura 4 Editor criado atravs do new. Na figura 5 tem-se: No menu EDIT, tem-se os seguintes comandos: UNDO: Retorna a ultima edio; REDO: Avana uma edio eliminada; CUT: Retira um trecho do texto marcado;

COPY: Copia um trecho de texto marcado; PASTE: CLEAR: Cola em posio indicada no trecho de texto cortado como comando CUT; Elimina um trecho de texto marcado;

Figura 5 Menu Edit. Na figura 6, tem-se: No menu RUN, tem-se os seguintes comandos:

Nilson Luiz Maziero

nmaziero@terra.com.br

79

Linguagem C Introduo programao com aplicaes grficas

2008

RUN: Executa o programa; PROGRAM RESET: Cancela o programa em execuo; GO TO CURSOR: Executa o programa at o comando onde se encontra o cursor na tela de edio; TRACE INTO: Permite entrar numa funo para depurar; STEP OVER: Executa uma funo sem depur-la.

Figura 6 Menu Run Na figura 7, so apresentados alguns comandos do menu COMPILE: COMPILE: Compila o programa verificando os erros; MAKE: Constri o arquivo executvel.

Figura 7 Menu Compile. Na figura 8, so apresentados alguns comandos do menu HELP:

Nilson Luiz Maziero

nmaziero@terra.com.br

80

Linguagem C Introduo programao com aplicaes grficas

2008

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 programao a partir da digitao 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 aps o incio da digitao, salvar o arquivo no diretrio escolhido com um nome definido. um bom costume salvar o arquivo de tempos em tempos (tecle F2). Aps 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 compilao. Corrija o erro e rode tecle Ctrl-F9 para compilar o programa novamente. Os erros normalmente so devidos a digitao. Olhe com ateno o que est escrito no programa no livro e o que foi digitado. Podem tambm ocorrer erros devido ao erro de lgica ou devido a configurao do compilador.

Nilson Luiz Maziero

nmaziero@terra.com.br

81

You might also like