Dados 5 pontos distintos em um plano bidimensional, determine o tipo de seção cônica formada pelos pontos. A saída deve ser um dos circle
, hyperbola
, ellipse
, ou parabola
.
Regras
- Os pontos estarão na posição linear geral, significando que não há três pontos colineares e, portanto, a passagem cônica através deles será única.
- As coordenadas dos 5 pontos serão números decimais entre -10 e 10, inclusive.
- A precisão dos valores decimais / flutuantes deve ser a precisão do tipo flutuante / decimal nativo do seu idioma. Se o seu idioma / tipo de dados for de precisão arbitrária, você poderá usar 12 dígitos após o ponto decimal como a precisão máxima exigida, arredondando para zero (por exemplo
1.0000000000005 == 1.000000000000
). - A capitalização do produto não importa.
ellipse
Não é permitido emitir quando a seção cônica é realmente um círculo. Todos os círculos são elipses, mas você deve gerar o mais específico.
Em imprecisões e precisão de ponto flutuante:
Estou tentando simplificar o máximo possível, para que problemas com imprecisões de ponto flutuante não atrapalhem. O objetivo é que, se o tipo de dados fosse "valor mágico de precisão infinita" em vez de float / double, tudo funcionaria perfeitamente. Porém, como o "valor mágico de precisão infinita" não existe, você escreve um código que assume que seus valores são de precisão infinita e quaisquer problemas que surjam como resultado de imprecisões de ponto flutuante são recursos, não bugs.
Casos de teste
(0, 0), (1, 5), (2, 3), (4, 8), (9, 2) => hyperbola
(1.2, 5.3), (4.1, 5.6), (9.1, 2.5), (0, 1), (4.2, 0) => ellipse
(5, 0), (4, 3), (3, 4), (0, 5), (0, -5) => circle
(1, 0), (0, 1), (2, 1), (3, 4), (4, 9) => parabola
circle
parecem exigir a verificação da igualdade do flutuador para diferenciar de uma elipse muito redonda. Que precisão devemos assumir aqui?