Étant donné 5 points distincts sur un plan bidimensionnel, déterminez le type de section conique formée par les points. La sortie est un des circle, hyperbola, ellipseou parabola.
Règles
- Les points seront en position linéaire générale, ce qui signifie qu'il n'y a pas trois points colinéaires, et donc la conique qui les traverse sera unique.
- Les coordonnées des 5 points seront des nombres décimaux compris entre -10 et 10 inclus.
- La précision des valeurs décimales / flottantes doit être la précision du type natif flottant / décimal de votre langue. Si votre langue / type de données est à précision arbitraire, vous pouvez utiliser 12 chiffres après la virgule comme précision maximale requise, en arrondissant vers zéro (par exemple
1.0000000000005 == 1.000000000000). - La capitalisation de la production n'a pas d'importance.
- La sortie
ellipselorsque la section conique est en fait un cercle n'est pas autorisée. Tous les cercles sont des ellipses, mais vous devez produire le plus spécifique.
Sur les imprécisions et la précision en virgule flottante:
J'essaie de rendre cela aussi simple que possible, afin que les problèmes d'inexactitudes en virgule flottante ne gênent pas. Le but est que si le type de données était "valeur de précision infinie magique" au lieu de float / double, alors tout fonctionnerait parfaitement. Mais, comme la "valeur de précision infinie magique" n'existe pas, vous écrivez du code qui suppose que vos valeurs sont d'une précision infinie, et tous les problèmes qui surviennent à la suite d'inexactitudes en virgule flottante sont des fonctionnalités, pas des bogues.
Cas de test
(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
circlesemblent nécessiter la vérification de l'égalité des flotteurs pour se distinguer d'une ellipse très ronde. Quelle précision faut-il assumer ici?