Estrelas. Introdução. POO, Guião 2 Pedro Guerreiro, Fernando Brito e Abreu 1

Documentos relacionados
Guião 4: Draw a Grid

Sobre o envio de trabalhos para o Mooshak

Programação Orientada a Objetos em Java

Chilled Classics. = 2π. Primeira parte, Factorial

Usando o Eclipse - Fundamentos. Professor Vicente Paulo de Camargo

Editor Eclipse para Programas F

Guia de procedimentos para construir um programa java no IDE Sun One Studio 4 update 1, Community Edition

Pilotagem Squeak no computador Magalhães. Projecto: Geometria Básica

O AMBIENTE DE DESENVOLVIMENTO

Criar um recurso para QIM com ActivInspire - Studio

COMPUTAÇÃO E PROGRAMAÇÃO

Variáveis e Entrada de Dados Marco André Lopes Mendes marcoandre.googlepages.

CTIONSCRIPT. Painel Action

Linguagem de Programação II Programação Orientada a Objetos. Ambientes de Programação

Módulo I. Desejamos boa sorte e bom estudo! Em caso de dúvidas, contate-nos pelo site Atenciosamente Equipe Cursos 24 Horas

Linguagem de Programação III

Working 03 : Conceitos Básicos I

Exercício 1 - Resolução do ecrã. Tecnologias da Informação e Comunicação

No desenvolvimento deste guião, procure sempre colocar as denominações referidas em cada ponto.

ESQUEMA AULA PRÁTICA 0 Familiarização com o Ambiente de Desenvolvimento NetBeans Construção do primeiro programa em java.

Aula teórica 7. Preparado por eng.tatiana Kovalenko

Algoritmia e Programação APROG. Tecnologia JAVA. IDE Netbeans. Nelson Freire (ISEP DEI-APROG 2012/13) 1/31

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Introdução ao IDE Netbeans (Programação Java)


Índice. 1. Introdução Instalação: Eclipse e Android Primeira aplicação em Android... 11

Figuras. Introdução

Paradigmas da Programação PPROG. Netbeans. Projetos Ficheiro JAR Executável Atalhos Templates. Nelson Freire (ISEP DEI-PPROG 2014/15) 1/22

Implementando classes em C# Curso Técnico Integrado em Informática Fundamentos de Programação

Java Básico. Aula 1 por Thalles Cezar

Escola Secundária c/ 3º Ciclo de Ferreira Dias. CURSOS PROFISSIONAIS Ano Letivo 2012 / Atividade 2

ALGORITMOS. Professor: Diego Oliveira. Aula 06 - Tipos Primitivos de Dados

ZS Rest. Manual Profissional. BackOffice Mapa de Mesas. v2011

JUnit. Alexandre Menezes Silva Eduardo Manuel de Freitas Jorge

CONCEITOS BÁSICOS DE ORIENTAÇÃO A OBJETOS PROF. ME. HÉLIO ESPERIDIÃO

ELABORADO POR MARCO SOARES 1. Formatação de texto

Manual Prático. Elisabete Aguiar

Microsoft Word 2010 NORMA ABNT para Trabalhos Acadêmicos Conceitos Básicos

1 - Ambiente de desenvolvimento

NOVIDADES DO JAVA PARA PROGRAMADORES C

Laboratório 01 NetBeans

LINGUAGEM DE PROGRAMAÇÃO C AULA 2. Professor: Rodrigo Rocha

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

ESQUEMA AULA PRÁTICA 1

Figura Uso de coordenadas polares

Guião de Introdução ao Eclipse IDE Índice

ESQUEMA AULA PRÁTICA 1

Figura 7.2 Sentido de construção dos arcos de circunferência

CEDERJ - CENTRO DE EDUCAÇÃO SUPERIOR A DISTÂNCIA DO ESTADO DO RIO DE JANEIRO

Aula 2 A distância no espaço

Introdução ao AutoCAD Capitulo VI: Adicionar texto

Programação 2017/2018 2º Semestre

AULA TEÓRICA 3 Tema 2. Introdução a programação em Java (JVM, JDK)

Linguagem Java. Introdução. Rosemary Silveira Filgueiras Melo

SPYDER. um ambiente de desenvolvimento integrado (IDE*) para Python. Prof. Carlos Hitoshi Morimoto DCC IME USP Março, 2016

