Système elliptique

9

introduction

Étant donné cinq points dans le plan, votre tâche consiste à calculer l'aire de l'ellipse passant par ces points.

Vous pouvez supposer qu'exactement une ellipse non dégénérée peut être construite avec les valeurs d'entrée données.

Règles

L'entrée est des 10entiers sous n'importe quelle forme appropriée, correspondant aux coordonnées xet ydes points. Par exemple, vous pouvez prendre l'entrée comme une liste d' 10entiers [x1, y1, x2, y2, ..., x5, y5], ou comme [[x1, y1], [x2, y2], ..., [x5, y5]], etc. Vous pouvez également gérer des nombres décimaux, mais seuls des entiers sont requis.

La sortie est une représentation de la zone de l'ellipse. Il peut s'agir d'une expression symbolique ou d'une valeur décimale avec au moins des 8chiffres de précision.

Il s'agit de code-golf, donc la réponse la plus courte en octets l'emporte.

Exemple d'entrée et de sortie

Contribution:

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

Production:

62.15326783788685

Une représentation de l'ellipse passant par ces points:

L'ellipse pour cet exemple

Plus d'exemples:

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
la source
Était-ce par hasard inspiré par ce problème de SPOJ? http://www.spoj.com/problems/ELLIPSE/
xnor
Ce n'était pas. Je ne suis pas actif sur ce site.
Ethan Ward
Qu'est-ce que cela signifie que la sortie peut être une expression symbolique?
xnor
@xnor Peut-être une intégrale elliptique (non évaluée)?
Mego
2
Et le meilleur outil pour le travail va trop: les programmes graphiques mathématiques! Allez comprendre: P.
Urne de poulpe magique

Réponses:

7

Mathematica, 87 80 78 octets

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

Prend 5 entrées: [{x1, y1}, ... , {x5, y5}].

Renvoie une valeur exacte / symbolique.

Comment?

Soit f(x, y)le vecteur (1, x, y, xy, x^2, y^2)pour certains x, y.

Ensuite, le déterminant de la matrice avec des vecteurs de ligne [f(x, y), f(x1, y1), f(x2, y2), ..., f(x5, y5)]est nul ssi (x, y)un point de l'ellipse que nous recherchons. c'est-à-dire que le déterminant donne l'expression de l'ellipse.

Puisque le signe de l'expression peut être inversé, nous prenons le terme constant et multiplions l'expression entière par le signe de la constante. De cette façon, nous pouvons définir l'expression supérieure à 0 pour trouver la zone.

JungHwan Min
la source
+1. J'aime la façon dont vous avez résolu un problème Sign.
Vitaliy Kaurov
5

MATLAB , 130 124 114 octets

L'entrée est prise comme deux vecteurs de colonne, un pour les coordonnées x et un pour les coordonnées y. Cette méthode utilise une régression des moindres séquences, qui fournit l'ellipse exacte si tous les points se trouvent exactement sur une ellipse, puis applique la formule fournie ici (merci @orlp) pour calculer la zone.

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

En ajoutant les lignes suivantes, vous pouvez même tracer la courbe:

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

Essayez-le en ligne!

flawr
la source
3

Mathematica 84 octets

J'ai trouvé que c'était un problème intéressant. Chaque ellipse est une transformation affine du cercle unitaire qui peut être paramétrée comme {x, y} = {Cos (t), Sin (t)}, de sorte que les points sur le cercle peuvent être mappés à l'ellipse par {xE, yE } = A {x, y} + B où A est une matrice constante et B un vecteur. Brancher les points donne 10 équations scalaires et 11 inconnues scalaires, mais nous pouvons décider que le paramétrage commence à t = 0, donc le système est résoluble. La valeur absolue du déterminant de la matrice A est le rapport de l'aire de l'ellipse au cercle unité, donc nous multiplions par Pi. Prendre Max se débarrasse de la solution négative.

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

Usage:

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

Rendements:

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

Mathematica, 144 octets

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


fonctionne pour tous les cas de test

Exemple d'entrée :[{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]

Résultats

9882.59540465108163146329
269.596664818864334050934
98.5493729387989852754258

-10 octets de JungHwan Min
± est de 1 octet dans le codage Windows par défaut [CP-1252]

J42161217
la source
Hmm ... pourquoi est-ce que je reçois l'infini sur votre exemple d'entrée?
numbermaniac
@numbermaniac je ne sais pas. Je comprends bien. utilisez-vous cette entrée [{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]?
J42161217
Ouais, je suis - c'est bizarre.
numbermaniac
Je reçois (3575880 π)/(2351 Sqrt[2351])ce qui est accepté comme réponse
J42161217
1
Bizarre, même ClearAll ne le résout pas. Oh bien, ne t'en fais pas haha. Tant que cela fonctionne pour vous. Quelle version de Mathematica utilisez-vous?
numbermaniac
2

Desmos , 101 octets

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

Desmos en ligne n'aime pas les pâtes multilignes, vous devez donc les saisir sur une seule ligne à la fois, ou

Essayez-le en ligne!

L'entrée est prise avec les deux listes uetv . La sortie est affichée sur la dernière ligne.

Explication:

  • Les deux premières lignes nomment les variables d'entrée.
  • La troisième ligne définit l'équation pour toute ellipse, avec les rayons aet b, l'angle de rotation cet le décalage (h,k).

    • Prettifié, il ressemble à ceci: entrez la description de l'image ici
  • La quatrième ligne calcule une régression de fsur les listes uetv , en trouvant les rayons met n, l'angle de rotation oet le décalage (p,q).

  • La dernière ligne calcule l'aire de l'ellipse avec la formule A = pi*r1*r2

Vous pouvez également l' essayer en ligne (lien différent) pour une version visuelle interactive légèrement développée. Vous pouvez vous déplacer autour des cinq points et visualiser l'ellipse et la zone en temps réel:

entrez la description de l'image ici

Alternativement, voici une solution légèrement plus longue en utilisant cette formule (identique à la réponse de @ flawr ):

Desmos, 106 octets

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}

Essayez-le en ligne!

Scott Milner
la source
Vous pourriez ne pas avoir besoin de la barre oblique inverse avant pisur la dernière ligne: si je tape mnpi, le symbole pi apparaît toujours. De plus, voulez-vous dire "la sortie est affichée sur la dernière ligne", pas entrée?
numbermaniac
1
@numbermaniac Je mets la barre oblique inverse parce que quand je le copie-colle, il ne reconnaît pas mnpi, même s'il dit quand je le tape. Et oui, je voulais dire sortie, pas entrée, merci.
Scott Milner