Baixe o app para aproveitar ainda mais
Prévia do material em texto
- LINGUAGEM C – INTRODUÇÃO À PROGRAMAÇÃO COM APLICAÇÕES GRÁFICAS Nilson Luiz Maziero Passo Fundo, setembro de 2008. SUMÁRIO Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 2 Introdução........................................................................................................................................ 4 Capítulo 1 ........................................................................................................................................ 5 1. Programação ............................................................................................................................... 5 1.1 Conceitos básicos de programação .......................................................................................... 5 1.2 Tipos de dados .......................................................................................................................... 5 1.3 Operações aritméticas............................................................................................................... 6 1.4 Operadores relacionais.............................................................................................................. 6 1.5 Operadores de incremento e decremento................................................................................. 6 1.6 Funções básicas........................................................................................................................ 7 1.6.1 Função clrscr( )....................................................................................................................... 7 1.6.2 Função printf( ) ....................................................................................................................... 7 1.6.3 Função getch( )....................................................................................................................... 7 1.6.4 Função scanf( )....................................................................................................................... 8 1.6.5 Função for( ) ........................................................................................................................... 9 1.6.6 Função while( ) ....................................................................................................................... 10 1.6.7 Função do while( ) .................................................................................................................. 11 1.6.8 Função if( )....else................................................................................................................... 12 1.6.9 Função delay( ) ....................................................................................................................... 12 1.6.10 Função sqrt( ) ....................................................................................................................... 13 1.6.11 Função sin().......................................................................................................................... 13 1.6.12 Função cos()......................................................................................................................... 13 1.6.13 Função tan() ......................................................................................................................... 13 1.6.14 Função atan() ....................................................................................................................... 13 1.7 Construção de funções do usuário............................................................................................ 13 1.8 Interface gráfica......................................................................................................................... 14 1.9 Funções gráficas ....................................................................................................................... 14 1.10 Programa de desenho de uma reta e um círculo .................................................................... 17 Capítulo 2 ........................................................................................................................................ 20 2. Aplicações ................................................................................................................................... 20 2.1Programa Parábola..................................................................................................................... 20 2.1.1 O que é uma parábola............................................................................................................ 20 2.1.2 Elementos da parábola........................................................................................................... 20 2.1.3 Processo de traçado............................................................................................................... 21 2.1.4 Desenvolvimento do algoritimo............................................................................................... 21 2.1.5 Fluxograma............................................................................................................................. 22 2.1.6 O programa básico ................................................................................................................. 22 2.1.7 O programa parábola – versão 1............................................................................................ 23 2.1.8 O programa parábola – versão 2............................................................................................ 24 2.1.9 O programa parábola – versão 3............................................................................................ 25 2.1.10 Comentários ......................................................................................................................... 26 2.2 Programa Elipse ........................................................................................................................ 27 2.2.1 O que é uma elipse................................................................................................................. 27 2.2.2 Elementos de uma elipse ....................................................................................................... 28 2.2.3 Processo dos círculos concêntricos ....................................................................................... 28 2.2.4 Desenvolvimento do algoritimo............................................................................................... 28 2.2.5 Fluxograma do programa ....................................................................................................... 29 2.2.6 Estrutura básica do programa ................................................................................................ 30 2.2.7 Desenvolvimento do programa............................................................................................... 31 2.2.8 Comentários ........................................................................................................................... 34 2.3 Programa espiral de Arquimedes .............................................................................................. 35 2.3.1 O que é uma espiral de Arquimedes ...................................................................................... 35 2.3.2 Elementos de uma espiral de Arquimedes............................................................................. 35 2.3.3 Processo de traçado............................................................................................................... 36 2.3.4 Desenvolvimento do algoritimo...............................................................................................36 2.3.5 O programa ............................................................................................................................ 37 2.3.6 Comentários ........................................................................................................................... 38 Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 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 traçado............................................................................................................... 39 2.4.4 Desenvolvimento do algoritimo............................................................................................... 39 2.4.5 Desenvolvimento do programa............................................................................................... 40 2.4.7 Comentários ........................................................................................................................... 41 2.4.8 Animação gráfica.................................................................................................................... 41 2.4.9 Comentários ........................................................................................................................... 43 2.5 Programa evolvente do círculo.................................................................................................. 43 2.5.1 O que é uma evolvente do círculo.......................................................................................... 43 2.5.2 Elementos de uma evolvente do círculo................................................................................. 44 2.5.3 Processo de traçado............................................................................................................... 44 2.5.4 Desenvolvimento do algoritimo............................................................................................... 44 2.5.5 O programa evolvente do círculo ........................................................................................... 45 2.5.6 Programa de traçado da evolvente do círculo com animação da reta ................................... 46 2.5.7 Comentários ........................................................................................................................... 48 2.6 Programa ciclóide regular.......................................................................................................... 48 2.6.1 O que é uma ciclóide regular.................................................................................................. 48 2.6.2 Elementos de uma ciclóide regular ........................................................................................ 48 2.6.3 Processo de traçado............................................................................................................... 49 2.6.4 Desenvolvimento do algoritimo............................................................................................... 49 2.6.6 Desenvolvimento do programa............................................................................................... 49 2.7 Jogo de tênis ............................................................................................................................. 53 2.7.1 O problema............................................................................................................................. 53 2.7.2 Solução do problema.............................................................................................................. 54 2.7.3 Entendimento da lógica do problema ..................................................................................... 54 2.7.4 Programa básico .................................................................................................................... 56 2.7.5 Programação .......................................................................................................................... 57 2.7.6 Definição do espaço de movimento da bola........................................................................... 57 2.7.7 Animação................................................................................................................................ 59 2.7.8 Implementação da raquete..................................................................................................... 65 Capítulo 3 ........................................................................................................................................ 73 3. Desafios....................................................................................................................................... 73 3.1 Problemas a serem resolvidos .................................................................................................. 73 BIBLIOGRAFIA................................................................................................................................ 74 ANEXO 1 – Definições matemáticas .............................................................................................. 75 ANEXO 2 – Código do teclado ....................................................................................................... 76 ANEXO 3 – O ambiente do Turbo C ............................................................................................... 77 INTRODUÇÃO Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 4 Considerando que o aprendizado de um assunto está relacionado ao interesse que o mesmo desperta sobre o indivíduo e de como o assunto é apresentado. Também que imagens servem como atrativos para despertar a curiosidade para o aprendizado. Assim, este trabalho enfoca o uso da computação gráfica como objeto de trabalho para a aprendizagem dos princípios de programação em linguagem C. O trabalho inicia com a introdução dos comandos básicos para a programação em linguagem C; comandos estes utilizados nos programas exemplo apresentados. Não é a intenção deste trabalho descrever um tratado sobre programação em linguagem C, mas mostrar que é possível e fácil de aprender a programar. Deste modo, os conteúdos são apresentados na forma de problemas gráficos a serem resolvidos, apresentando inicialmente um estudo sobre o problema a ser resolvido e as definições necessárias. Posteriormente, é apresentada a solução matemática para o problema, independente do programa de computador. Os problemas estudados são os traçados de curvas matemáticas conhecidas, mas que são analisadas sobre o enfoque gráfico, baseando-se nos conceitos de desenho geométrico. Juntamente com o trabalho, acompanham os programas executáveis para que o usuário possa ver os resultados a serem atingidos ao final do desenvolvimento de cada programa. Os programas fontes estão 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 alterações para o problema seguinte. Todos os programas são feitos em linguagem C para o ambiente DOS, onde pode-se utilizar o compilador TURBO C 3.0, encontrado na internet. Para outras informações e dúvidas a rsspeito desta apostila, pode-se contatactar através do emailnmaziero@terra.com.br. CAPÍTULO 1 Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 5 1 - PROGRAMAÇÃO Nos dias atuais, o uso da informática está em todas as atividades humanas, desde atividades industriais, comerciais, educacionais e até mesmo dentro de nossas casas, onde vários tipos de equipamentos já a utilizam sem que sejam percebidos. Deste modo, é interessante um conhecimento básico de programação para que o indvíduo possa entender este assunto como algo possível de ser utilizado, e não algo do outro mundo, que somente está acessível aos indivíduos super dotados. Os itens de programação aqui apresentados são aqueles necessários ao entendimento dos programas apresentados. Deve-se lembrar que a matemática é uma parte muito importante para o entendimento e execução de um programa de computador. 1.1 - CONCEITOS BÁSICOS DE PROGRAMAÇÃO A programação é um conjunto de instruções, descrita numa linguagem que o sistema operacional do computador consegue analisar, e que são executadas sequencialmente, de acordo com o que o programador determinou. Para escrever um programa, é necessário conhecer uma linguagem, onde se utiliza um compilador para transformar o programa escrito numa linguagem compreensível pelo ser humano, numa linguagem dita “linguagem de máquina”. Esta linguagem de máquina é escrita num formato que o computador consegue entender e processar rapidamente, mas para o ser humano é difícil. A linguagem de programação é composta por uma série de comandos, que são ordens para a execução de determinadas instruções, que são aquelas operações específicas do programa que o programador descreve para obter um resultado desejado. Além dos comandos, outro elemento importante são as variáveis, que são responsáveis pelo armazenamento das informações, que podem ser numéricas (números inteiros, números reais, etc.) e de caracteres (letras e palavras). Na linguagem C, se uma palavra que representa uma variável é escrita em letras minúsculas, e a mesma palavra é escrita com a letra inicial maiúscula, elas são consideradas variáveis diferentes. Após cada instrução de programa, deve ser colocado um ponto e vírgula ( ; ). 1.2 - TIPOS DE DADOS Na linguagem C, há vários tipos de dados como int, float e char, etc. Os tipos de dados irão definir os tipos de variáveis que serão utilizadas no programa, o que é feito pelo usuário. A definição das variáveis é função específica dos dados utilizados para resolver o problema. int Define uma variável que armazena um número inteiro. Um número inteiro é definido como: int num; num é uma variável inteira. int controle = 2; controle é uma variável inteira e armazena o valor 2. float Define uma variável que armazena um número real. Um número real é definido como: float valores; valores é uma variável real. float numero = 3.23; numero é uma variável real e armazena o valor 3,23. Obs.: Ao escrever um programa com número real, a parte inteira é separa da parte decimal por um ponto (.), e não uma vírgula (,). char Define uma variável que armazena um caracter, que pode ser uma letra um número, ou uma cadeia de caracteres, que é uma palavra. Um char é assim definido: char nome; nome é uma variável que armazena um caracter. char letra = ‘d’; letra é uma variável que armazena um caracter e que é o d. Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 6 char numero = ‘5’; numero é uma variável que armazena um caracter e que é o 5. Não é interpretado como o número 5, não podendo ser usado para cálculos. char nomes[5] = “joao”; nomes é uma variável que armazena um vetor de caracteres (cinco posições), mas no máximo quatro caracteres podem ser colocados. 1.3 - OPERAÇÕES ARITMÉTICAS ( = ) Atribuição Este sinal corresponde a atribuir um valor da variável do lado direito do sinal para a variável do lado esquerdo. Onde: a = b; a variável a assume o valor da variável b, e a variável b ainda permanece com o referido valor. c = 5; a variável c passa a armazenar o valor 5. b = c/a; a variável b passa a assumir o valor da divisão da variável c pela variável a. x = y = z; as variáveis x e y recebem o valor da variável z. ( + ) Adição c = a + b; Executa a adição de duas variáveis, a e b, que são armazenadas em c. d = a + b + c; Executa a adição de três variáveis, a, b e c, que são armazenadas em d. ( - ) Subtração c = a - b; Executa a subtração de uma variável da outra (a e b), onde o resultado é armazenado em c. c = a – b - d; Subtrair a variável b da variável a, e deste resultado subtrair a variável d. ( * ) Multiplicação c = a * b; Efetua a multiplicação das duas variáveis a e b, sendo o resultado armazenado em c. c = a * b * d; Efetua a multiplicação das três variáveis e o resultado é armazenado na variável c. ( / ) Divisão c = a / b; Efetua a divisão da variável a pela variável b, sendo o resultado armazenado na variável c. No caso da variável que recebe o resultado de uma operação aritmética, esta deve ser do tipo que resulta o dado. Uma variável inteira (int) não pode receber um resultado que é uma variável de ponto flutuante (float), pois a parte fracionária será suprimida. 1.4 - OPERADORES RELACIONAIS Os operadores relacionais se utilizam para a análise comparativa entre as variáveis. ( > ) maior que (a > b) O valor da variável a é maior que o da variável b. ( >= ) maior ou igual a (a >= b) O valor da variável a é maior ou igual ao da variável b. ( < ) menor que (a < b) O valor da variável a é menor que o da variável b. ( <= ) menor ou igual a (a <= b) O valor da variável a é menor ou igual ao da variável b. ( == ) igual (a == b) O valor da variável a é igual ao valor da variável b. ( != ) diferente (a != b) O valor da variável a é diferente do valor da variável b. 1.5 - OPERADORES DE INCREMENTO E DECREMENTO ( ++ ) Operador de incremento. Adiciona uma unidade a variável inteira j. j++; Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 7 ( -- ) Operador de decremento. Subtrai uma unidade a variável inteira j. j--; 1.6 – FUNÇÕES BÁSICAS São funções que executam um conjunto de instruções para o programador. Elas fazem parte da linguagem de programação utilizada. Na realidade, em diferentes linguagens de programação, os nomes das funções básicas são semelhantes. Isto permite extender o aprendizado de uma linguagem para outra. 1.6.1 - FUNÇÃO clrscr() Este comando limpa a tela quando no formato texto. O formato texto permite apenas que sejam escritos caracteres na tela. 1.6.2 - FUNÇÃO printf ( ) Permite apresentar na tela um resultado, que pode ser um número ou uma expressão. De acordo com o tipo de variável a ser escrita, deve-se especificar na função o seu formato. Especificação da variável: %d identifica uma variável inteira %f identifica uma variável real %c identifica uma variável caracter %s identifica uma uma variável que tem uma seqüência de caracteres Caracter de controle: \n nova linha – inicia o texto a ser escrito na linha seguinte formato: printf( < formato> , <var1>, <var2>,...); <formato> é o campo que especifica a impressão através de uma seqüência de caracteres que inicia e termina com aspas. <var1>,<var2>,... são expressões que serão impressas de acordo com a especificação feita em<formato>. printf ( “\nescreve o numero real: %f ”,numero ); Antes de imprimir na tela, deve ir para uma nova linha \n, imprime o texto escreve o numero real:, onde %f diz que a variável numero é um número real (float), e imprime o que estiver armazenado na variável numero. printf ( “ escreve o numero inteiro: %d \n”,numeroInteiro ); onde %d diz que a variável numeroInteiro representa um número inteiro (int). Depois de escrever deve pular para nova linha (\n), e imprime o que estiver armazenado na variável numeroInteiro. printf ( “ escreve caracteres: %s ”,nome ); onde %s diz que a variável nome representa um caracter (char) ou uma cadeia de caracteres ( char [ ] ). Escreve sem mudar de linha o que estu\iver armazenado na variável nome. 1.6.3 - FUNÇÃO getch ( ) A função lê um caracter introduzido pelo teclado. Ao encontrar este comando, o programa para esperando que seja introduzido uma informação pelo teclado, por apenas um toque. O valor da tecla é capturado pela função, donde pode-se escrever: char Letra; Letra = getch ( ); O que permite que seja capturado o valor da tecla e transferido para a variável Letra. Ou simplesmente getch( ); para interromper o programa a espera do toque em uma tecla para continuar. // Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 8 A colocação de duas barras em seqüência, é interpretado que o que está escrito após as duas barras, e na mesma linha, não seja interpretado pelo programa. Utiliza-se para a colocação de comentários no programa, ou o cancelamento de partes do programa que não serão 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> //cabeçario necessário para identificar os comandos utilizados. #include <conio.h> void main() // indica a função 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 - FUNÇÃO scanf ( ) Permite ler um conjunto de informações introduzidas pelo teclado. formato: scanf(<formato>,<end1>,<end2>,...); <formato> a especificação é semelhante ao printf( ); <end1>,<end2>,... correspondem aos endereços onde os dados devem ser lidos. int num; printf ( “tecle um numero”); scanf ( “%d”,&num); (informa o tipo de dado, captura o endereço da variável) O símbolo & na frente da variável permite que o programa leia o endereço da memória onde está armazenado o valor da variável. Programa exemplo 2 #include <stdio.h> #include <conio.h> void main() { float numero; int numeroInteiro; char nome; char nomeCompleto[10]; clrscr(); // limpa a tela Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 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 número 5.2 e tecle Enter) Digite um numero inteiro: 3 (tecle o número 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 - FUNÇÃO for( ) Permite que uma instrução ou um grupo de instruções seja executado um determinado número de vezes que é especificado. O número de vezes que as instruções devem ser executadas deve ser conhecido exatamente. int i; for(i=0;i<10;i++){printf(“\nola!);} Esta instrução diz para o comando for executar um laço 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 laço 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 laço executado eplo comando for( ). printf("\n i*2 = %d",i*2) for (i=0; i<10 i++) Programa exemplo 3 #include <stdio.h> #include <conio.h> void main ( ) { int i; Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 10 clrscr(); for (i=0; i<10; i++) { printf(“\n i*2= %d”,i*2 ); } getch(); } resultado: i*2= 0 i*2= 2 i*2= 4 i*2= 6 i*2= 8 i*2= 10 i*2= 12 i*2= 14 i*2= 16 i*2= 18 1.6.6 - FUNÇÃO while( ){ ... } Permite que uma instrução ou um grupo seja executado um certo número de vezes, enquanto uma determinada condição não ocorra. O teste é feito no início do laço. Comando utilizado quando não se conhece o número de interações a ser realizado. O comando testa a condição inicial entre parentesis e se for válida realiza os comandos que estão entre chaves {...}. j++ j=0 while(j<10) printf("ola!") Programa exemplo 4 #include <stdio.h> #include <conio.h> void main ( ) { int j=0; clrscr(); while( j<10) { printf ( “ olá! ” ); j++; } getch(); } resultado: ola! ola! ola! ola! ola! ola! ola! ola! ola! ola! Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 11 Nesta aplicação, o comando while() fica repetindo a expressão ola enquanto a variável j tem um valor menor que dez (j<10). A cada repetição, j é incrementado de um (j++;), sendo que j inicia com valor zero. Se a variável j fosse igual a 10 (j=10), seria impresso apenas uma vez. Como no comando printf() não há o caracter de controle \n, o resultado é impresso lado a lado. 1.6.7 - FUNÇÃO do { ... } while( ) Permite que uma instrução ou um grupo de instruções seja executado um determinado número de vezes, enquanto uma determinada condição não ocorra. O teste é feito no final do laço. Comando utilizado quando não se conhece o número de interações a ser realizado. Inicialmente são executados os comando que estão entre chaves {...}, e depois é realizado o teste do comando. j=0; do printf("ola!"); j++; while(j<10) Programa exemplo 5 #include <stdio.h> #include <conio.h> void main ( ) { int j=0; clrscr(); do { printf(“ olá!”); j++; } while( j<10); getch(); } resultado: ola! ola! ola! ola! ola! ola! ola! ola! ola! ola! Nesta aplicação, o comando while() fica repetindo a expressão olá enquanto a variável j tem um valor menor que dez ( j<10 ). A cada repetição, j é incrementado de um, sendo que j inicia com valor zero. Se a variável j fosse igual a 10 (j=10), não seria impresso nada. 1.6.8 - FUNÇÃO if ( ){...} ... else{...} Permite executar testes comparativos entre variáveis. if ( x > y) {printf( “o valor de X é maior que o valor de Y”);} else { printf ( “o valor de Y é menor que o valor de X”);} Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 12 A instrução if( ) compara as variáveis X e Y. Se X é maior que Y, condição verdadeira, as instruções seguintes dentro das chaves {...} são executadas e ignora a opção else. Se o resultado da comparação é que Y é maior que X, a instrução seguinte é ignorada e passa para a instrução else, que será executado o que estiver dentro das chaves {...}. As instruções executadas diretamente pelo if ou else, são identificadas pelo conjunto de chaves. Depois do if( ) e dentro dos parenteses, podem se colocadas quaisquer tipos de comparação. if ... else{...} {...} Programa exemplo: #include <stdio.h> #include <conio.h> void main ( ) { int x =10, y = 5; clrscr(); if ( x > y) {printf ( “\n O valor de X é maior que o valor de Y.”);} else { printf ( “\n O valor de Y é menor que o valor de X.”);} x=5; y=10; if ( x > y) {printf ( “\n Agora o valor de X é maior que o valor de Y.”);} else { printf ( “\n Agora o valor de Y é menor que o valor de X.”);} getch(); } resultado: O valor de X é maior que o valor de Y. Agora o valor de Y é menor que o valor de X. 1.6.9 - FUNÇÃO delay(int) Esta função faz com que o programa pare um determinado tempo. Este valor de tempo é medido em milisegundos (1/1000 segundo), um segundo dividido em mil partes. Para que o programa pare durante meio segundo, deve-se escrever: delay(500);. Esta função pertence ao #include <dos.h>. 1.6.10 - FUNÇÃO double sqrt( double x ) Obtém o resultado da raiz quadrada de um número real de dupla precisão. Também pode ser colocada uma expressão matemática. Do resultado desta expressão será extraída a raiz quadrada, que é um número real de dupla precisão. sqrt( 16 ); Extrai a raiz quadrada do número 16. sqrt( a + b); Extrai a raiz quadrada do resultado da adição das variáveis a e b. 1.6.11 – FUNÇÃO double sin( double x ) (Anexo 1) Resulta no valor do seno de uma variável x, que é um número real de dupla precisão, resultando como valor um número real de dupla precisão. A variável x deve ser o valor do ângulo em radianos. sin(10); obtém o valor do seno de 10 (valor em radianos). Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 13 sin(a + b); Resulta no valor do seno da soma das variáveis a e b. 1.6.12 – FUNÇÃO double cos( double x ) (Anexo 1) Resulta no valor do cosseno de uma variável x, que é um número real de dupla precisão, resultando como valor um número real de dupla precisão. A variável x deve ser o valor do ângulo em radianos. cos(10); obtém o valor do cosseno de 10 (valor em radianos). cos(a + b); Resulta no valor do cosseno da soma das variáveis a e b. 1.6.13 – FUNÇÃO double tan( double x ) (Anexo 1) Resulta no valor da tangente de uma variável x, que é um número real de dupla precisão, resultando como valor um número real de dupla precisão. A variável x deve ser o valor do ângulo em radianos. tan(10); obtém o valor da tangente de 10 (valor em radianos). sin(a + b); Resulta no valor do seno da soma das variáveis a e b. 1.6.14 – FUNÇÃO double asin( double x ) Resulta no valor do arco seno de uma variável x, que é um número real de dupla precisão, resultando como valor um número real de dupla precisão. asin(10); obtém 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 variáveis a e b. 1.6.15 – FUNÇÃO double acos( double x ) Resulta no valor do arco cosseno de uma variável x, que é um número real de dupla precisão, resultando como valor um número real de dupla precisão. acos(10); obtém 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 variáveis a e b, valor resultante é do ângulo em radianos. 1.6.16 – FUNÇÃO double atan( double x ) Resulta no valor do arco tangente de uma variável x, que é um número real de dupla precisão, resultando como valor um número real de dupla precisão. atan(10); obtém 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 variáveis a e b, valor resultante é do ângulo em radianos. Obs.: Ver no anexo 1, as definições matemáticas das funções acima. 1.7 - CONSTRUÇÃO DE FUNÇÕES DO USUÁRIO São utilizadas quando é necessário repetir em vários trechos do programa o mesmo conjunto de instruções. Deste modo, este conjunto de instruções é transformado numa função e chamado sempre que necessário. float quad ( float x) { return ( x * x ); } Esta função recebe a variável x, e multiplica por ele mesmo, resultando no quadrado do respectivo número, e devolvendo o resultado. A palavra float, antes do nome da função quad, indica que a função devolve um valor que é um número real. A expressão float x, indica que a função deve receber um valor que é um número real, que passa para dentro da função através da variável x. A expressão 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 GRÁFICA A interface gráfica permite que sejam executados desenhos através do computador. Para isso, a interface deve ser inicializada através de algumas instruções adequadas. Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 14 Por exemplo, deve ser colocado um include especial no programa: #include <graphics.h>, que permite que as instruções gráficas possam ser interpretadas, transformando a tela para formato gráfico. A tela no formato gráfico é definida como tendo 640x480 pixels, que são pontos na tela que podem ser acesos. O sistema de coordenadas da tela gráfica é igual ao sistema de coordenadas cartesiano, possuindo os eixos X e Y. Porém, possui algumas alterações. 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 48 0 pi xe ls reta raio (x3,y3) Figura 1.1 - Representação da tela gráfica. O trecho de programa descrito a seguir, é o responsável pela inicialização do ambiente gráfico 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 informações gráficas. Sendo que o compilador não conhece o caminho (path) de onde ele está. É necessário indicar através da seqüência Options-Linker-Libraries e assinalar Graphics Library, no editor do TURBO C. //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); //inicialização com a indicação 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 – FUNÇÕES GRÁFICAS Alguns destes comandos são apresentados a seguir: FUNÇÃO line (x1,y1,x2,y2 ) Permite o traçado de uma reta conhecendo-se as coordenadas do ponto inicial(x1,y1) e do ponto final (x2,y2). Estes pontos tanto podem ser variáveis do tipo int ou float (figura 1.1). Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 15 (x1,y1) (x2,y2) FUNÇÃO circle ( x,y,r ) Permite traçar um circulo, conhecendos-se as coordenadas do centro (x,y) e o valor do raio r. Estes pontos tanto podem ser variáveis do tipo int ou float (figura 1.1). raio (x,y) FUNÇÃO setcolor( int ) Este comando permite que a cor da linha seja alterada, para isso pode ser passada o nome da cor ou seu numero inteiro (int) correspondente. As cores podem ser indicadas por números ou palavras como descrito a seguir: BLACK BLUE GREEN CYAN RED MAGENTA BROWN LIGHTGRAY DARKGRAY LIGHTBLUE LIGHTGREEN LIGHTCYAN LIGHTRED YELLOW WHITE Comando Cor 14 White Yellow13 12 Light Red Light Cyan11 10 Light Green 9 Light Blue Dark Gray8 Light Gray7 Brown6 Magenta5 4 Red 3 Cyan Green2 Blue1 Black0 # Nome da cor pode-se escrever: setcolor(YELLOW); ou setcolor(14); FUNÇÂO setbkcolor(int) Função que seleciona a cor de fundo da tela. O número inteiro pode ser entre 0 e 15, ou o nome da cor. FUNÇÂO settextstyle(int fnt,int dir,int tc) Esta função permite configurar os valores para os atributos do texto visualizado em tela gráfica. fnt indica o estilo de fonte do texto; dir direção em que a fonte deve ser escrita. Na horizontal ou vertical. tc Tamanho do caracter visualizado na tela Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 16 As tabelas abaixo indicam os valores destas variáveis. # fnt Nome Fonte de texto 0 DEFAULT_FONT Mapa de bits 8x8 1 TRIPLEX_FONT Triplex 2 SMALL_FONT Small 3 SANS_SERIF_FONT Sans-serif 4 GOTHIC_FONT Gothic 5 SCRIPT_FONT Script 6 SIMPLEX_FONT Simplex 7 TRIPLEX_SCR_FONT Triplex-script 8 COMPLEX_FONT Complex 9 EUROPEAN_FONT European 10 BOLD_FONT Bold # dir Nome Direção 0 HORIZ_DIR Esquerda para a direita 1 VERT_DIR De baixo para cima Valor de tc Efeito em outtext/outtextxy 0 Ampliação da fonte (stroked) usando fator de ampliação default de caracteres (4) ou o tamanho do caractere definido pelo usuário (dado por setusercharsize) 1 Visualização de caracteres da fonte 8x8 (bit-mapped) em um retângulo da tela contendo 8x8 pixels 2 Visualização de caracteres da fonte 8x8 (bit-mapped) em um retângulo da tela contendo 16x16 pixels 3 Visualização de caracteres da fonte 8x8 (bit-mapped) em um retângulo da tela contendo 24x24 pixels ...... ............... 10 Visualização de caracteres da fonte 8x8 (bit-mapped) em um retângulo da tela contendo 80x80 pixels FUNÇÃO putpixel(int x, int y, int cor) Função que coloca um pixel na tela nas coordenadas (x,y) e acordo com a cor desejada. FUNÇÃO setlinestyle(int style, unsigned pattern, int thickness) Função de configuração do tipo de linha e da espessura Style – estilo, pode ser dado de acordo c om a tabela abaixo. DescriçãoNome# _ _ _ _ _ _ _..._..._..._ ............... Efeito Linha definida pelo usuárioUSERRBIT_LINE4 Linha tracejadaDASHED_LINE3 Linha tracejada pontilhada2 CENTER_LINE Linha pontilhadaDOTTED_LINE1 Linha cheia0 SOLID_LINE Thickness – espessura, varia com a quantidade de pixels. # Nome Descrição Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 17 1 NORM_WIDTH Espessura de 1 pixel 3 THICK_WIDTH Espessura de 3 pixels FUNÇÃO closegraph( ) Função responsável pela finalização do ambiente gráfico e retorno à tela normal, tela de texto. 1.10 - PROGRAMA PARA O DESENHO DE UMA RETA E UM CÍRCULO O programa a seguir permite executar o desenho de uma reta e de um círculo, onde as coordenadas de cada um podem ser alteradas para verificar os resultados. //Nome do arquivo DESENHA.C #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> //============================================================= void main() //define a funcao principal { //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1); // retorna codigo de erro } //===================== inicia o programa propriamente dito =========== setcolor(YELLOW); //desenha em amarelo line(100,200,400,350); //desenha uma reta setcolor(RED); //desenha em vermelho circle(90,150,50); //desenha um circulo //===================== final do programa propriamente dito ============ getch(); // espera que seja tocada uma tecla closegraph(); //fecha o modo gráfico } //==================== final do arquivo ============================ 1.11 Interpretação do código Este conjunto de instruções abaixo, corresponde a informação ao compilador dos arquivos necessários ao funcionamento do programa #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <dos.h> Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 18 A função void main(), corresponde ao programa propriamente dito. As instruções escritas entre as duas chaves definirão o programa. void main() {//1 ............ ............ }//1 A seguir há um espaço onde são definidas as variáveis utilizadas no programa para a identificação do ambiente gráfico. As variáveis são definidas como números inteiros, int. //================= definicao das variaveis ================ int gdriver,gmode,errorcode; //=== variaveis graficas No espaço a seguir, estão definidas as variáveis utilizadas no programa, isto por uma questão de organização, pois na linguagem C, as variáveis podem ser criadas em qualquer parte do programa. //============ variaveis do programa ====================== //========== final das variaveis do programa ================== O conjunto de instruções a seguir permite inicializar o ambiente gráfico, de modo a localizar os arquivos necessários ao programa. Se forem encontrados os arquivos gráficos, o programa funcionará normalmente. Do contrário 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 próximo espaço, 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 gráfico e o programa. getch(); closegraph(); return 0; }//1//================ final do arquivo ==================== Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 19 Comentários: O programa desenha uma reta e um cículo, apresentando o formato de como deve ser escrito um programa gráfico. Na primeira linha do programa está escrito: //Nome do arquivo DESENHA.C, que é interpretado como um comentário pelo compilador devido as duas barras inclinadas (//), e apenas indica o nome do programa. Nas linhas a seguir, estão os #include, que especificam os arquivos do compilador C que devem ser agregados ao programa para que o compilador possa interpretar as instruções escritas. As linhas escritas em negrito correspondem ao programa propriamente dito. Resultado Após rodar o programa, aparecerá como resultado o desenho de uma reta em amarelo e de um círculo em vermelho. Experimente alterar o valor das coordenadas nas funções line(), circle() e setcolor(); comparando os resultados obtidos. CAPÍTULO 2 2. APLICAÇÕES Neste capítulo são implementadas as aplicações gráficas que envolvem a definição do problema, busca da solução, e a solução final que é o programa. 2.1 - PROGRAMA PARÁBOLA O desenho da parábola a ser desenvolvido é baseado no traçado gráfico que considera que um ponto (P) sobre a parábola possui a mesma distância ao foco e a diretriz (figura 2.1 (b)). 2.1.1 - O que é uma parábola Uma parábola é uma curva plana infinita resultante da seção de um cone reto por um plano paralelo a uma das geratrizes (figura 2.1 (a)). A parábola é o lugar geométrico dos pontos de um plano cuja relação entre a distâncias de cada ponto P da curva ao foco F e à diretriz é equidistante (igual) (figura 2.1(b)). Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 20 F P D IR ET R IZ (a) (b) Figura 2.1 - Cone truncado por um plano paralelo a uma geratriz; desenho da parábola. 2.1.2 - Elementos de uma prábola Uma parábola é composta por vários elementos. Os mais importantes para o desenvolvimento do problema são descritos a seguir (figura 2.2): a) Diretriz: Reta perpendicular ao eixo. b) Eixo: Segmento de reta que contém o vértice e o foco da parábola. c) Parâmetro: distância da diretriz ao foco. d) Foco (F): centro da curva. d) Vértice (V): ponto de cruzamento da curva com o eixo. e) Raios vetores: distância do foco ao ponto P da curva e da diretriz ao ponto P da curva. Obs.: Numa parábola deve ser observada a seguinte condição de distância entre o ponto P da curva com o foco F e a diretriz. FP = Pdiretriz (figura 2.2). F P diretriz eixo foco vértice raio vetor parâmetro Figura 2.2 - Elementos de uma parábola. 2.1.3 - Processo de traçado A parábola inicia-se com o traçado do eixo e da diretriz, que são perpendiculares entre si (ângulo de 90°). Após, deve-se marcar o vértice (V) da parábola e o foco (F). Sendo que o vértice está localizado no ponto médio da distância entre o foco e a diretriz (figura 2.3 (a)). Como a distância de um ponto (P) da curva ao foco deve ser igual à distância do mesmo ponto (P) à diretriz, deve-se traçar retas paralelas a diretiz a partir do vértice da parábola. A distância entre as paralelas é arbitrária e, de preferência, que sejam iguais para facilitar o traçado. O próximo passo consiste em pegar a distância (d) (figura 2.3(a)) entre a diretriz e a primeira paralela, com o compasso, e colocar a ponta seca do compasso no foco e traçar um arco que corte a primeira paralela. A seguir pegar a distância da diretriz (d1) (figura 2.3(b)) até a segunda paralela. Colocar a ponta seca do compasso no foco e traçar arco para interseptar a segunda paralela, acima e abaixo do eixo. Novamente pegar a distância da diretriz (d2) (figura 2.3(c)) até a terceira paralela. Colocar a ponta seca do compasso no foco e traçar arco para interseptar a terceira paralela, acima e abaixo do eixo. Repetindo este procedimento, obtém-se os pontos por onde passa a parábola. A curva é então traçada a mão (figura 2.3(d)). Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 21 FV d d d FV d d d d1 d1 d1 V F d1 d d1 d d1 d d2 d2 d2 d2 FV d1 d1 d d d2 d1 d d2 (a) (b) (c) (d) Figura 2.3 - Processo de traçado da parábola 2.1.4 - Desenvolvimento do algoritmo Considerando a curva traçada, e analizando um ponto P(x,y) qualquer da curva (figura 2.4), pode- se verificar que a distância X da diretriz até ponto P(x,y), será exatamente a distância do foco F até o ponto P(x,y), onde (X = R). A coordenada Y deste ponto é resultante da dimensão do cateto maior do triângulo, e Dx, o cateto menor, será função da diferença entre a coordenada X e a distância do foco DF (figura 2.4). Assim, a distância do vértice até a diretriz é dada por: DV DF = 2 Dx DF x= −| |, sendo o resultado em módulo. logo, Y R Dx= −2 2 Considerando (xo,yo) como pontos de referência do sistema, tem-se as coordendas dos seguintes pontos: V (xo + DF/2, yo) F (xo + DF, yo) P (x, y) Assim: P(x) = xo + DV + Dx P(y) = yo + Y sendo DeltaX um incremento para descrever a curva. V F X Y R Dx DF xo,yo P(x,y) Figura 2.4 - Modelo geométrico para definição do modelo matemático. 2.1.5 – FLUXOGRAMA LÓGICO DO PROGRAMA Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 22 O fluxograma descreve a lógica do programa, onde os retangulos descrevem as instruções e os losangos os comandos de teste (if()) (figura 2.5). STocou alguma tecla? Desenha um trecho da curva entre dois pontos Calcula a posição do ponto P(x,y) da curva Desenha a diretriz e o eixo incrementa X Armazena coordenadas X e Y controle=1 N S controle>0 N fim Parâmetros da parábola: início Figura 2.5 - Fluxograma do programa parábola. 2.1.6 - O programa básico O programa apresentado a seguir é uma estrutura que servirá para o desenvolvimento de todos os programas deste trabalho. A partir destes conceitos, serão implemtados os programa, sendo acrescentadas novas funções e instruções, e a cada novidade, na evolução de um programa, serão escritos em negrito para salientar. #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> //======================================================== void main()//define a funcao principal { //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 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 parábola - versão 1 A versão 1, é o programa básico acrescido das novas instruções para que sejam desenhados a diretriz, o eixo e o foco da parábola. //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 ================================== Comentários Após 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 construção da parábola, o eixo e a diretriz. Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 24 2.1.8 - O programa parábola - versão 2 Na versão 2, são acrescentadas as funções e variáveis para que seja desenhado ramo acima do eixo da parábola. //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 variável X { return (x*x); } //============================================================= void main() //define a funcao principal { //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas float xo=50; //coordenada X inicial float yo=240; //coordenada Y inicial float distanciaFocal=30; float focoX=xo+distanciaFocal; //coordenada X do foco float focoY=yo; //coordenada Y do foco float x=xo+(distanciaFocal/2); //coordendada X inicial do ponto P da curva float y=yo; //coordendada Y inicial do ponto P da curva float xOld=x; // armazena a coordenada anterior X float yOld=y; // armazena a coordenada anterior Y float Dx; // Incremento de X //=================== 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 – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 25 yOld=y; // armazena a coordenada Y delay(10); //o programa para por 10 milisegundos } //===================== final do programa propriamente dito ============ getch(); closegraph(); } //==================== final do arquivo ================================== Comentários Nesta outra versão, foi introduzido o comando while( !kbhit( ) ), que faz com que o programa fique num laço até que seja tocada uma tecla para então sair. Os novos includes: #include <math.h> é devido ao uso da função matemática sqrt(). #include <dos.h> é devido ao uso da função matemática delay(). 2.1.9 - O programa parábola - versão 3 Na versão 3, são acrescentadas as funções e variáveis para que seja desenhado ramo abaixo do eixo da parábola (figura 2.6). //PROGRAMA PARABOLA.C #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #include <math.h> //============================================================= float quad(float x) // funcao para elevar ao quadrado um numero aramzenado na variável X { return (x*x); } //============================================================= void main() //define a funcao principal { //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas float xo=50; //coordenada X inicial float yo=240; //coordenada Y inicial float distanciaFocal=30; float focoX=xo+distanciaFocal; //coordenada X do foco float focoY=yo; //coordenada Y do foco float x=xo+(distanciaFocal/2); //coordendada X inicial do ponto P da curva float y=yo; //coordendada Y inicial do ponto P da curva float xOld=x; // armazena a coordenada anterior X float yOld=y; // armazena a coordenada anterior Y float Dx; // Incremento de X float xold=x; // armazena variavel X para desenhar abaixo do eixo float yold=y; // armazena variavel Y para desenhar abaixo do eixo //=================== final das variaveis do programa=========== //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 26 printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== line(xo-50,yo,xo+680,yo); //desenho da diretriz line(xo,yo-240,xo,yo+240); //desenho do eixo circle(focoX,focoY,2); //desenho do foco while(!kbhit( )) { x=x+1; Dx=abs(focoX-x); //calcula Dx y=yo-sqrt(quad(x-xo)-quad(Dx)); //calcula a coordenada Y acima do eixo setcolor(YELLOW); //muda a cor para amarelo line(xOld,yOld,x,y); //desenha um trecho da curva acima do eixo xOld=x; //armazena a coordenada X yOld=y; // armazena a coordenada Y y=yo+sqrt(quad(x-xo)-quad(Dx)); //calcula a coordenada Y abaixo do eixo line(xold,yold,x,y); //desenha a curva abaixo do eixo xold=x; yold=y; delay(10); //o programa para por 10 milisegundos } //===================== final do programa propriamente dito ============ getch(); closegraph();} //==================== final do arquivo ================================== 2.1.10 - Comentários Após rodar esta versão, experimente alterar o valor das variáveis para os novos valores escritos a seguir: float xo=80; //coordenada X inicial float yo=240; //coordenada Y inicial float distanciaFocal=70; Como resultado, surgirá uma parábola diferente. As variáveis xo e yo, permitem mudar a posição que a parábola será desenhada. A variável distanciaFocal, permite alterar a forma da parábola. Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 27 Figura 2.6 – Desenho resultante na tela. 2.2 - PROGRAMA ELIPSE O programa elipse apresenta o desenho de uma elipse. O algoritimo é desenvolvido baseado no processo dos circulos concêntricos. 2.2.1 - O que é uma elipse Uma elipse é uma curva plana fechada resultante da secção de um cilindro reto por um plano oblíquo a base do cilindro (figura 2.7(a)). Também pode ser obtida pela seção de um cone reto por um plano oblíquo a base (figura 2.7(b)). ELIPSE Figura 2.7 - Obtenção da elipse por secção de um sólido (a) cilindro - (b) cone. 2.2.2 - Elementos de uma elipse Uma elipse possui vários elementos a serem identificados para executar a sua representação gráfica. Aqui são apresentados os mais importantes, que são (figura 2.8): a) Diâmetro maior: Também chamado de eixo maior (distância AB ). b) Diâmetro menor: Também chamado de eixo maior (distância CD). Os diâmetros maior e menor são perpendiculares entre sí. Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 28 c) Vértices: Extremidades dos diâmetros maior e menor (pontos A, B C e D). d) Centro: Interseção dos diâmetros maior e menor (ponto O). e) Focos: Centro dos raios vetores. A elipse tem dois focos (F e F’). e) Raios vetores: Distância 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 concêntricos O processo dos circulos concêntricos é um dos processos gráficos utilizado para desenhar uma elipse com instrumentos (figura 2.9). Os dois circulos concêntricos correspondem aos círculos traçados tendo como centro o centro da elipse e o raio da circunferência externa a metade do diâmetro maior e o da circunferência interna a metade do diâmetro menor (figura 2.9(a)). O próximo passo corresponde a dividir uma das circunferências em partes iguais, por exemplo, a maior. A partir de cada divisão, são traçados raios que cortam a circunferência interna (figura 2.9(a)). Traçando-se linhas horizontais a partir da interseção dos raios com a circunferência interna e retas verticais a partir da intersecção dos raios com a circunferência externa, resultam na interseção destas duas retas que resultam num ponto (P) pertencente a elipse (figura 2.9(b)). Realizando este traçado para cada divisão, é possível obter uma série de pontos da elipse. A união destes pontos resulta no traçado da curva (figura 2.9(c)). BA D C D C A B D C BA (a) (b) (c) Figura 2.9 - Traçado da elipse pelo processo dos círculos concêntricos. 2.2.4 - Desenvolvimento do algoritmo O algoritmo é baseado no processo gráfico dos circulos concêntricos. Deste modo, deve-se aliar a matemática e o desenho geométrico para achar a solução do problema. Inicialmente, determina-se a posição de um ponto aleatório da elipse. Pode utilizar-se de um dos pontos determinado pelas divisões iguais da circunferência externa. Na figura 2.10, pode-se observar que a determinação das coordenadas P(x,y) de um ponto qualquer, a partir do centro da elipse, pode ser obtida considerando-se o ângulo (α), e a relação dele com os raios das circunferências interna e externa. Deste modo, fazendo-se variar o ângulo (α) de um valor conhecido, é possível determinar uma série de pontos da elipse e efetuar o seu traçado. Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 29 Assim, pode-se calcular as coordenadas do ponto P(x,y) (figura 2.10) através das seguintes relações: x = Raio . cos α (1) y = raio . sen α (2) P(x)=xo+x P(y)=yo+y A D C B α y x ra ioR ai o P(x,y) (xo,yo) Figura 2.10 - Determinação das coordenadas de um ponto da curva. O traçado dos raios vetores, que são na realidade os elementos do traçado pelo processo do fio, são obtidos unindo cada foco ao ponto da curva em análise. Para isso, é necessário saber a posição de cada foco que é determinado da seguinte forma (figura 2.11): FO AO CO= −2 2 (3) Onde FO é denominada de semi-distância focal (figura 2.11). F A O D F' C B AO = FC Figura 2.11 - Determinação da posição dos focos. 2.2.5 - Fluxograma do programa O fluxograma apresenta a lógica de construção do programa. Inicialmente são definidas as variáveis do programa, calculados os parâmetros principais e desenvolvida a formulação para o desenho da curva (figura 2.12). Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 30 Desenha um trecho da curva entre dois pontos Calcula a posição do ponto P(x,y) da curva Desenha os diâmetros e os focos Armazena coordenadas X e Y varia ângulo alfa N início Determina a posição dos focos F1 e F2 Calcula a semi distância focal Parâmetros da elipse: Coordenadas do centro (x0,y0) Diâmetro Maior Diâmetro Menor Focos - F1 e F2 Ponto da curva P(x,y) Tocou alguma tecla? fim S Figura 2.12 - Fluxograma do programa elipse. 2.2.6 - Estrutura básica do programa #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #include <math.h> //======================================================== void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1); // retorna codigo de erro } Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 31 //============= inicia o programa propriamente dito =========== //========== final do programa propriamente dito =========== getch(); closegraph(); }//1 //============= final do arquivo ================ 2.2.7 - Desenvolvimento do programa Versão 1: Na Versão 1 é feito o desenho do diâmetro maior e do menor da elipse, tomando como referência o centro da elipse (cruzamento dos diametros (xo,yo)) Deste modo, para dertminar as duas retas a serem desenhadas a partir do centro tem-se (figura 2.13): A(x) = xo - DiametroMaior/2 A(y) = yo B(x) = xo + DiametroMaior/2 B(y) = yo C(x) = xo C(y) = yo - DiametroMenor/2 D(x) = xo D(y) = yo + DiametroMenor/2 xo,yo A D C B xo+DiametroMaior/2,yo xo-DiametroMaior/2,yo xo,yo-DiametroMenor/2 xo,yo+DiametroMenor/2 Figura 2.13 - Determinação dos vértices da elipse. #include <graphics.h> #include <conio.h> #include <stdlib.h>#include <stdio.h> #include <dos.h> #include <math.h> //============================================================= void main() //define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== int xo=320,yo=240; //coordenadas do centro da elipse int DiametroMaior=400,DiametroMenor=200; //diametros da elipse //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 32 getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== line(xo-DiametroMaior/2,yo,xo+DiametroMaior/2,yo); //tracado do diametro maior line(xo,yo-DiametroMenor/2,xo,yo+DiametroMenor/2); //tracado do dismetro menor //===================== final do programa propriamente dito ============ getch(); closegraph(); }//1 //==================== final do arquivo ================================== Versão 2: Na versão é determinada a posição dos dois focos F1 F2, a partir do centro da elipse. Isto pode ser visto na figura 2.11 e na equação 3. Onde F e F’, podem ser agora denominadas de F1 e F2. F1 = xo - FO (3) F2 = xo + FO (4) Nas respectivas posições, traça-se um círculo para localizar os focos. #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <dos.h> #include <math.h> //============================================================= float dobro(float x) { return( x*x); } //============================================================= void main()//define a funcao principal {//1 //=================== definicao das variaveis ================== int gdriver,gmode,errorcode; //=== variaveis graficas //=================== final das variaveis do programa=========== int xo=320,yo=240; //coordenadas do centro da elipse int DiametroMaior=400,DiametroMenor=200; //diametros da elipse float SemiDistanciaFocal; //distancia do centro da alipse até o foco float F1,F2; // focos //=================== inicializa ambiente grafico ============== gdriver=DETECT; initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi"); errorcode=graphresult(); if(errorcode!=grOk) { printf("Erro do adaptador grafico\n"); printf("Falta o arquivo EGAVGA.BGI\n"); printf("Pressione qualquer tecla para retornar"); getch(); exit(1);// retorna codigo de erro } //===================== inicia o programa propriamente dito =========== Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 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); //posição do foco circle(F2,yo,2); //posição 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 ================================== Versão 3: Nesta versão, é executado o traçado da elipse, sendo esta executada através de pequenas retas. A metodologia utilizada para determinar as coordenadas da curva, está explicada no desenvolvimento do algoritmo, nas equações 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 Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 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 formação de uma elipse pelo processo dos círculos concêntricos (figura 2.14). 2.2.8 - Comentários Após rodar esta versão, experimente alterar o valor das variáveis para os novos valores escritos a seguir: float DiametroMaior=200,DiametroMenor=400; Como resultado, surgirá uma elipse em posiçao diferente. As variáveis xo e yo, permitem mutar a posição que a elipse será desenhada. Experimente alterar DiametroMaior=300 e DiametroMenor=300. Linguagem C – Introdução à programação com aplicações gráficas 2008 Nilson Luiz Maziero nmaziero@terra.com.br 35 Figura 2.14 – Desenho da elipse na tela. 2.3 - PROGRAMA ESPIRAL DE ARQUIMEDES O programa executa o traçado de uma espiral de arquimedes. 2.3.1 - O que é uma Espiral de Arquimedes A espiral de Arquimedes é a trajetória resultante do deslocamento de um ponto (P) com velocidade retilínea uniforme sobre uma reta que possui movimento de rotação uniforme em torno de um centro (figura 2.15). Ponto P(x,y) em translação sobre a reta reta em rotação centro Figura 2.15 - Espiral de Arquimedes. 2.3.2 - Elementos de uma espiral de Arquimedes
Compartilhar