Эллиптическая система


9

Введение

Учитывая пять точек на плоскости, ваша задача - вычислить площадь эллипса, проходящего через эти точки.

Можно предположить, что ровно один невырожденный эллипс может быть построен с заданными входными значениями.

правила

Вводим 10целые числа в любой удобной форме, соответствующей xи yкоординаты точек. Например, вы можете использовать входные данные как список 10целых чисел [x1, y1, x2, y2, ..., x5, y5]или как [[x1, y1], [x2, y2], ..., [x5, y5]], и т. Д. Вы также можете обрабатывать десятичные числа, но требуются только целые числа.

Выходные данные представляют площадь эллипса. Это может быть какое-то символическое выражение или десятичное значение с 8точностью не менее цифры.

Это код-гольф, поэтому выигрывает самый короткий ответ в байтах.

Пример ввода и вывода

Входные данные:

[-2, 3, 2, 5, 5, 3, 4, 0, 1, -3]

Вывод:

+62,15326783788685

Изображение эллипса, проходящего через эти точки:

Эллипс для этого примера

Больше примеров:

f(60, -92, -31, -10, 78, -19, -27, -35, 91, -37) = 9882.59540465108
f(-9, -4, 7, 7, 10, 1, -7, -10, 0, 7) = 269.5966648188643
f(-3, 2, 0, -5, 4, 0, -4, 1, -1, 2) = 98.54937293879908

Было ли это случайно вдохновлено этой проблемой SPOJ? http://www.spoj.com/problems/ELLIPSE/
xnor

Не было. Я не активен на этом сайте.
Итан Уорд

Что это значит, что на выходе может быть символическое выражение?
xnor

@xnor Возможно, (неоцененный) эллиптический интеграл?
Mego

2
Annnnd лучший инструмент для работы идет tooooooo: математические графические программы! Пойди разберись: P.
Волшебная Осьминог Урна

Ответы:


7

Mathematica, 87 80 78 байт

