楕円システム


9

前書き

平面に5つの点があるとすると、これらの点を通る楕円の面積を計算する必要があります。

与えられた入力値を使用して、縮退していない楕円を1つだけ作成できると想定できます。

ルール

入力は、ポイントのおよびの座標に10対応する任意の便利な形式の整数です。たとえば、入力を整数のリスト、またはなどとして取ることができます。10進数も処理できますが、必要なのは整数のみです。xy10[x1, y1, x2, y2, ..., x5, y5][[x1, y1], [x2, y2], ..., [x5, y5]]

出力は楕円の領域の表現です。これは、いくつかのシンボリック式、または少なくとも8桁数の精度を持つ10進数値です。

これはコードゴルフなので、バイト単位の最も短い答えが優先されます。

入力と出力の例

入力:

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

出力:

62.15326783788685

これらの点を通る楕円の描写:

この例の楕円

その他の例:

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

これは、たまたまこのSPOJ問題に触発されたのでしょうか。http://www.spoj.com/problems/ELLIPSE/
xnor

そうではありませんでした。そのサイトではアクティブではありません。
イーサンワード

出力がシンボリック式である可能性があるとはどういう意味ですか?
XNOR

@xnorおそらく(評価されていない)楕円積分でしょうか?
Mego

2
仕事に最適なツールは数学のグラフ作成プログラムです。ゴーフィギュア:P。
Magic Octopus Urn

回答:


7

Mathematica、87 80 78バイト

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

5つの入力を受け取ります[{x1, y1}, ... , {x5, y5}]

正確な/シンボリックな値を返します。

どうやって?

してみましょうf(x, y)ベクトルを示す(1, x, y, xy, x^2, y^2)いくつかのためx, y

次に、行ベクトルを持つ行列の行列式[f(x, y), f(x1, y1), f(x2, y2), ..., f(x5, y5)]はゼロです。ただし(x, y)、探している楕円上の点である必要があります。つまり、行列式は楕円の式を与えます。

式の符号が反転する可能性があるため、定数項を使用して、式全体に定数の符号を掛けます。そうすることで、式を0より大きい値に設定して領域を見つけることができます。


+1。で問題を修正した方法が気に入りましたSign
Vitaliy Kaurov 2017年

5

MATLAB130 124 114バイト

入力は、x座標用とy座標用の2つの列ベクトルとして使用されます。この方法では、最小二乗回帰を使用します。これにより、すべてのポイントが楕円上にある場合に正確な楕円が得られ、次にここで提供れる数式(@orlpに感謝)を適用て面積を計算します。

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

以下のラインを追加することで、曲線をプロットすることもできます:

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

オンラインでお試しください!


3

Mathematica 84バイト

これは興味深い問題であることがわかりました。すべての楕円は単位円のアフィン変換であり、{x、y} = {Cos(t)、Sin(t)}としてパラメーター化できるため、円上の点は{xE、yEによって楕円にマッピングできます} = A {x、y} + Bここで、Aは定数行列、Bはベクトルです。ポイントを接続すると、10のスカラー方程式と11のスカラー未知数が生成されますが、パラメーター化がt = 0から始まると判断できるため、システムは解けるようになります。行列Aの行列式の絶対値は、楕円の面積と単位円の比なので、Piを掛けます。マックスを取ることは否定的な解決策を取り除く。

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

使用法:

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

収量:

(1001 π)/(16 Sqrt[10])

2

Mathematica、144バイト

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


すべてのテストケースで機能します

入力例[{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]

結果

9882.59540465108163146329
269.596664818864334050934
98.5493729387989852754258

JungHwan Min
± からの-10バイトは、デフォルトのWindowsエンコーディングで1バイトです[CP-1252]


うーん...なぜ私はあなたの入力例で無限大になるのですか?
numbermaniac 2017年

@numbermaniacわかりません。私はそれを正しく理解しています。この入力を使用しています[{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]か?
J42161217 2017年

ええ、私は-それは奇妙です。
numbermaniac 2017年

(3575880 π)/(2351 Sqrt[2351])答えとして受け入れられるものを取得しています
J42161217

1
奇妙なことに、それをClearAll修正しません。まあ、それについては心配しないでくださいね。それがあなたのために働く限り。Mathematicaのどのバージョンを使用していますか?
numbermaniac 2017年

2

デスモス、101バイト

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は複数行の貼り付けが好きではないため、一度に1行に入力する必要があります。

オンラインでお試しください!

入力は2つのリストuとで取得されますv。出力は最後の行に表示されます。

説明:

  • 最初の2行は入力変数の名前です。
  • 3行目は、半径ab、回転角度c、オフセットを使用して、楕円の方程式を定義し(h,k)ます。

    • きれいな、それはこのように見えます: ここに画像の説明を入力してください
  • 4行目の回帰計算fリスト上にu及びv半径発見、m及びn、回転角o、およびオフセット(p,q)

  • 最後の行は、楕円の面積を式で計算します A = pi*r1*r2

わずかに拡張されたインタラクティブなビジュアルバージョンについては、オンラインで試す(リンクは異なる)こともできます。5つのポイントを移動して、楕円と領域をリアルタイムで表示できます。

ここに画像の説明を入力してください

または、この式を使用した少し長い解決策を次に示します@flawrの回答と同じ):

デスモス、106バイト

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}

オンラインでお試しください!


pi最後の行の前にバックスラッシュが必要ない場合があります。「」と入力してmnpiも、pi記号は表示されます。また、入力ではなく「出力は最終行に表示される」という意味ですか?
numbermaniac 2017年

1
@numbermaniacバックスラッシュを挿入しています。コピーして貼り付けると、mnpi入力時に文字が入力されても認識されません。そして、はい、私は入力ではなく出力を意味しました、ありがとう。
Scott Milner 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.