linguagem c-introducao programacao aplicacoes graficas

81
- LINGUAGEM C – INTRODUÇÃO À PROGRAMAÇÃO COM APLICAÇÕES GRÁFICAS Nilson Luiz Maziero Passo Fundo, setembro de 2008. SUMÁRIO

Upload: everton-michel

Post on 25-Nov-2015

28 views

Category:

Documents


4 download

TRANSCRIPT

  • - LINGUAGEM C

    INTRODUO PROGRAMAO COM APLICAES GRFICAS

    Nilson Luiz Maziero

    Passo Fundo, setembro de 2008. SUMRIO

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 2

    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

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 3

    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

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 4

    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 [email protected].

    CAPTULO 1

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 5

    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.

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 6

    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 (a >= b) O valor da varivel a maior ou igual ao da varivel b.

    ( < ) menor que (a < b) O valor da varivel a menor que o da varivel b.

    (

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 7

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

    o campo que especifica a impresso atravs de uma seqncia de caracteres que inicia e termina com aspas.

    ,,... so expresses que sero impressas de acordo com a especificao feita em .

    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.

    //

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 8

    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 //cabeario necessrio para identificar os comandos utilizados. #include 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(,,,...);

    a especificao semelhante ao printf( );

    ,,... 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 #include void main() { float numero; int numeroInteiro; char nome; char nomeCompleto[10];

    clrscr(); // limpa a tela

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 9

    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

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 10

    clrscr(); for (i=0; i

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 11

    Nesta aplicao, o comando while() fica repetindo a expresso ola enquanto a varivel j tem um valor menor que dez (j

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 12

    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.

    if

    ...

    else{...}

    {...}

    Programa exemplo:

    #include #include

    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 .

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

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 13

    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.

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 14

    Por exemplo, deve ser colocado um include especial no programa: #include , 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

    Y

    (x1,y1)

    (x2,y2)

    x1

    y1

    640 pixels

    480

    pixe

    ls

    reta

    raio(x3,y3)

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

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 15

    (x1,y1)

    (x2,y2)

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

    raio

    (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:

    BLACKBLUEGREENCYANREDMAGENTABROWNLIGHTGRAYDARKGRAYLIGHTBLUELIGHTGREENLIGHTCYANLIGHTREDYELLOWWHITE

    Comando Cor

    14 WhiteYellow13

    12 Light RedLight Cyan11

    10 Light Green9 Light Blue

    Dark Gray8Light Gray7Brown6Magenta5

    4 Red3 Cyan

    Green2Blue1Black0

    # Nome da 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

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 16

    As tabelas abaixo indicam os valores destas variveis.

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

    # dir Nome Direo 0 HORIZ_DIR Esquerda para a direita 1 VERT_DIR De baixo para cima

    Valor de tc Efeito em outtext/outtextxy 0 Ampliao da fonte (stroked) usando fator de

    ampliao default de caracteres (4) ou o tamanho do caractere definido pelo usurio (dado por setusercharsize)

    1 Visualizao de caracteres da fonte 8x8 (bit-mapped) em um retngulo da tela contendo 8x8 pixels

    2 Visualizao de caracteres da fonte 8x8 (bit-mapped) em um retngulo da tela contendo 16x16 pixels

    3 Visualizao de caracteres da fonte 8x8 (bit-mapped) em um retngulo da tela contendo 24x24 pixels

    ...... ...............

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

    DescrioNome#

    _ _ _ _ _ _

    _..._..._..._

    ...............

    Efeito

    Linha definida pelo usurioUSERRBIT_LINE4Linha tracejadaDASHED_LINE3Linha tracejada pontilhada2 CENTER_LINELinha pontilhadaDOTTED_LINE1Linha cheia0 SOLID_LINE

    Thickness espessura, varia com a quantidade de pixels.

    # Nome Descrio

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 17

    1 NORM_WIDTH Espessura de 1 pixel 3 THICK_WIDTH 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 #include #include #include //============================================================= 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 #include #include #include #include #include

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 18

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

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 19

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

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 20

    F

    P

    DIR

    ETR

    IZ

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

    F

    Pdiretriz

    eixo

    foco

    vrtice

    raio vetor

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

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 21

    FV

    d

    d

    dFV

    d

    d

    d

    d1

    d1

    d1

    V F

    d1d

    d1

    d

    d1

    d

    d2

    d2

    d2 d2

    FV

    d1

    d1d

    d

    d2

    d1

    d

    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), pode-se 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: DVDF

    =

    2

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

    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.

    V F

    X Y

    R

    Dx

    DF

    xo,yo

    P(x,y)

    Figura 2.4 - Modelo geomtrico para definio do modelo matemtico.

    2.1.5 FLUXOGRAMA LGICO DO PROGRAMA

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 22

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

    STocoualgumatecla?

    Desenha um trecho da curvaentre dois pontos

    Calcula a posio do pontoP(x,y) da curva

    Desenha a diretriz e o eixo

    incrementa X

    Armazena coordenadasX e Y

    controle=1N

    S

    controle>0

    N

    fim

    Parmetros da parbola:

    incio

    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 #include #include #include //======================================================== void main()//define a funcao principal { //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas

    //=================== final das variaveis do programa=========== //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar");

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 23

    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 #include #include #include //============================================================= 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.

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 24

    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 #include #include #include #include #include //============================================================= 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); //muda a cor para amarelo line(xOld,yOld,x,y); //desenha um trecho da curva acima do eixo

    xOld=x; //armazena a coordenada X

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 25

    yOld=y; // armazena a coordenada Y

    delay(10); //o programa para por 10 milisegundos

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

    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 devido ao uso da funo matemtica sqrt(). #include 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 #include #include #include #include #include //============================================================= 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");

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 26

    printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== line(xo-50,yo,xo+680,yo); //desenho da diretriz line(xo,yo-240,xo,yo+240); //desenho do eixo circle(focoX,focoY,2); //desenho do foco

    while(!kbhit( )) { x=x+1; Dx=abs(focoX-x); //calcula Dx y=yo-sqrt(quad(x-xo)-quad(Dx)); //calcula a coordenada Y acima do eixo

    setcolor(YELLOW); //muda a cor para amarelo line(xOld,yOld,x,y); //desenha um trecho da curva acima do eixo

    xOld=x; //armazena a coordenada X yOld=y; // armazena a coordenada Y

    y=yo+sqrt(quad(x-xo)-quad(Dx)); //calcula a coordenada Y abaixo do eixo line(xold,yold,x,y); //desenha a curva abaixo do eixo

    xold=x; yold=y;

    delay(10); //o programa para por 10 milisegundos }

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

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

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 27

    Figura 2.6 Desenho resultante na tela.

    2.2 - PROGRAMA ELIPSE

    O programa elipse apresenta o desenho de uma elipse. O algoritimo desenvolvido baseado no processo dos circulos 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.

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 28

    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 B

    C

    D

    F F'O

    P

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

    BA

    D

    C

    D

    C

    A B

    D

    C

    BA

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

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 29

    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

    A

    D

    C

    B y

    x

    raioR

    aio

    P(x,y)

    (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 CO= 2 2 (3) Onde FO denominada de semi-distncia focal (figura 2.11).

    FA O

    D

    F'

    C

    BAO

    =

    FC

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

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 30

    Desenha um trecho da curvaentre dois pontos

    Calcula a posio do pontoP(x,y) da curva

    Desenha os dimetros e osfocos

    Armazena coordenadasX e Y

    varia ngulo alfa

    N

    incio

    Determina a posio dos focosF1 e F2

    Calcula a semi distncia focal

    Parmetros da elipse:Coordenadas do centro (x0,y0)Dimetro MaiorDimetro MenorFocos - F1 e F2Ponto da curva P(x,y)

    Tocoualgumatecla?

    fimS

    Figura 2.12 - Fluxograma do programa elipse.

    2.2.6 - Estrutura bsica do programa

    #include #include #include #include #include #include //======================================================== void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas

    //=================== final das variaveis do programa=========== //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1); // retorna codigo de erro }

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 31

    //============= 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 A(y) = yo B(x) = xo + DiametroMaior/2 B(y) = yo

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

    xo,yoA

    D

    C

    B

    xo+DiametroMaior/2,yo

    xo-DiametroMaior/2,yo

    xo,yo-DiametroMenor/2

    xo,yo+DiametroMenor/2

    Figura 2.13 - Determinao dos vrtices da elipse.

    #include #include #include #include #include #include //============================================================= void main() //define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== int xo=320,yo=240; //coordenadas do centro da elipse int DiametroMaior=400,DiametroMenor=200; //diametros da elipse

    //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar");

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 32

    getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito ===========

    line(xo-DiametroMaior/2,yo,xo+DiametroMaior/2,yo); //tracado do diametro maior line(xo,yo-DiametroMenor/2,xo,yo+DiametroMenor/2); //tracado do dismetro menor

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

    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 #include #include #include #include #include //============================================================= float dobro(float x) { return( x*x); } //=============================================================

    void main()//define a funcao principal {//1

    //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== int xo=320,yo=240; //coordenadas do centro da elipse int DiametroMaior=400,DiametroMenor=200; //diametros da elipse float SemiDistanciaFocal; //distancia do centro da alipse at o foco float F1,F2; // focos

    //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito ===========

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 33

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

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 34

    } //===================== 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; //divide a circunferencia em 72 partes xOld=xo+DiametroMaior/2; // coordenada X inicial yOld=yo; // coordenada Y inicial

    setlinestyle(SOLID_LINE,SOLID_FILL,THICK_WIDTH);

    while(!kbhit()) { setcolor(WHITE); 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

    alfa=alfa-Dalfa; x=xo+(DiametroMaior/2)*cos(alfa); // calculas as coordenadas X y=yo+(DiametroMenor/2)*sin(alfa); // calculas as coordenadas Y setcolor(YELLOW); line(xOld,yOld,x,y); // Desenha a elipse

    xOld=x; //armazenas pontos anteriores yOld=y; //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.

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 35

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

    Ponto P(x,y) em translao sobre a reta

    reta em rotao

    centro

    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.

    passo

    espira

    centro

    Figura 2.16 - Elementos da espiral de Arquimedes.

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 36

    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: raioraio

    numeroPartes= raio raio raio= +

    Variao do ngulo: =360

    numeroPartes = +

    Posio do ponto P a partir do centro da espiral: x raio= .cos y raio= .sen

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

    ponto P(x,y)

    (coordX,coordY)

    Figura 2.18 - Parmetros de clculo da espiral de Arquimedes.

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 37

    2.3.5 - O programa

    #include #include #include #include #include #include //============================================================= void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas

    //=================== final das variaveis do programa=========== float Passo=30; // Passo da espiral - Equivale ao raio da circunferencia de tracado float Dpasso=0.0; //variacao do passo float raio=0.0; // raio de desenho float alfa=0.0; // angulo de posicao float Dalfa=0.0; // incremento do angulo float x,y; // coordenadas do ponto da curva int divisao=24; // numero de divisoes em analise float coordX=320,coordY=240; // coordenadas de posicao do centro da espiral float xo=coordX,yo=coordY; // coordenadas anteriores do ponto da curva

    //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== Dpasso=Passo/divisao; //calcula o incremento do raio Dalfa=M_PI/divisao; //calcula o incremento do angulo alfa

    setlinestyle(SOLID_LINE,SOLID_FILL,THICK_WIDTH); setcolor(YELLOW); // especifica a cor amarela para a curva

    while(!kbhit()) { raio=raio+Dpasso; //incrementa o raio alfa=alfa+Dalfa; //incrementa o angulo alfa

    x=coordX+raio*cos(alfa); //calcula coordenada X do ponto y=coordY+raio*sin(alfa); //calcula coordenada Y do ponto line(x,y,xo,yo); //desenha a curva

    xo=x; //armazena a coordenada antiga de X yo=y; //armazena a coordenada antiga de Y

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

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 38

    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 C2

    R1

    R2

    R3

    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

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 39

    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.

    (d)(c)(b)(a)

    C2C1 C2C1 C2C1

    R3

    R2

    R1

    C2C1

    R2

    R1

    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<

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 40

    Neste programa, desenvolvido o traado da falsa espiral de dois centros.

    #include #include #include #include #include #include //============================================================= void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas

    //=================== final das variaveis do programa=========== int C1x=300,C1y=240; //centro 1 da falsa espiral int C2x,C2y; //centro 2 da falsa espiral int Cx,Cy; //centro da espiral para calculo float distancia=20; //distancia entre centros float Raio=0; // raio de tra'cado float teta=0; // angulo de calculo float Px,Py; // coordenadas da curva float POx,POy; // coordenadas anteriores float Dteta=0; // incremento do angulo float controlaTeta=0; //controle do angulo a cada 180 graus float controlaCentro=1; // controla a alternacia dos centros //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\bc45\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== Dteta=M_PI/36; // incremento do angulo C2x=C1x+distancia; //coordenada X do segundo centro Cx=C1x; //coordenada X do centro generico C2y=Cy=C1y; // coordenada Y do segundo centro e do centro generico POx=C2x; // coordenadas antigas POy=C2y; Raio=Raio+distancia;

    while(!kbhit()) { if(controlaTeta>M_PI) { controlaTeta=0; Raio=Raio+distancia; if(controlaCentro==1){Cx=C2x;controlaCentro=-1;} else{Cx=C1x;controlaCentro=1;} } circle(C1x,C1y,2); circle(C2x,C2y,2);

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 41

    Px=Cx+Raio*cos(teta); Py=Cy+Raio*sin(teta); teta=teta+Dteta; setcolor(YELLOW); line(POx,POy,Px,Py); setcolor(WHITE); POx=Px; POy=Py; controlaTeta=controlaTeta+Dteta; delay(120); }

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

    2.4.6 - 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 #include #include #include #include #include //============================================================= void main()//define a funcao principal

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 42

    {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas

    //=================== final das variaveis do programa=========== int C1x=300,C1y=240; int C2x,C2y; int Cx,Cy; float distancia=50; float Raio=0,teta=0; float Px,Py; float POx,POy; float Dteta=0; float controlaTeta=0; float controlaCentro=1; int controle=0; // controla o 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); //troca a cor de desemho line(Cx,Cy,POx,POy); //desenha a linha agora com a cor de fundo da tela setcolor(WHITE); //troca a cor de desenho } controle=1;

    if(controlaTeta>M_PI) { controlaTeta=0; Raio=Raio+distancia; if(controlaCentro==1){Cx=C2x;controlaCentro=-1;} else{Cx=C1x;controlaCentro=1;} }

    circle(C1x,C1y,2); circle(C2x,C2y,2);

    Px=Cx+Raio*cos(teta); Py=Cy+Raio*sin(teta); teta=teta+Dteta;

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 43

    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.

    P(x,y)

    CRCULO DE BASE

    RETA

    EVOLVENTE

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

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 44

    CRCULO DE BASE

    P(x,y)

    EVOLVENTE

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

    (a) (b) (c)Figura 2.26 Traado da evolvente do crculo.

    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 Raio= +2 2( )

    comprimentoArco Raio= .

    sendo o ngulo que varia em funo do problema.

  • Linguagem C Introduo programao com aplicaes grficas 2008

    Nilson Luiz Maziero [email protected] 45

    = onde =

    arctg

    comprimentoArcoRaio

    O ponto P1(x1,y1) dado por:

    P x Raio1( ) .cos= P y Raio1( ) .sen=

    P(x,y)

    Raio

    comprimento do arcoP1(x1,y1)

    raioVetor

    crculo de base

    evolvente

    Figura 2.27 Especificao do algoritmo.

    2.5.5 - O programa Traado da evolvent