CFAC: Introdução ao AutoCAD - V. Capitulo V: Construções geométricas

Encriptação de Mensagens

Estrutura de Dados Básica

Aula 19 Elipse - continuação

Aula 01. Prof. Diemesleno Souza Carvalho /

Linguagem Técnica I. Prof. Jonatas Bastos

Classes e Objetos. Sintaxe de classe em Java

Uma Questão de Estilo Elementos de Estilo Java

Ferramentas Web, Web 2.0 e Software Livre em EVT

Alguns conceitos, regras, convenções, preparação do ambiente, primeiro programa.

Classes, instâncias e métodos de acesso. prática

Introdução ao AutoCAD Capitulo IV: Comandos de modificação

Encapsulamento. Introdução à Programação André L. Santos

Introdução ao desenho de circuitos digitais usando Xilinx WebPACK 4.1 e linguagem ABEL

Ferramentas Web, Web 2.0 e Software Livre em EVT

Colocar em prática. Colocar em prática. Tópicos para aprender

Comandos básicos do AutoCAD

Ulisses Universidade de Lisboa

Partilha de ficheiros por rede entre Mac e Windows

Ficheiros de texto 1. Ficheiros de texto. 1. Implementar um programa que leia uma frase do teclado e a escreva num ficheiro.

KODU. Como desenvolver o raciocínio lógico dos alunos

Aula 5 POO 1 Encapsulamento. Profa. Elaine Faria UFU

Para cada programa, por mais simples que seja, comece sempre por esboçar a solução desenhando um fluxograma.

PROGRAMAÇÃO I INTRODUÇÃO À ORIENTAÇÃO A OBJETOS

3. Conhecimentos Básicos

Exercícios de Corel Draw

Tutorial Rhinoceros Bicicleta

Algoritmos e Programação

Paradigmas de Programação

Programação I Curso: Sistemas de Informação. Prof.: José Ronaldo Leles Júnior .:

Copiar e colar movimentos

Informática para Ciências e Engenharias 2013/14. Teórica 7

Informática para Ciências e Engenharias 2014/15. Teórica 7

Fundamentos de Programação

Informática no Ensino de Matemática Prof. José Carlos de Souza Junior jc

Conceitos Básicos Linguagem C

Java First-Tier: Aplicações. Sobrecarga. Orientação a Objetos em Java (II) Sobrecarga de Construtores: Exemplo de Declaração

Linguagem C: Introdução

Neste exercício, vamos criar uma Folha de Cálculo, onde vamos utilizar alguns Controlos de Formulários.

ALUNO Natália Blauth Vasques. TUTORIAL RHINOCEROS Embalagem Hidratante Alfazol, Granado

Aplicações de Programação CNC/ISO com Microcomputador. João Manuel R. S. Tavares Joaquim Oliveira Fonseca

Dicas p ós gráficos InDesign

Transcrição:

