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 10
inteiro em qualquer forma conveniente, correspondente às coordenadas x
e y
dos pontos. Por exemplo, você pode usar a entrada como uma lista de 10
nú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 8
dí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:
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
Respostas:
Mathematica,
878078 bytesToma 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.
fonte
Sign
.MATLAB ,
130 124114 bytesA 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.
Ao anexar as seguintes linhas, você pode plotar a curva:
Experimente online!
fonte
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.
Uso:
Rendimentos:
fonte
Mathematica, 144 bytes
funciona para todos os casos de teste
Exemplo de entrada :
[{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]
Resultados
-10 bytes de JungHwan Min
± é de 1 byte nas janelas padrão que codificam [CP-1252]
fonte
[{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]
?(3575880 π)/(2351 Sqrt[2351])
o que é aceito como uma respostaClearAll
conserta. Oh bem, não se preocupe com isso haha. Contanto que funcione para você. Em qual versão do Mathematica você está?Desmos , 101 bytes
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
u
ev
. A saída é mostrada na última linha.Explicação:
A terceira linha define a equação para qualquer elipse, com raios
a
eb
, ângulo de rotaçãoc
e deslocamento(h,k)
.A quarta linha calcula uma regressão
f
sobre as listasu
ev
, encontrando raiosm
en
, ângulo de rotaçãoo
e deslocamento(p,q)
.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:
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
Experimente Online!
fonte
pi
na última linha: se eu digitarmnpi
, o símbolo pi ainda será exibido. Além disso, você quer dizer "a saída é mostrada na última linha", não entrada?mnpi
, mesmo que exprima quando digito. E sim, eu quis dizer saída, não entrada, obrigado.