Area@ImplicitRegion[+##Sign@#&@@Det[{1,##,1##,#^2,#2^2}&@@@{x|y,##}]>0,{x,y}]&

Принимает 5 входов: [{x1, y1}, ... , {x5, y5}].

Возвращает точное / символическое значение.

Как?

Пусть f(x, y)обозначим вектор (1, x, y, xy, x^2, y^2)для некоторых x, y.

Тогда определитель матрицы с векторными строками [f(x, y), f(x1, y1), f(x2, y2), ..., f(x5, y5)]равен нулю, если (x, y)это точка на эллипсе, который мы ищем. т.е. определитель дает выражение для эллипса.

Поскольку знак выражения может быть инвертирован, мы берем постоянное слагаемое и умножаем все выражение на знак постоянной. Таким образом, мы можем установить выражение больше 0, чтобы найти область.


+1. Мне нравится, как вы решили проблему с Sign.
Виталий Кауров

5

MATLAB , 130 124 114 байтов

Входные данные взяты в виде двух векторов столбцов, один для x- и один для y-координат. Этот метод использует регрессию наименьших квадратов, которая обеспечивает точный эллипс, если все точки находятся точно на эллипсе, а затем применяет приведенную здесь формулу (спасибо @orlp) для вычисления площади.

function A=f(x,y);p=null([x.^2,2*x.*y,y.^2,2*x,2*y,0*x+1]);A=pi*det(p([1,2,4;2,3,5;4:6]))/abs(p(1)*p(3)-p(2)^2)^1.5

Добавляя следующие строки, вы даже можете построить кривую:

X=x;Y=y;
[x,y] = meshgrid(linspace(-7,7,50));
W = [x(:).^2,2*x(:).*y(:),y(:).^2,2*x(:),2*y(:),0*x(:)+1];
Z=x;Z(:) = W*p;
clf;plot(X,Y,'o');hold on;contour(x,y,Z,[0,0]);

Попробуйте онлайн!


3

Mathematica 84 байта

Я обнаружил, что это интересная проблема. Каждый эллипс является аффинным преобразованием единичного круга, который может быть параметризован как {x, y} = {Cos (t), Sin (t)}, поэтому точки на круге могут быть отображены в эллипс с помощью {xE, yE } = A {x, y} + B, где A - постоянная матрица, а B - вектор. Подстановка точек дает 10 скалярных уравнений и 11 скалярных неизвестных, но мы можем решить, что параметризация начинается при t = 0, поэтому система разрешима. Абсолютное значение определителя матрицы A - это отношение площади эллипса к единичной окружности, поэтому мы умножаем на Pi. Принимая Макс избавляется от негативного решения.

Max[π(a d-b c)/.Solve@MapThread[#2=={e,f}+{a,b}Cos@#+{c,d}Sin@#&,{{0,u,v,w,x},#}]]&

Применение:

%@{{-2, 3}, {2, 5}, {5, 3}, {4, 0}, {1, -3}}

Урожайность:

(1001 π)/(16 Sqrt[10])

2

Mathematica, 144 байта

x_±y_:=x^2a+b*x*y+y^2c+d*x+e*y+f;n=∞;Integrate[UnitStep[x±y/.FindInstance[And@@(#±#2==0&@@@#),{a,b,c,d,e,f},Reals,2][[1]]],{x,-n,n},{y,-n,n}]& 


работает для всех тестовых случаев

Пример ввода :[{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]

Результаты

9882,59540465108163146329
269,596664818864334050934
98,5493729387989852754258

-10 байт от JungHwan Min
± составляет 1 байт в кодировке окон по умолчанию [CP-1252]


Хм ... почему я получаю бесконечность на вашем входном примере?
Numbermaniac

@numbermaniac Я не знаю. Я правильно понял. вы используете этот вход [{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]?
J42161217

Да, я - это странно.
Numbermaniac

Я получаю, (3575880 π)/(2351 Sqrt[2351])что принято в качестве ответа
J42161217

1
Странно, даже ClearAllне исправить это. Да ладно, не беспокойся об этом, ха-ха. Пока это работает для вас. На какой версии Mathematica вы работаете?
номер человека

2

Desmos , 101 байт

u
v
f(a,b,c,h,k,x,y)=(((x-h)cosc+(y-k)sinc)/a)^2+(((x-h)sinc-(y-k)cosc)/b)^2
f(m,n,o,p,q,u,v)~1
mn\pi

Онлайн Desmos не любит многострочные пасты, поэтому вы должны вводить их по одной строке за раз, или

Попробуйте онлайн!

Ввод взят с двух списков uи v. Вывод отображается в последней строке.

Объяснение:

  • Первые две строки обозначают входные переменные.
  • Третья строка определяет уравнение для любого эллипса, с радиусами aи b, углом поворота cи смещением (h,k).

    • Предварительно, это выглядит так: введите описание изображения здесь
  • Четвертая строка вычисляет регрессию fпо спискам uи v, находя радиусы mи n, угол поворота oи смещение (p,q).

  • Последняя строка вычисляет площадь эллипса по формуле A = pi*r1*r2

Вы также можете попробовать онлайн (другая ссылка) для слегка расширенной интерактивной визуальной версии. Вы можете перемещаться по пяти точкам и просматривать эллипс и область в режиме реального времени:

введите описание изображения здесь

В качестве альтернативы, здесь есть более длинное решение с использованием этой формулы (аналогично ответу @ flawr ):

Desmos, 106 байт

u
v
f(A,B,C,D,E,F,x,y)=Axx+2Bxy+Cyy+2Dx+2Ey+F
f(G,H,I,J,K,L,u,v)~0
\pi(GIL+2HJK-JJK-GKK-HHL)/(GI-HH)^{1.5}

Попробуйте онлайн!


Возможно, вам не понадобится обратная косая черта piв последней строке: если я mnpiнаберу, символ пи все равно появится. Кроме того, вы имеете в виду « вывод отображается в последней строке», а не ввод?
Numbermaniac

1
@numbermaniac Я вставляю обратную косую черту, потому что, когда я копирую и вставляю ее, она не распознает mnpi, даже если она произносит слова, когда я ее печатаю. И да, я имел в виду вывод, а не ввод, спасибо.
Скотт Милнер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.