Учитывая 5 различных точек на двумерной плоскости, определите тип конического сечения, образованного точками. Выход должен быть один из circle
, hyperbola
, ellipse
, или parabola
.
правила
- Точки будут в общем линейном положении, что означает, что никакие три точки не являются коллинеарными, и поэтому проходящая через них коника будет уникальной.
- Координаты 5 точек будут десятичными числами от -10 до 10 включительно.
- Точность для десятичных значений / значений с плавающей запятой должна соответствовать точности родного типа float / decimal вашего языка. Если ваш язык / тип данных имеет произвольную точность, вы можете использовать 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
кажется, требуют проверки равенства с плавающей запятой, чтобы отличить их от очень круглого эллипса. Какую точность мы должны принять здесь?