Еліптична система


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 Можливо (неоцінений) еліптичний інтеграл?
Мего

2
Ознайомтеся з найкращим інструментом для роботи tooooooo: Математичні графічні програми! Іди фігура: P.
Чарівна урна восьминога

Відповіді:


7

Математика, 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

Математика 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

Математика, 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-байт у кодуванні Windows за замовчуванням [CP-1252]


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

@numbermaniac Я не знаю. Я правильно розумію Ви використовуєте цей вхід [{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]?
J42161217

Так, я - це дивно.
numbermaniac

Я отримую, (3575880 π)/(2351 Sqrt[2351])що прийнято як відповідь
J42161217

1
Дивно, навіть ClearAllце не виправляє. Ну добре, не хвилюйся про це ха-ха. Поки це працює на вас. На якій версії Mathematica ви працюєте?
numbermaniac

2

Десмос , 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

Інтернет- Десмос не любить багаторядкові пасти, тому вам доведеться вводити їх по одному рядку, або

Спробуйте в Інтернеті!

Вхід береться з двох списків uіv . Висновок відображається в останньому рядку.

Пояснення:

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

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

  • Останній рядок обчислює формулу еліпса за формулою A = pi*r1*r2

Ви також можете спробувати його в Інтернеті (інше посилання) для трохи розширеної, інтерактивної візуальної версії. Ви можете переміщатися по п'яти точках і переглядати еліпс і область в режимі реального часу:

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

Крім того, тут є дещо довше рішення з використанням цю формулу (те саме, що відповідь @ flawr ):

Десмос, 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ввожу, символ pi все ще з’явиться. Також ви маєте на увазі " вихід відображається в останньому рядку", а не введення?
numbermaniac

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