Estrelas Introdução 1. Feche os olhos e veja se se lembra de todos os passos necessários para criar um projecto no Eclipse. Se não se lembrar, consulte o primeiro guião. Utilize o mesmo workspace que naquele guião. É importante ser metódico na escolha das directorias e nas convenções de nomes, porque senão depois é uma confusão. Mais vale fazer tudo certo desde o início. 2. Neste exercício, você vai declarar de raiz algumas classes e implementá-las, tal como no exercício anterior. A principal diferença, é que desta vez vai usar também algumas classes já programadas, que nós fornecemos e nas quais nem se atreva a mexer! 3. No Eclipse acrescente um novo projecto denominado Estrelas_1. Não se esqueça de seleccionar em baixo a opção Create separate source and output folders. Garanta que está a trabalhar com a versão adequada das bibliotecas do Java. Nos menus em Window / Preferences / Java / Installed JREs a versão seleccionada deve ser uma do tipo jre1.5, jre1.6, jdk1.5 ou jdk1.6 e em Window / Preferences / Java / Compiler / Compiler compliance level deve ter pelo menos o nível 5.0. O nível de compatibilidade do compilador não deve ser nunca superior à versão instalada das bibliotecas (ex: nível 5.0 com a jre1.4) ou então teremos problemas de compilação. 4. Vá ao sistema operativo e na sua directoria poo\java\guiões crie uma subdirectoria denominada Library para guardar as classes de biblioteca. Uma vez dentro dessa subdirectoria, extraia para lá os ficheiros fornecidos no zip que está aqui (também pode ir através da página e procurar Classes do prof, em 9 de Março ). Respeite a estrutura de directórios contida no zip. Verifique que na directoria Library\poo ficam quase 30 classes. A maioria delas, como as classes Figure, Point, Triangle, Square, Polyline, Polygon, FigureComposite e as correspondentes xxxtester e xxxtestergraphical devem ser-lhe familiares porque foram usadas nas aulas teóricas. Não se assuste, que vamos apenas necessitar de algumas aqui. Além disso você não vai modificar estas classes, apenas as vai usar tal como estão, isto é, sem lhes mexer! Se não respeitar esta regra, isto é, se modificar as classes de biblioteca, depois não se queixe 5. Volte ao Eclipse, que na janela Package Explorer deve exibir o projecto Estrelas_1 (além do Parabola_1, do primeiro guião). Seleccione o projecto Estrelas_1, clique no botão do lado direito do rato e no menu que aparece seleccione a opção Build Path / Link Source e depois no botão Browse escolha a directoria Library. Dentro do projecto corrente devem aparecer agora as subdirectorias src e Library, a última das quais tem ainda dentro a subdirectoria poo. Se nesta última não aparecerem as classes de biblioteca (ficheiros com extensão java) que lá colocou, então carregue em F5 (Refresh) e lá estarão elas! Se as classes PointUnitTests e TriangleUnitTests tiverem um cartão vermelho, é porque falta a biblioteca do JUnit. Seleccione o projecto Estrelas_1, clique no botão do lado direito do rato e no menu que aparece seleccione a opção Build Path / Add Libraries e depois escolha a biblioteca JUnit com a versão 4. Esta última aparecerá no Package Explorer e os cartões vermelhos deverão desaparecer. POO, 2006-2007 Guião 2 Pedro Guerreiro, Fernando Brito e Abreu 1

6. Algumas dicas sobre as classes que iremos usar. A classe Point, que herda de Figure, representa pontos no plano. A classe Line que também herda de Figure, representa rectas. A classe Figure é uma classe abstracta que representa figuras, em geral. Dê outra vista de olhos, agora com mais atenção, a estas classes. Pontos são figuras. Logo, todas as operações que pudermos fazer com figuras, também podemos fazer com pontos. Esta observação fundamental está consagrada na declaração class Point extends Figure. Interpretamos isto como significando que a classe Point herda todas as funções da classe Figure. Também herdaria os membros de dados, se a classe Figure tivesse membros de dados, mas não tem. O mesmo pode ser dito em relação às rectas e à classe Line, que também herda da classe Figure. 7. Seleccione o directório src e crie (botão do rato do lado direito, New / Class) no package poo (indique-o explicitamente) a classe Main com a função main dentro dela (seleccione a check-box correspondente) através do menu em File / New / Class. Recorde que o Mooshak está à espera de uma classe Main, e vai correr a função main dessa classe. É nesta classe Main que iremos incluir também as funções de arranque das tarefas para o Mooshak. Não se esqueça que o Java é uma linguagem case-sensitive, isto é, onde é reconhecida a diferença entre um carácter escrito em minúsculas e maiúsculas. 8. Agora acrescente uma linha na função main, apenas com a declaração de uma variável de tipo Point. Não dá erro? Se sim, é bom sinal. Se não, veja o que se passa antes de continuar. 9. Para começar a fazer qualquer coisa, escreva uma função de teste, test1, que aceita um ponto a partir da consola (use a classe Scanner) e depois move-o 2 para a direita, 1 para baixo, roda-o de 90 graus e escala-o 0.5. Recorde que o argumento da função rotate vem expresso em radianos, não em graus. Use a constante Math.PI. 10. Generalizemos esta função test1 numa função interactiva mais geral, testoperations. O ponto p é inicializado por defeito. A função é cíclica. Em cada passo do ciclo pede um comando que pode ser r, s ou t. Se for r, pede a seguir um número inteiro de graus e roda o ponto desse número de graus. Se for s, pede a seguir os factores de escala na horizontal e na vertical e escala o ponto segundo esses factores de escala. Se for t, pede a seguir o deslocamento horizontal e o deslocamento vertical e translada o ponto de acordo com esses deslocamento. Se o comando não for uma daquelas três letras, não tem efeito, isto é, o ponto fica na mesma. De cada vez, mostra as novas coordenadas do ponto. Termina com Ctrl-Z. Tarefa A - Point 11. Passemos à tarefa A, para submissão ao Mooshak. A tarefa, programada na função task_a, é semelhante à função testoperations, mas agora não há interacção e o programa processa uma série de linhas de comando que são lidas da consola. Cada linha de comando começa com uma letra r, s, t, como antes, ou w. As linhas que começam com r contêm a seguir um número inteiro que representa o ângulo de rotação em graus. As linhas que começam por s ou t contêm mais dois números reais que representam os factores de escala ou os deslocamentos, respectivamente. As linhas de comando que começam por w não têm mais nada. O seu efeito é escrever na consola as coordenadas do ponto, com três casas decimais. Note que na função testoperations o ponto era mostrado depois de cada operação. Aqui é mostrado só em resposta ao comando w. POO, 2006-2007 Guião 2 Pedro Guerreiro, Fernando Brito e Abreu 2

