Elliptisches System

9

Einführung

Bei fünf Punkten in der Ebene besteht Ihre Aufgabe darin, die Fläche der Ellipse zu berechnen, die durch diese Punkte verläuft.

Sie können davon ausgehen, dass mit den angegebenen Eingabewerten genau eine nicht entartete Ellipse erstellt werden kann.

Regeln

Die Eingabe besteht aus 10Ganzzahlen in beliebiger Form, die den xund yKoordinaten der Punkte entsprechen. Sie können die Eingabe beispielsweise als Liste von 10Ganzzahlen [x1, y1, x2, y2, ..., x5, y5]oder als [[x1, y1], [x2, y2], ..., [x5, y5]]usw. verwenden. Sie können auch Dezimalzahlen verarbeiten, es sind jedoch nur Ganzzahlen erforderlich.

Die Ausgabe ist eine Darstellung des Bereichs der Ellipse. Dies kann ein symbolischer Ausdruck oder ein Dezimalwert mit mindestens 8einer Genauigkeit sein.

Dies ist Code-Golf, daher gewinnt die kürzeste Antwort in Bytes.

Beispiel für Ein- und Ausgabe

Eingang:

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

Ausgabe:

62.15326783788685

Eine Darstellung der Ellipse, die durch diese Punkte verläuft:

Die Ellipse für dieses Beispiel

Mehr Beispiele:

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
quelle
War dies zufällig von diesem SPOJ-Problem inspiriert? http://www.spoj.com/problems/ELLIPSE/
xnor
Es war nicht. Ich bin auf dieser Seite nicht aktiv.
Ethan Ward
Was bedeutet es, dass die Ausgabe ein symbolischer Ausdruck sein kann?
xnor
@xnor Vielleicht ein (nicht bewertetes) elliptisches Integral?
Mego
2
Annnnd das beste Werkzeug für den Job geht zuooooooo: Mathematik-Grafikprogramme! Gehen Sie Abbildung: P.
Magic Octopus Urn

Antworten:

7

Mathematica, 87 80 78 Bytes

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

Nimmt 5 Eingaben : [{x1, y1}, ... , {x5, y5}].

Gibt einen exakten / symbolischen Wert zurück.

Wie?

Lassen Sie f(x, y)bezeichnen den Vektor (1, x, y, xy, x^2, y^2)für einige x, y.

Dann ist die Determinante der Matrix mit Zeilenvektoren [f(x, y), f(x1, y1), f(x2, y2), ..., f(x5, y5)]Null, wenn f (x, y)ein Punkt auf der Ellipse ist, nach der wir suchen. dh die Determinante gibt den Ausdruck für die Ellipse an.

Da das Vorzeichen des Ausdrucks möglicherweise invertiert ist, nehmen wir den konstanten Term und multiplizieren den gesamten Ausdruck mit dem Vorzeichen der Konstante. Auf diese Weise können wir den Ausdruck größer als 0 setzen, um den Bereich zu finden.

JungHwan min
quelle
+1. Mir gefällt, wie Sie ein Problem mit behoben haben Sign.
Vitaliy Kaurov
5

MATLAB , 130 124 114 Bytes

Die Eingabe erfolgt als zwei Spaltenvektoren, einer für die x- und einer für die y-Koordinaten. Diese Methode verwendet eine Regression der kleinsten Folgen, die die genaue Ellipse liefert, wenn sich alle Punkte genau auf einer Ellipse befinden, und wendet dann die hier angegebene Formel an (danke @orlp), um die Fläche zu berechnen.

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

Durch Anhängen der folgenden Linien können Sie sogar die Kurve zeichnen:

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

Probieren Sie es online aus!

fehlerhaft
quelle
3

Mathematica 84 Bytes

Ich fand das ein interessantes Problem. Jede Ellipse ist eine affine Transformation des Einheitskreises, die als {x, y} = {Cos (t), Sin (t)} parametrisiert werden kann, sodass die Punkte auf dem Kreis durch {xE, yE auf die Ellipse abgebildet werden können } = A {x, y} + B wobei A eine konstante Matrix und B ein Vektor ist. Das Einfügen der Punkte ergibt 10 skalare Gleichungen und 11 skalare Unbekannte, aber wir können entscheiden, dass die Parametrisierung bei t = 0 beginnt, sodass das System lösbar ist. Der Absolutwert der Determinante der Matrix A ist das Verhältnis der Fläche der Ellipse zum Einheitskreis, also multiplizieren wir mit Pi. Durch die Einnahme von Max wird die negative Lösung beseitigt.

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

Verwendungszweck:

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

Ausbeuten:

(1001 π)/(16 Sqrt[10])
Kelly Lowder
quelle
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}]& 


funktioniert für alle Testfälle

Eingabebeispiel :[{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]

Ergebnisse

9882.59540465108163146329
269.596664818864334050934
98.5493729387989852754258

-10 Bytes von JungHwan min
± sind 1 Byte in der Standard-Windows-Codierung [CP-1252]

J42161217
quelle
Hmm ... warum bekomme ich bei Ihrem Eingabebeispiel Unendlichkeit?
Numbermaniac
@numbermaniac Ich weiß es nicht. Ich verstehe es richtig. Verwenden Sie diesen Eingang [{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]?
J42161217
Ja, das bin ich - das ist komisch.
Numbermaniac
Ich (3575880 π)/(2351 Sqrt[2351])
bekomme
1
Seltsam, ClearAllrepariert es sogar nicht. Na ja, mach dir keine Sorgen, haha. Solange es für dich funktioniert. Auf welcher Version von Mathematica bist du?
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

Online Desmos mag keine mehrzeiligen Pasten, daher müssen Sie sie jeweils in einer Zeile eingeben, oder

Probieren Sie es online aus!

Die Eingabe erfolgt mit den beiden Listen uund v. Die Ausgabe wird in der letzten Zeile angezeigt.

Erläuterung:

  • Die ersten beiden Zeilen benennen die Eingabevariablen.
  • Die dritte Linie definiert die Gleichung für jede Ellipse mit Radien aund bDrehwinkel cund Versatz (h,k).

    • Schön sieht es so aus: Geben Sie hier die Bildbeschreibung ein
  • Die vierte Zeile berechnet eine Regression von füber den Listen uund ermittelt vRadien mund nDrehwinkel ound Versatz (p,q).

  • Die letzte Zeile berechnet die Fläche der Ellipse mit der Formel A = pi*r1*r2

Sie können es auch online ausprobieren (anderer Link), um eine leicht erweiterte, interaktive visuelle Version zu erhalten. Sie können sich um die fünf Punkte bewegen und die Ellipse und den Bereich in Echtzeit anzeigen:

Geben Sie hier die Bildbeschreibung ein

Alternativ ist hier eine etwas längere Lösung mit dieser Formel (wie die Antwort von @ errorr ):

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}

Probieren Sie es online aus!

Scott Milner
quelle
Möglicherweise benötigen Sie den Backslash dort piin der letzten Zeile nicht: Wenn ich tippe mnpi, wird das pi-Symbol weiterhin angezeigt. Meinen Sie auch "die Ausgabe wird in der letzten Zeile angezeigt", nicht die Eingabe?
Numbermaniac
1
@numbermaniac Ich setze den Backslash ein, weil er beim Kopieren und Einfügen nicht erkannt wird mnpi, obwohl er beim Eingeben Wörter enthält. Und ja, ich meinte Ausgabe, nicht Eingabe, danke.
Scott Milner