Sistema ellittico


9

introduzione

Dati cinque punti nel piano, il tuo compito è calcolare l'area dell'ellisse che passa attraverso questi punti.

Si può presumere che esattamente un'ellisse non degenerata possa essere costruita con i valori di input indicati.

Regole

L'input è un numero 10intero in qualsiasi forma conveniente, corrispondente alle coordinate xe ydei punti. Ad esempio, è possibile prendere l'input come un elenco di 10numeri interi [x1, y1, x2, y2, ..., x5, y5]o come [[x1, y1], [x2, y2], ..., [x5, y5]], ecc. È inoltre possibile gestire numeri decimali, ma sono richiesti solo numeri interi.

L'output è una rappresentazione dell'area dell'ellisse. Potrebbe trattarsi di un'espressione simbolica o di un valore decimale con almeno 8cifre di precisione.

Questo è code-golf, quindi vince la risposta più breve in byte.

Esempio di input e output

Ingresso:

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

Produzione:

62,15326783788685

Una rappresentazione dell'ellisse che passa attraverso questi punti:

L'ellisse per questo esempio

Altri esempi:

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

Questo è stato per caso ispirato a questo problema SPOJ? http://www.spoj.com/problems/ELLIPSE/
xnor

Non era. Non sono attivo su quel sito.
Ethan Ward,

Cosa significa che l'output può essere un'espressione simbolica?
xnor

@xnor Forse un integrale ellittico (non valutato)?
Mego

2
Annnnd lo strumento migliore per il lavoro va anche troppo: programmi di grafica matematica! Vai figura: P.
Magic Octopus Urn,

Risposte:


7

Mathematica, 87 80 78 byte

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

Prende 5 ingressi: [{x1, y1}, ... , {x5, y5}].

Restituisce un valore esatto / simbolico.

Come?

Lasciate f(x, y)indicare il vettore (1, x, y, xy, x^2, y^2)per un po ' x, y.

Quindi, il determinante della matrice con i vettori di riga [f(x, y), f(x1, y1), f(x2, y2), ..., f(x5, y5)]è zero sef (x, y)è un punto sull'ellisse che stiamo cercando. cioè il determinante dà l'espressione per l'ellisse.

Poiché il segno dell'espressione potrebbe essere invertito, prendiamo il termine costante e moltiplichiamo l'intera espressione per il segno della costante. In questo modo, possiamo impostare l'espressione maggiore di 0 per trovare l'area.


+1. Mi piace come hai risolto un problema con Sign.
Vitaliy Kaurov,

5

MATLAB , 130 124 114 byte

L'input è preso come due vettori di colonna, uno per le coordinate x e uno per le coordinate y. Questo metodo utilizza una regressione con minimi sequenze, che fornisce l'ellisse esatta se tutti i punti si trovano esattamente su un'ellisse, quindi applica la formula fornita qui (grazie a @orlp) per calcolare l'area.

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

Aggiungendo le seguenti linee puoi persino tracciare la curva:

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

Provalo online!


3

Mathematica 84 byte

Ho trovato che questo è un problema interessante. Ogni ellisse è una trasformazione affine del cerchio unitario che può essere parametrizzata come {x, y} = {Cos (t), Sin (t)}, quindi i punti sul cerchio possono essere mappati sull'ellisse di {xE, yE } = A {x, y} + B dove A è una matrice costante e B un vettore. Collegando i punti si ottengono 10 equazioni scalari e 11 incognite scalari, ma possiamo decidere che la parametrizzazione inizia con t = 0, quindi il sistema è risolvibile. Il valore assoluto del determinante della matrice A è il rapporto tra l'area dell'ellisse e il cerchio unitario, quindi moltiplichiamo per Pi. Prendendo Max si sbarazza della soluzione negativa.

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

Uso:

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

I rendimenti:

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

2

Mathematica, 144 byte

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


funziona per tutti i casi di test

Esempio di input :[{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]

risultati

9882.59540465108163146329
269.596664818864334050934
98.5493729387989852754258

-10 byte da JungHwan Min
± è 1 byte nella codifica Windows predefinita [CP-1252]


Hmm ... perché sto ottenendo l'infinito sul tuo esempio di input?
numbermaniac

@numbermaniac Non lo so. Ho capito bene. stai usando questo input [{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]?
J42161217

Sì, lo sono - è strano.
numbermaniac

Ricevo (3575880 π)/(2351 Sqrt[2351])che è accettata come risposta
J42161217

1
Strano, anche ClearAllnon lo risolve. Oh bene, non ti preoccupare ahah. Finché funziona per te. Su quale versione di Mathematica sei?
numbermaniac

2

Desmos , 101 byte

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

A Desmos online non piacciono le paste multilinea, quindi devi inserirlo in una riga alla volta o

Provalo online!

L'input viene preso con le due liste ue v. L'output è mostrato sull'ultima riga.

Spiegazione:

  • Le prime due righe danno un nome alle variabili di input.
  • La terza riga definisce l'equazione per qualsiasi ellisse, con raggi ae b, angolo di rotazione ce offset (h,k).

    • Prettificato, assomiglia a questo: inserisci qui la descrizione dell'immagine
  • La quarta riga calcola una regressione di foltre gli elenchi ue v, trovando raggi me n, angolo di rotazione oe offset(p,q) .

  • L'ultima riga calcola l'area dell'ellisse con la formula A = pi*r1*r2

Puoi anche provarlo online (link diverso) per una versione visiva interattiva leggermente ampliata. Puoi spostarti tra i cinque punti e visualizzare l'ellisse e l'area in tempo reale:

inserisci qui la descrizione dell'immagine

In alternativa, ecco una soluzione leggermente più lunga usando questa formula (uguale alla risposta di @ flawr ):

Desmos, 106 byte

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}

Provalo online!


Potrebbe non essere necessaria la barra rovesciata prima pisull'ultima riga: se digito mnpi, il simbolo pi viene comunque visualizzato. Inoltre, vuoi dire "l' output è mostrato sull'ultima riga", non input?
numbermaniac

1
@numbermaniac Sto inserendo la barra rovesciata perché quando lo copio e lo incollo, non lo riconosce mnpi, anche se dice quando lo scrivo. E sì, intendevo output, non input, grazie.
Scott Milner,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.