12. Como exemplo, considere o seguinte ficheiro de teste: t 3 4 r 45 w s -1 1.5 r -30 t 2.5-5 w r 90 w 13. Neste caso, o ficheiro de saída é o seguinte: -0.707 4.950 6.825 1.076-1.076 6.825 14. Não se esqueça daquela questão do 0.0 abordada nas aulas teóricas. 15. Já está tudo pronto para submeter? Então atenção: submeta só o seu ficheiro Main.java. Não submeta os ficheiros da biblioteca porque esses já estão no Mooshak. Se você os submeter vai ter erros de compilação (por causa da duplicação de ficheiros). Esta observação é válida para todas as tarefas deste guião. Note que mesmo havendo só um ficheiro para submeter, é preciso enviá-lo zipado. 16. Avancemos. Ainda para treinar com a classe Point, escreva agora outra função de teste, testregular, que pede um número e calcula os vértices de um polígono regular com esse número de lados, centrado na origem, começando no ponto de coordenadas <1, 0> e inscrito na circunferência de raio unitário. Como resultado, queremos ver na consola as coordenadas dos vértices, com duas casas decimais. Os vértices devem ser guardados num ArrayList<Point>. 17. Ainda mais uma função de teste: testregulartransformed. Esta função pede cinco números: o número de vértices, as duas coordenadas do centro e os dois factores de escala (horizontal e vertical). Nesta função o polígono deve aparecer centrado no ponto indicado e com a deformação provocada pelo escalamento com os factores indicados. Tarefa B - Circle 18. Passemos agora à primeira classe nova de hoje, a classe Circle. A sua tarefa é desenhar e implementar esta classe para representar círculos ou circunferências no plano cartesiano. Cada objecto de tipo Circle tem dois membros de dados, o centro, center_, de tipo Point, e o raio, radius_, de tipo double. Como uma circunferência é uma figura, podemos fazer a nossa nova classe herdar da classe Figure, ou seja: public class Circle extends Figure{... } 19. Inclua para começar um construtor por defeito, que inicializa um círculo de raio 1 centrado na origem, um construtor elementar (rural), com argumentos para o centro e para o raio, os selectores para o centro e para o raio, para a área e para o perímetro, as operações scale, translate, rotate e tostring análogas às da classe Point. Mas repare: rodar um círculo não é rodá-lo em torno do seu centro, que POO, 2006-2007 Guião 2 Pedro Guerreiro, Fernando Brito e Abreu 3

