Programação Orientada por Objectos Trabalho prático para avaliação 2: Distância de um ponto a uma circunferência Considere um editor gráfico onde é agora necessário resolver instâncias do seguinte problema de geometria analítica plana: Pretende-se dada uma circunferência c e um ponto P, garantidamente exterior a c, determinar a distância d, de c a P. Se dois pontos forem definidos genericamente por (x1, y1) e (x2, y2) a distância d, é dada por: d x1 x 22 y1 y22 . A circunferência é definida pelo utilizador através de 3 dos seus pontos, designados por A, B e C. Um método de determinar o centro X, da circunferência é o seguinte (existem outros): i) Trace duas retas que passam por dois dos pontos como no exemplo: r = AB e s = BC. ii) Obtenha a reta r’ que passa pelo ponto médio da reta r e lhe é perpendicular. iii)Obtenha a reta s’ que passa pelo ponto médio da reta s e lhe é perpendicular. iv) Determine o ponto de intersecção da reta r’ com s’ que dá o centro da circunferência Para a definição das rectas auxiliares r, r’, s e s’, considere que: O declive m, de uma recta que passa por dois pontos (x1, y1) e (x2, y2) é dado por m = (y2 - y1) / (x2 - x1) Os declives de rectas perpendiculares satisfazem a igualdade m' = -1 / m Após determinado o centro o raio é a distância do centro, o ponto X, a um qualquer dos pontos A, B ou C. O método de construção da circunferência deve suportar qualquer inclinação das retas auxiliares, incluindo retas horizontais e retas verticais. Nem sempre 3 pontos definem uma circunferência. Se os 3 pontos forem colineares não é possível criar duas retas, pois os pontos pertencem à mesma reta. Notas para implementação: Todas as variáveis reais devem ser do tipo double. POO TP02 - 1/4 Programação Orientada por Objectos Deve-se tomar em atenção que uma reta paralela ao eixo dos yy tem declive infinito. Em Java o infinito positivo é representado, para os números reais double, por: Double.POSITIVE_INFINITY É assim possível comparar se um double é infinito (ignorando o sinal) com: double m; //... if (Math.abs(m) == Double.POSITIVE_INFINITY) //do something; Assim seja m0 e m1 o declive das retas r' e s' respetivamente; xc e yc as coordenadas do centro da circunferência; x0 e y0 as coordenadas do ponto médio da reta r; x1 e y1 as coordenadas do ponto médio da reta s: Se o declive de uma reta é infinito, a coordenada x do centro da circunferência é a coordenada x do ponto médio, então: Se | m0 | = ∞ xc = x0 yc = m1.(xc - x1) + y1 Se | m1 | = ∞ xc = x1 yc = m0.(xc – x0) + y0 No caso geral se nenhum declive for infinito: xc = (m1.x1 - m0.x0 + y0 - y1) / (m1 - m0) yc = m0.(xc – x0) + y0 ou yc = m1.(xc - x1) + y1 Entrada do Programa Quatro linhas, cada uma com dois valores reais, as coordenadas x e y de um ponto. As 3 primeiras linhas representam cada um dos pontos A, B e C que definem a circunferência c. A última linha as coordenadas x e y do ponto P para o qual se pretende calcular a distância à circunferência c. É assumido que os 3 pontos que definem a circunferência fornecidos são diferentes e não colineares. Saída do programa Um número real que representa a distância do ponto P à circunferência c. Exemplo de entrada 1 12 22 21 31 POO TP02 - 2/4 Programação Orientada por Objectos Exemplo de saída 1 0.8740320488976422 Exemplo de entrada 2 00 22 21 54 Exemplo de saída 2 3.5666762404093104 Entrega do trabalho prático A entrega do trabalho prático tem duas componentes: 1) Submissão de relatório e código fonte no sistema de entregas: http://www.deei.fct.ualg.pt/POO/Entregas 2) Submissão do código fonte ao Mooshak: http://mooshak.deei.fct.ualg.pt/~mooshak/ O trabalho só é considerado entregue e só será avaliado após ambas as submissões. Data limite de entregas: 31 de Outubro de 2012. 1) Submissão de relatório e código fonte no sistema de entregas Deve ser entregue um relatório: i) indicando como é obtido o centro da circunferência se for diferente do proposto neste enunciado. ii) diagrama de classe UML. Deverá ser também entregue o código fonte. Nota1: Os ficheiros com o relatório e o código fonte devem ser submetido num ficheiro com formato .zip ou .tar.gz. Nota2: O relatório e os ficheiros com o código fonte devem ter a identificação do grupo, turno e de todos os elementos do grupo. 2) Submissão de código fonte ao Mooshak O código fonte Java, desenvolvido de acordo com o enunciado e os princípios da programação orientados por objetos deve ser submetido para validação ao Mooshak, concurso POO 2012/13 problema C. Antes de submeter ao Mooshak confirme que a solução está correta no computador local de acordo com os exemplos do enunciado. POO TP02 - 3/4 Programação Orientada por Objectos Nota: O código fonte para submeter ao Mooshak poderá ser guardado num só ficheiro, ou em vários ficheiros. Se estiver guardado em vários ficheiros deverá ser compactada a pasta onde se encontram os ficheiros no formato .zip ou .tar.gz e submeter o ficheiro compactado ao Mooshak. Se o programa for desenvolvido em Eclipse pode ser compactada a pasta como o nome src dentro da pasta do projeto. POO TP02 - 4/4