Sistema elíptico

9

Introdução

Dados cinco pontos no plano, sua tarefa é calcular a área da elipse que passa por esses pontos.

Você pode assumir que exatamente uma elipse não degenerada pode ser construída com os valores de entrada fornecidos.

Regras

A entrada é um número 10inteiro em qualquer forma conveniente, correspondente às coordenadas xe ydos pontos. Por exemplo, você pode usar a entrada como uma lista de 10números inteiros [x1, y1, x2, y2, ..., x5, y5], ou como [[x1, y1], [x2, y2], ..., [x5, y5]], etc. Você também pode manipular números decimais, mas apenas números inteiros são necessários.

Saída é uma representação da área da elipse. Pode ser uma expressão simbólica ou um valor decimal com pelo menos 8dígitos de precisão.

Isso é código-golfe, então a resposta mais curta em bytes vence.

Exemplo de entrada e saída

Entrada:

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

Resultado:

62.15326783788685

Uma representação da elipse passando por esses pontos:

A elipse para este exemplo

Mais exemplos:

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
fonte
Isso foi por acaso inspirado por esse problema de SPOJ? http://www.spoj.com/problems/ELLIPSE/
xnor
Não era. Não estou ativo nesse site.
Ethan Ward
O que significa que a saída pode ser uma expressão simbólica?
Xnor
@xnor Talvez uma integral elíptica (não avaliada)?
Mego3
2
Annnd a melhor ferramenta para o trabalho vai muitoooooo: programas gráficos de matemática! Vá figura: P.
Magic Octopus Urn

Respostas:

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

Retorna um valor exato / simbólico.

Como?

Vamos f(x, y)denotar o vetor (1, x, y, xy, x^2, y^2)para algunsx, y .

Então, o determinante da matriz com vetores de linha [f(x, y), f(x1, y1), f(x2, y2), ..., f(x5, y5)]é zero se (x, y)for um ponto na elipse que estamos procurando. isto é, o determinante fornece a expressão para a elipse.

Como o sinal da expressão pode ser invertido, pegamos o termo constante e multiplicamos toda a expressão pelo sinal da constante. Dessa forma, podemos definir a expressão maior que 0 para encontrar a área.

JungHwan Min
fonte
+1. Gosto de como você resolveu um problema Sign.
Vitaliy Kaurov
5

MATLAB , 130 124 114 bytes

A entrada é takean como dois vetores de coluna, um para as coordenadas x e um para as coordenadas y. Este método usa uma regressão de menos sequares, que fornece a elipse exata se todos os pontos estão exatamente em uma elipse e, em seguida, aplica a fórmula fornecida aqui (obrigado @orlp) para calcular a á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

Ao anexar as seguintes linhas, você pode plotar a 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]);

Experimente online!

flawr
fonte
3

Mathematica 84 Bytes

Eu achei isso um problema interessante. Toda elipse é uma transformação afim do círculo unitário que pode ser parametrizada como {x, y} = {Cos (t), Sin (t)}, para que os pontos no círculo possam ser mapeados para a elipse por {xE, yE } = A {x, y} + B, onde A é uma matriz constante e B um vetor. A inserção dos pontos gera 10 equações escalares e 11 desconhecidas escalares, mas podemos decidir que a parametrização começa em t = 0, para que o sistema seja solucionável. O valor absoluto do determinante da matriz A é a razão entre a área da elipse e o círculo unitário, portanto multiplicamos por Pi. Tomar Max se livra da solução 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}}

Rendimentos:

(1001 π)/(16 Sqrt[10])
Kelly Lowder
fonte
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 os casos de teste

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

Resultados

9882.59540465108163146329
269.596664818864334050934
98.5493729387989852754258

-10 bytes de JungHwan Min
± é de 1 byte nas janelas padrão que codificam [CP-1252]

J42161217
fonte
Hmm ... por que estou recebendo infinito no seu exemplo de entrada?
numbermaniac
@numbermaniac eu não sei. Eu entendi direito. você está usando esta entrada [{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]?
precisa saber é o seguinte
Sim, eu sou - isso é estranho.
numbermaniac
Eu estou recebendo (3575880 π)/(2351 Sqrt[2351])o que é aceito como uma resposta
J42161217
11
Estranho, nem ClearAllconserta. Oh bem, não se preocupe com isso haha. Contanto que funcione para você. Em qual versão do Mathematica você está?
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

O Desmos on- line não gosta de pastas com várias linhas , então você deve inseri-lo em uma linha de cada vez, ou

Experimente Online!

A entrada é obtida com as duas listas ue v. A saída é mostrada na última linha.

Explicação:

  • As duas primeiras linhas nomeiam as variáveis ​​de entrada.
  • A terceira linha define a equação para qualquer elipse, com raios ae b, ângulo de rotação ce deslocamento (h,k).

    • Pretificado, fica assim: insira a descrição da imagem aqui
  • A quarta linha calcula uma regressão fsobre as listas ue v, encontrando raios me n, ângulo de rotação oe deslocamento (p,q).

  • A última linha calcula a área da elipse com a fórmula A = pi*r1*r2

Você também pode experimentar online (link diferente) para obter uma versão visual interativa levemente expandida. Você pode mover-se pelos cinco pontos e visualizar a elipse e a área em tempo real:

insira a descrição da imagem aqui

Como alternativa, aqui está uma solução um pouco mais longa usando esta fórmula (o mesmo que a resposta 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}

Experimente Online!

Scott Milner
fonte
Talvez você não precise da barra invertida antes pina última linha: se eu digitar mnpi, o símbolo pi ainda será exibido. Além disso, você quer dizer "a saída é mostrada na última linha", não entrada?
Numbermaniac #
11
@numbermaniac Estou colocando a barra invertida porque, quando copia e colo, ela não reconhece mnpi, mesmo que exprima quando digito. E sim, eu quis dizer saída, não entrada, obrigado.
22826 Scott Milner #