deixaria tudo na mesma, mas sim rodá-lo em torno da origem. Além disso, escalar um círculo, é uma operação que só faz sentido se os dois factores de escala forem iguais. De facto, uma circunferência não pode ser escalada diferentemente segundo os dois eixos, pois deixaria de ser uma circunferência, não é? Assinalaremos essa restrição fundamental com um assert à entrada da função scale, com a seguinte sintaxe: assert fx == fy; Finalmente, escalar um círculo não é apenas multiplicar o raio por esse factor de escala. Em geral, escalar uma figura é aplicar o factor de escala (ou os factores de escala, se houver um factor de escala para cada direcção) a cada um dos pontos da figura. 20. Avance pausadamente. Primeiro declare a classe Circle (herdando de Figure) só com os membros de dados e os construtores. Pode usar o Eclipse para gerar automaticamente os selectores (getters) e os modificadores (setters) dos membros de dados na seguinte opção dos menus: Source / Generate Getters and Setters. 21. Repare que mesmo que tudo o resto esteja bem, a instrução de declaração da classe Circle indica a existência de erros. Se colocar o rato em cima da lâmpada com o cartão vermelho irá verificar que o erro se deve ao facto de esta classe ainda não implementar um conjunto de métodos abstractos (scale, rotate, translate, etc) herdados da classe Figure. Ainda com o botão no cartão vermelho carregue no botão do lado direito do rato e escolha a opção Quick Fix e depois a opção Add unimplemented methods. Isto permite-lhe gerar automaticamente a declaração dos métodos em falta, mas não o seu corpo. O compilador já não dá erro, mas ainda é preciso que você programe o corpo desses métodos. Agora é a altura de o fazer, com base no que foi dito alguns parágrafos atrás! 22. Programe agora as três funções scale, translate e rotate. Não é muito difícil, pois não? Escreva uma função de teste unitário para testar cada uma delas separadamente e uma outra para testar as três em conjunto. 23. Para programar a função clone inspire-se na congénere definida na class Point. Para implementar a função draw(graphics g) use a função drawoval definida na class Graphics. Para implementar a função draw(canvasbasic x) use a função drawellipse definida na class CanvasBasic. 24. Programe agora as funções para a área e para o perímetro. Crie a classe CircleUnitTests, análoga à PointUnitTests, para lá incluir as funções a utilizar pelo JUnit. Escreva logo uma função de teste unitário, testareaperimeter, com asserts: quando o raio é 1, quanto vale a área? E o perímetro? E quando o raio é 2.5? 25. Programe agora a função tostring, por analogia com a da classe Point. 26. Acrescente uma função booleana contains com um argumento de tipo Point que dê true se o ponto pertencer ao círculo, isto é, se estiver sobre a circunferência ou no interior da circunferência. Programe também uma função de teste unitário e experimente. 27. Acrescente outra função contains agora com um argumento de tipo Circle. Esta função dá true se o argumento estiver todo dentro do objecto. (Um círculo A está dentro de um círculo B se qualquer ponto que pertence a A também pertence a B.) Programe também uma função de teste unitário e experimente. Considere, nesta função, várias configurações de círculos. 28. Acrescente uma função booleana intersects com um argumento de tipo Circle. A função dá true se o objecto tiver pelo menos um ponto em comum com o argumento. Programe também uma função de teste unitário e experimente. 29. Acrescente uma função pointat, com um parâmetro de tipo double representando um ângulo e um resultado de tipo Point, para calcular o ponto sobre a circunferência que se encontra à distância angular dada do ponto do círculo mais à POO, 2006-2007 Guião 2 Pedro Guerreiro, Fernando Brito e Abreu 4

direita, no sentido contrário ao dos ponteiros do relógio. Talvez você queira investigar aquela função rotatearound que vem na classe Figure, e que é herdada pela classe Point. 30. Vamos à tarefa B. É um problema com círculos e pontos que até podia ser um problema do concurso de programação em vez de uma tarefa de guião. É sobre tiro ao alvo. Um alvo, todos sabemos, é um conjunto de círculos concêntricos. Se houver, por exemplo 10 círculos, quem acertar na mosca ganha 10 pontos, pois o tiro fica dentro de exactamente 10 círculos. Se o tiro ficar, por exemplo, fora do sexto círculo (a contar do meio) mas dentro do sétimo, então vale 4 pontos, pois fica dentro de 4 círculos (o sétimo, o oitavo, o nono e o décimo). Quer dizer, em geral, o valor de um tiro, em pontos, é dado pelo número de círculos dentro dos quais o tiro ficou. 31. Agora, generalizemos, determinando que um alvo generalizado é um conjunto de círculos não necessariamente concêntricos. Vamos fazer tiro ao alvo com um alvo destes. Ou, melhor, vamos escrever um programa para avaliar uma sequência de tiros ao alvo generalizado. Os dados são os círculos e os tiros e o resultado é a pontuação total obtida e o número de tiros, conjuntamente com uma tabela de pares que indica quantos tiros tiveram quantos pontos. Na primeira linha do ficheiro de entrada vem um número N que representa o número de círculos. Nas N linhas seguintes vêm três números reais que determinam as coordenadas x e y do centro e o raio de cada um dos N círculos. Segue-se uma sequência de linhas, em número indeterminado, cada uma com dois números reais, representando as coordenadas x e y de um tiro. Eis um exemplo de um ficheiro de dados, com seis círculos e nove tiros: 6 0 0 2 0.5 0 1-0.5 0 1 0-0.5 1 0 3 1 1.5 1.5 0.5 0 0 5 5 0.2 3-1.5 0-1.5 0.1 0 0 0 1 0 2 0.1 0.1 32. Na primeira linha do ficheiro de resultados vêm dois números inteiros, separados por um espaço: o primeiro representa a pontuação total obtida e o segundo o número de tiros. Seguem-se algumas linhas, no máximo N+1 (N é o número de círculos), no mínimo zero, cada uma com dois números, P e T, separados por um espaço, tal que T é o número de tiros que obtiveram P pontos. Estas linhas vêm por ordem decrescente de P e só interessam os casos em que T é maior do que zero. O ficheiro de resultados que corresponde ao caso anterior é o seguinte: 19 9 4 3 2 2 1 3 0 1 POO, 2006-2007 Guião 2 Pedro Guerreiro, Fernando Brito e Abreu 5

