Dati 5 punti distinti su un piano bidimensionale, determinare il tipo di sezione conica formata dai punti. L'uscita è una delle circle, hyperbola, ellipse, o parabola.
Regole
- I punti saranno in posizione lineare generale, il che significa che non ci sono tre punti collineari, e quindi il passaggio conico attraverso di essi sarà unico.
- Le coordinate dei 5 punti saranno numeri decimali compresi tra -10 e 10, inclusi.
- La precisione per i valori decimali / float dovrebbe essere la precisione del tipo float / decimale nativo della tua lingua. Se il tipo di lingua / dati è di precisione arbitraria, è possibile utilizzare 12 cifre dopo il punto decimale come massima precisione richiesta, arrotondando verso zero (ad es.
1.0000000000005 == 1.000000000000.). - La capitalizzazione dell'output non ha importanza.
- L'emissione
ellipsequando la sezione conica è in realtà un cerchio non è consentita. Tutti i cerchi sono ellissi, ma devi produrre quello più specifico.
Inesattezze e precisione in virgola mobile:
Sto cercando di renderlo il più semplice possibile, in modo che i problemi con imprecisioni in virgola mobile non si frappongano. L'obiettivo è che se il tipo di dati fosse "magico valore di precisione infinita" anziché float / double, allora tutto funzionerebbe perfettamente. Ma dal momento che non esiste un "valore magico di precisione infinita", scrivi un codice che presuppone che i tuoi valori siano precisione infinita e qualsiasi problema che sorga a causa di inesattezze in virgola mobile sono caratteristiche, non bug.
Casi 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
circlesembrano richiedere il controllo dell'uguaglianza dei float per distinguersi da un'ellisse molto rotonda. Quale precisione dovremmo assumere qui?