Давши 5 чітких точок на двовимірній площині, визначте тип конічного перерізу, утвореного точками. Вихід повинен бути один з circle
, hyperbola
, ellipse
, або parabola
.
Правила
- Точки будуть у загальному лінійному положенні, тобто три точки не є колінеарними, і, таким чином, конічний прохід через них буде унікальним.
- Координати 5 балів будуть десятковими числами від -10 до 10 включно.
- Точність значень для десятків / поплавків повинна бути точністю рідного поплавця / десяткового типу вашої мови. Якщо ваш мова / тип даних є довільною точністю, ви можете використовувати 12 цифр після десяткової крапки як максимально необхідну точність, округлюючи до нуля (наприклад
1.0000000000005 == 1.000000000000
). - Капіталізація випуску не має значення.
- Виведення,
ellipse
коли конічний переріз насправді є колом, заборонено. Усі кола - це еліпси, але потрібно вивести найбільш конкретний.
Про неточності та точність плаваючої точки:
Я намагаюся зробити це якомога простіше, щоб проблеми з неточностями з плаваючою точкою не заважали. Мета полягає в тому, якби тип даних був "магічним значенням нескінченної точності" замість float / double, то все працювало б ідеально. Але оскільки "магічне значення нескінченної точності" не існує, ви пишете код, який передбачає, що ваші значення - це нескінченна точність, а будь-які проблеми, які виникають внаслідок неточностей з плаваючою комою, - це функції, а не помилки.
Випробування
(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
схоже, потрібна перевірка рівності поплавця, щоб відрізняти його від дуже круглого еліпса. Яку точність ми повинні припустити тут?