Układ eliptyczny

9

Wprowadzenie

Biorąc pod uwagę pięć punktów w płaszczyźnie, Twoim zadaniem jest obliczenie obszaru elipsy przechodzącej przez te punkty.

Możesz założyć, że dokładnie jedna nie-zdegenerowana elipsa może być zbudowana z podanych wartości wejściowych.

Zasady

Dane wejściowe to 10liczby całkowite w dowolnej dogodnej formie, odpowiadające xi ywspółrzędne punktów. Na przykład, możesz wziąć dane wejściowe jako listę 10liczb całkowitych [x1, y1, x2, y2, ..., x5, y5]lub jako [[x1, y1], [x2, y2], ..., [x5, y5]]itd. Możesz także obsługiwać liczby dziesiętne, ale wymagane są tylko liczby całkowite.

Dane wyjściowe są reprezentacją obszaru elipsy. Może to być jakieś wyrażenie symboliczne lub wartość dziesiętna z co najmniej 8cyframi dokładności.

To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach.

Przykład wejścia i wyjścia

Wejście:

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

Wynik:

62,15326783788685

Przedstawienie elipsy przechodzącej przez te punkty:

Elipsa dla tego przykładu

Więcej przykładów:

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
Ethan Ward
źródło
Czy była to jakaś szansa zainspirowana tym problemem SPOJ? http://www.spoj.com/problems/ELLIPSE/
xnor
Nie było. Nie jestem aktywny na tej stronie.
Ethan Ward
Co to znaczy, że wynik może być wyrażeniem symbolicznym?
xnor
@xnor Być może (nieoceniona) całka eliptyczna?
Mego
2
Annnnd najlepsze narzędzie do pracy tooooooo: Programy do matematyki! Idź rysunek: P.
Magic Octopus Urn

Odpowiedzi:

7

Mathematica, 87 80 78 bajtów

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

Trwa 5 wejść: [{x1, y1}, ... , {x5, y5}].

Zwraca dokładną / symboliczną wartość.

W jaki sposób?

Niech dla niektórych f(x, y)oznacza wektor .(1, x, y, xy, x^2, y^2)x, y

Następnie wyznacznikiem macierzy z wektorami rzędowymi [f(x, y), f(x1, y1), f(x2, y2), ..., f(x5, y5)]jest zero, a iff (x, y)to punkt elipsy, której szukamy. tzn. wyznacznik daje wyrażenie elipsy.

Ponieważ znak wyrażenia może być odwrócony, przyjmujemy stały wyraz i mnożymy całe wyrażenie przez znak stałej. W ten sposób możemy ustawić wyrażenie większe niż 0, aby znaleźć obszar.

JungHwan Min
źródło
+1. Podoba mi się, jak rozwiązałeś problem Sign.
Vitaliy Kaurov
5

MATLAB , 130 124 114 bajtów

Dane wejściowe są takean jako dwa wektory kolumnowe, jeden dla współrzędnych xi jeden dla współrzędnych y. Ta metoda wykorzystuje regresję co najmniej sekwensów, która zapewnia dokładną elipsę, jeśli wszystkie punkty znajdują się dokładnie na elipsie, a następnie stosuje wzór podany tutaj (dzięki @orlp), aby obliczyć obszar.

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

Dołączając następujące linie, możesz nawet wykreślić krzywą:

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]);

Wypróbuj online!

wada
źródło
3

Mathematica 84 bajtów

Uważam to za interesujący problem. Każda elipsa jest afiniczną transformacją koła jednostkowego, którą można sparametryzować jako {x, y} = {Cos (t), Sin (t)}, więc punkty na okręgu można odwzorować na elipsę za pomocą {xE, yE } = A {x, y} + B, gdzie A jest stałą macierzą, a B jest wektorem. Podłączenie punktów daje 10 równań skalarnych i 11 niewiadomych skalarnych, ale możemy zdecydować, że parametryzacja rozpoczyna się od t = 0, więc układ jest rozwiązywalny. Wartość bezwzględna wyznacznika macierzy A jest stosunkiem pola elipsy do koła jednostkowego, więc mnożymy przez Pi. Biorąc Max pozbywa się negatywnego rozwiązania.

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

Stosowanie:

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

Wydajność:

(1001 π)/(16 Sqrt[10])
Kelly Lowder
źródło
2

Mathematica, 144 bajty

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}]& 


działa dla wszystkich przypadków testowych

Przykład wprowadzania :[{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]

Wyniki

9882.59540465108163146329
269.596664818864334050934
98.5493729387989852754258

-10 bajtów od JungHwan Min
± to 1 bajt w domyślnym kodowaniu okien [CP-1252]

J42161217
źródło
Hmm ... dlaczego dostaję nieskończoność na twoim przykładzie wprowadzania?
numbermaniac
@numbermaniac Nie wiem. Mam rację. czy używasz tego wejścia [{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]?
J42161217,
Tak, jestem - to dziwne.
numbermaniac
Dostaję, (3575880 π)/(2351 Sqrt[2351])co jest akceptowane jako odpowiedź
J42161217
1
Dziwne, nawet ClearAlltego nie naprawia. No cóż, nie martw się haha. Tak długo, jak to działa dla ciebie. W jakiej wersji Mathematica korzystasz?
numbermaniac
2

Desmos , 101 bajtów

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

Online Desmos nie lubi past wielowierszowych, więc musisz wprowadzić go w jednym wierszu na raz lub

Wypróbuj online!

Dane wejściowe są pobierane z dwóch list ui v. Dane wyjściowe są wyświetlane w ostatnim wierszu.

Wyjaśnienie:

  • Pierwsze dwa wiersze nazywają zmienne wejściowe.
  • Trzecia linia określa równanie dla dowolnej elipsy, z promieniami ai bkątem obrotu coraz przesunięciem (h,k).

    • Prettified, wygląda to tak: wprowadź opis zdjęcia tutaj
  • Czwarta linia oblicza regresję fponad listami uoraz vznajdowanie promieni mi nkąta obrotu ooraz przesunięcia (p,q).

  • Ostatni wiersz oblicza pole elipsy za pomocą wzoru A = pi*r1*r2

Możesz także wypróbować online (inny link), aby uzyskać nieco rozszerzoną, interaktywną wersję wizualną. Możesz poruszać się po pięciu punktach i wyświetlać elipsę i obszar w czasie rzeczywistym:

wprowadź opis zdjęcia tutaj

Alternatywnie, oto nieco dłuższe rozwiązanie przy użyciu tej formuły (to samo co odpowiedź @ flawr ):

Desmos, 106 bajtów

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}

Wypróbuj online!

Scott Milner
źródło
Być może nie będziesz potrzebować odwrotnego ukośnika piw ostatnim wierszu: jeśli wpiszesz mnpi, symbol pi nadal się wyświetla. Czy masz również na myśli „ wynik jest wyświetlany w ostatnim wierszu”, a nie wejście?
numbermaniac
1
@numbermaniac Wstawiam odwrotny ukośnik, ponieważ kiedy go kopiuję-wklejam, nie rozpoznaje mnpi, nawet jeśli wypowiada słowa. I tak, miałem na myśli dane wyjściowe, a nie wejściowe, dzięki.
Scott Milner,