Sistema elíptico

9

Introducción

Dados cinco puntos en el plano, su tarea es calcular el área de la elipse que pasa por estos puntos.

Puede suponer que se puede construir exactamente una elipse no degenerada con los valores de entrada dados.

Reglas

La entrada es 10enteros en cualquier forma conveniente, correspondiente a las coordenadas xy yde los puntos. Por ejemplo, puede tomar la entrada como una lista de 10enteros [x1, y1, x2, y2, ..., x5, y5], o como [[x1, y1], [x2, y2], ..., [x5, y5]], etc. También puede manejar números decimales, pero solo se requieren enteros.

La salida es una representación del área de la elipse. Esto puede ser alguna expresión simbólica o un valor decimal con al menos 8dígitos de precisión.

Este es el código de golf, por lo que gana la respuesta más corta en bytes.

Ejemplo de entrada y salida

Entrada:

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

Salida:

62.15326783788685

Una representación de la elipse que pasa por estos puntos:

La elipse para este ejemplo

Más ejemplos:

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
fuente
¿Fue por casualidad inspirado por este problema SPOJ? http://www.spoj.com/problems/ELLIPSE/
xnor
No era. No estoy activo en ese sitio.
Ethan Ward el
¿Qué significa que la salida puede ser una expresión simbólica?
xnor
@xnor ¿Quizás una integral elíptica (no evaluada)?
Mego
2
Annnnd: la mejor herramienta para el trabajo es muuuuuuuuy: ¡programas de gráficos de matemáticas! Vaya figura: P.
Urna mágica del pulpo

Respuestas:

7

Mathematica, 87 80 78 bytes

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

Toma 5 entradas: [{x1, y1}, ... , {x5, y5}].

Devuelve un valor exacto / simbólico.

¿Cómo?

Deje f(x, y)denotar el vector (1, x, y, xy, x^2, y^2)para algunos x, y.

Entonces, el determinante de la matriz con los vectores de fila [f(x, y), f(x1, y1), f(x2, y2), ..., f(x5, y5)]es cero si f (x, y)es un punto en la elipse que estamos buscando. es decir, el determinante da la expresión para la elipse.

Como el signo de la expresión puede invertirse, tomamos el término constante y multiplicamos la expresión completa por el signo de la constante. De esa manera, podemos establecer la expresión mayor que 0 para encontrar el área.

JungHwan Min
fuente
+1. Me gusta cómo solucionó un problema con Sign.
Vitaliy Kaurov
5

MATLAB , 130124114 bytes

La entrada se toma como dos vectores de columna, uno para las coordenadas xy otro para las coordenadas y. Este método utiliza una regresión de mínimos cuadrados, que proporciona la elipse exacta si todos los puntos están exactamente en una elipse, y luego aplica la fórmula provista aquí (gracias @orlp) para calcular el área.

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

Al agregar las siguientes líneas, incluso puede trazar 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]);

Pruébalo en línea!

falla
fuente
3

Mathematica 84 Bytes

Encontré que este es un problema interesante. Cada elipse es una transformación afín del círculo unitario que se puede parametrizar como {x, y} = {Cos (t), Sin (t)}, por lo que los puntos en el círculo se pueden asignar a la elipse con {xE, yE } = A {x, y} + B donde A es una matriz constante y B un vector. Al conectar los puntos se obtienen 10 ecuaciones escalares y 11 incógnitas escalares, pero podemos decidir que la parametrización comienza en t = 0, por lo que el sistema tiene solución. El valor absoluto del determinante de la matriz A es la relación del área de la elipse al círculo unitario, por lo que multiplicamos por Pi. Tomar Max elimina la solución 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}}

Rendimientos:

(1001 π)/(16 Sqrt[10])
Kelly Lowder
fuente
2

Mathematica, 144 bytes

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


funciona para todos los casos de prueba

Ejemplo de entrada :[{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]

Resultados

9882.59540465108163146329
269.596664818864334050934
98.5493729387989852754258

-10 bytes de JungHwan Min
± es de 1 byte en la codificación predeterminada de Windows [CP-1252]

J42161217
fuente
Hmm ... ¿por qué obtengo infinito en tu ejemplo de entrada?
numbermaniac
@numbermaniac No lo sé. Lo entiendo bien. ¿Estás usando esta entrada [{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]?
J42161217
Sí, lo soy, eso es raro.
numbermaniac
Estoy recibiendo lo (3575880 π)/(2351 Sqrt[2351])que se acepta como respuesta
J42161217
1
Extraño, incluso ClearAllno lo arregla. Oh bueno, no te preocupes por eso jaja. Mientras funcione para ti. ¿En qué versión de Mathematica estás?
numbermaniac
2

Desmos , 101 bytes

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 en línea no le gustan las pastas multilínea, por lo que debe ingresarlas en una línea a la vez, o

¡Pruébelo en línea!

La entrada se toma con las dos listas uy v. La salida se muestra en la última línea.

Explicación:

  • Las dos primeras líneas nombran las variables de entrada.
  • La tercera línea define la ecuación para cualquier elipse, con radios ay b, ángulo de rotación cy desplazamiento (h,k).

    • Prettified, se ve así: ingrese la descripción de la imagen aquí
  • La cuarta línea calcula una regresión de fsobre las listas uy v, encontrando radios my n, ángulo de rotación oy desplazamiento (p,q).

  • La última línea calcula el área de la elipse con la fórmula A = pi*r1*r2

También puede probarlo en línea (enlace diferente) para una versión visual interactiva ligeramente expandida. Puede moverse por los cinco puntos y ver la elipse y el área en tiempo real:

ingrese la descripción de la imagen aquí

Alternativamente, aquí hay una solución un poco más larga usando esta fórmula (igual que la respuesta de @ flawr ):

Desmos, 106 bytes

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}

¡Pruébelo en línea!

Scott Milner
fuente
Es posible que no necesite la barra invertida allí antes pien la última línea: si escribo mnpi, el símbolo pi aún aparece. Además, ¿te refieres a "la salida se muestra en la última línea", no la entrada?
numbermaniac
1
@numbermaniac Estoy colocando la barra invertida porque cuando copio y pego, no reconoce mnpi , a pesar de que . Y sí, quise decir salida, no entrada, gracias.
Scott Milner el