33. Faça as verificações do costume e quando tiver a certeza de que o seu programa vai ser aceite, submeta a tarefa B. Agora é preciso enviar vários ficheiros: não se esqueça de os zipar. 34. Espero que você tenha tido a ideia de definir uma classe Target para representar o alvo e que tenha reflectido maduramente sobre as funções nesta classe que ajudam a resolver o problema. 35. Continuemos. Acrescente à classe Circle uma função sampling, com dois argumentos, um int e um double, e resultado de tipo ArrayList<Point>. O resultado é um vector de tantos pontos quanto o número inteiro indicado no argumento, recolhidos equidistantemente ao longo da circunferência, no sentido contrário ao dos ponteiros do relógio, começando no ponto cujo ângulo é especificado pelo segundo argumento (o de tipo double). Parece complicado, mas não é. 36. Programe uma função de teste, testplotcircles, recorrendo à função sampling, para desenhar numa janela (JFrame) os círculos definidos na primeira parte do ficheiro de dados da tarefa B. 37. Se você programou uma classe Target para o alvo, a função do ponto anterior limitar-se-á a chamar uma nova função dessa classe, não é? (E não teria sido má ideia definir uma função plot também na classe Circle...) 38. Isto conclui a parte do exercício sobre a classe Circle. Vamos agora passar a outra classe, a classe Star, que representa estrelas. Tarefa C - Star 39. As estrelas são figuras, é claro. O construtor da classe Star indica o número de pontas da estrela e o passo. Este conceito de passo percebe-se bem com um ou dois exemplos: numa estrela de 5 pontas e passo 2, podemos numerar os vértices de 0 a 4 e então os lados são na sequência 0-2, 2-4, 4-1, 1-3, 3-0. Numa estrela de sete pontas e passo 3, os lados são 0-3, 3-6, 6-2, 2-5, 5-1, 1-4, 4-0. Nos casos em que o número de pontas e o passo não são números primos entre si é como se houvesse várias estrelas sobrepostas. Por exemplo, numa estrela de seis pontas e passo 2, os lados são 0-2, 2-4, 4-0, 1-3, 3-5, 5-1. 40. Pense se seria possível implementar a classe Star à custa da classe Polygon fornecida na biblioteca Library. Se optar por construir a classe Star de raiz, poderá utilizar a classe Segment para representar cada um dos lados da estrela. Neste último caso, cada objecto da classe Star teria um membro de dados do tipo ArrayList<Segment>, para guardar os lados da estrela. 41. O construtor da classe Star inicializa uma estrela centrada na origem inscrita na circunferência de raio 1, com vértices equidistantes e tal que o primeiro vértice está virado para norte. Além disso, os vértices são numerados no sentido contrário ao dos ponteiros do relógio. (O vértice 0 é o tal que está para norte.) Para colocar a estrela noutro sítio, para mudar o tamanho, para rodar em torno da origem, a classe Star terá funções translate, scale e rotate, como a classe Circle. 42. Talvez dê jeito usar o algoritmo de Euclides para o máximo divisor comum (veja uma versão recursiva em http://en.wikipedia.org/wiki/euclidean_algorithm). 43. Desenhar uma estrela é desenhar os seus lados, claro está. Não se esqueça de implementar as funções draw, que deverão desenhar os vários segmentos de recta correspondentes a cada lado da estrela. Veja na classe Polyline como isso se poderá fazer. POO, 2006-2007 Guião 2 Pedro Guerreiro, Fernando Brito e Abreu 6

44. A tarefa C é para testar a classe Star. Dada uma estrela e algumas operações de translação, escalamento e rotação, especificadas como na tarefa A, queremos calcular a estrela final. O ficheiro de dados é como o dessa tarefa, com uma linha suplementar no início e sem comandos w. A linha inicial tem dois números inteiros, que indicam o número de lados e o passo da estrela. O ficheiro final tem tantas linhas quanto o número de lados: em cada uma vêm quatro números reais, as coordenadas x e y das extremidades de cada lado, pela ordem indicada no ponto 39. Os números são escritos com duas casas decimais, separados por um espaço. Eis um exemplo de ficheiro de dados: 5 2 t 2 2 s 0.5 0.5 r 36 45. O correspondente resultado é o seguinte: -0.07 1.80 0.22 0.90 0.22 0.90 0.52 1.80 0.52 1.80-0.25 1.24-0.25 1.24 0.70 1.24 0.70 1.24-0.07 1.80 Tarefa D 46. Agora que você já é perito em estrelas, escreva uma função de teste, testeurope, para construir virtualmente uma circunferência de doze estrelas de cinco pontas, como na bandeira da União Europeia. Sim, queremos usar um vector de doze estrelas. Pode usar uma variável do tipo ArrayList<Star>. 47. Já sabemos que a bandeira da União Europeia tem doze estrelas e que esse número não tem a ver com o número de países membros, ao contrário do que acontece com as estrelas na bandeira dos Estados Unidos, onde há uma por cada estado. POO, 2006-2007 Guião 2 Pedro Guerreiro, Fernando Brito e Abreu 7

Mas suponhamos que queremos fazer um estudo sobre bandeiras europeias com mais (ou menos) estrelas. Pois bem, a tarefa D é para desenhar virtualmente bandeiras com um círculo de estrelas de cinco pontas e passo 2, iguais e equidistantes: varia o número de estrelas, o centro do círculo, o raio do círculo, o raio das estrelas e o ângulo da primeira estrela (na circunferência sobre a qual está o centro de todas as estrelas). Estes valores vêm no ficheiro de dados: na primeira linha, as coordenadas do centro e o raio do círculo, na segunda, o número de estrelas, na terceira, o raio das estrelas (isto é, o raio da circunferência em que as estrelas, que são todas iguais, estão inscritas) e, na quarta, o ângulo em graus da primeira estrela. São todos números reais excepto o número de estrelas. Eis um exemplo, com 12 estrelas, como na bandeira da União Europeia: 4.0 3.0 2.4 12 0.6 90 48. Cada linha do ficheiro de saída tem 10 números reais escritos com uma casa decimal, separados por um espaço, representando as coordenadas x e y de cada um dos cinco vértices da estrela, na sequência dos lados (0-2-4-1-3). As estrelas são escritas a partir da primeira, no sentido contrário ao dos ponteiros do relógio. Para o ficheiro de teste anterior, o ficheiro de saída terá 12 linhas. As três primeiras são as seguintes: 4.0 6.0 3.6 4.9 4.6 5.6 3.4 5.6 4.4 4.9 2.8 5.7 2.4 4.6 3.4 5.3 2.2 5.3 3.2 4.6 1.9 4.8 1.6 3.7 2.5 4.4 1.4 4.4 2.3 3.7 Desenhando POO, 2006-2007 Guião 2 Pedro Guerreiro, Fernando Brito e Abreu 8

49. Escreva uma função de teste, testusa, para reconstituir virtualmente o desenho das estrelas na bandeira dos Estados Unidos: são cinquenta estrelas de cinco pontas dispostas em nove filas com 6, 5, 6, 5, 6, 5, 6, 5, 6 estrelas. As filas mais curtas estão desfasadas das mais compridas. 50. Desenhe numa janela os padrões de estrelas da bandeira da União Europeia e da bandeira dos Estados Unidos. Faça um Print Screen e integre no relatório deste guião a depositar no Moodle. 51. Se tiver coragem faça também a bandeira da China! 52. Não ficou com os olhos em bico, pois não? 53. FIM. POO, 2006-2007 Guião 2 Pedro Guerreiro, Fernando Brito e Abreu 9