Sistem elips

9

pengantar

Diberi lima poin di pesawat, tugas Anda adalah menghitung luas elips yang melewati titik-titik ini.

Anda dapat mengasumsikan bahwa satu elips non-degenerasi dapat dibangun dengan nilai input yang diberikan.

Aturan

Input adalah 10bilangan bulat dalam bentuk apa pun, yang sesuai dengan xdan ytitik koordinat. Misalnya, Anda dapat mengambil input sebagai daftar 10bilangan bulat [x1, y1, x2, y2, ..., x5, y5], atau sebagai [[x1, y1], [x2, y2], ..., [x5, y5]], dll. Anda juga dapat menangani angka desimal, tetapi hanya bilangan bulat yang diperlukan.

Output adalah representasi dari area elips. Ini mungkin beberapa ekspresi simbolis, atau nilai desimal dengan setidaknya 8digit presisi.

Ini adalah kode-golf, jadi jawaban tersingkat dalam byte menang.

Contoh Input dan Output

Memasukkan:

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

Keluaran:

62.15326783788685

Penggambaran elips yang melewati titik-titik ini:

Elips untuk contoh ini

Lebih banyak contoh:

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
sumber
Apakah ini kebetulan terinspirasi oleh masalah SPOJ ini? http://www.spoj.com/problems/ELLIPSE/
xnor
Bukan itu. Saya tidak aktif di situs itu.
Ethan Ward
Apa artinya bahwa output mungkin merupakan ekspresi simbolis?
xnor
@xnor Mungkin integral elips (tidak dievaluasi)?
Mego
2
Selain itu alat terbaik untuk pekerjaan tersebut tooooooo: Program grafik Matematika! Go figure: P.
Magic Octopus Mm

Jawaban:

7

Mathematica, 87 80 78 byte

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

Membutuhkan waktu 5 input: [{x1, y1}, ... , {x5, y5}].

Mengembalikan nilai simbolik yang tepat.

Bagaimana?

Biarkan f(x, y)menunjukkan vektor (1, x, y, xy, x^2, y^2)untuk beberapa x, y.

Kemudian, penentu matriks dengan vektor baris [f(x, y), f(x1, y1), f(x2, y2), ..., f(x5, y5)]adalah nol iff (x, y)adalah titik pada elips yang kita cari. yaitu determinan memberikan ekspresi untuk elips.

Karena tanda ekspresi mungkin terbalik, kita mengambil istilah konstan dan mengalikan seluruh ekspresi dengan tanda konstanta. Dengan begitu, kita dapat mengatur ekspresi lebih besar dari 0 untuk menemukan area.

JungHwan Min
sumber
+1. Saya suka bagaimana Anda memperbaiki masalah Sign.
Vitaliy Kaurov
5

MATLAB , 130 124 114 byte

Input diambil sebagai dua vektor kolom, satu untuk x- dan satu untuk koordinat y. Metode ini menggunakan regresi sekuens terkecil, yang memberikan elips tepat jika semua poin tepat pada elips, dan kemudian menerapkan rumus yang disediakan di sini (terima kasih @ orlp) untuk menghitung area.

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

Dengan menambahkan baris berikut, Anda bahkan dapat memplot kurva:

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

Cobalah online!

cacat
sumber
3

Mathematica 84 Bytes

Saya menemukan ini menjadi masalah yang menarik. Setiap elips adalah transformasi affine dari lingkaran satuan yang dapat diparameterisasi sebagai {x, y} = {Cos (t), Sin (t)}, sehingga titik-titik pada lingkaran dapat dipetakan ke elips dengan {xE, yE } = A {x, y} + B di mana A adalah matriks konstan dan B a vektor. Memasukkan poin menghasilkan 10 persamaan skalar dan 11 skalar tidak diketahui, tetapi kita dapat memutuskan bahwa parameterisasi dimulai pada t = 0, sehingga sistem dapat dipecahkan. Nilai absolut dari penentu matriks A adalah rasio luas elips dengan lingkaran satuan sehingga kita kalikan dengan Pi. Mengambil Max menyingkirkan solusi negatif.

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

Pemakaian:

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

Hasil:

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

Mathematica, 144 byte

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


bekerja untuk semua kasus uji

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

Hasil

9882.59540465108163146329
269.596664818864334050934
98.5493729387989852754258

-10 byte dari JungHwan Min
± adalah 1 byte di jendela default pengkodean [CP-1252]

J42161217
sumber
Hmm ... kenapa saya mendapatkan infinity pada contoh input Anda?
numbermaniac
@numbermaniac saya tidak tahu. Saya benar. apakah Anda menggunakan input ini [{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]?
J42161217
Ya, saya - itu aneh.
numbermaniac
Saya (3575880 π)/(2351 Sqrt[2351])menerima yang diterima sebagai jawaban
J42161217
1
Aneh, bahkan ClearAlltidak memperbaikinya. Oh well, jangan khawatir tentang itu haha. Selama itu berhasil untuk Anda. Kamu versi berapa Mathematica?
numbermaniac
2

Desmos , 101 byte

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 daring tidak suka pasta multiline, jadi Anda harus memasukkannya satu per satu, atau

Cobalah secara Online!

Input diambil dengan dua daftar udan v. Output ditampilkan pada baris terakhir.

Penjelasan:

  • Dua baris pertama memberi nama variabel input.
  • Baris ketiga mendefinisikan persamaan untuk setiap elips, dengan jari-jari adan b, sudut rotasi c, dan offset (h,k).

    • Prettified, terlihat seperti ini: masukkan deskripsi gambar di sini
  • Baris keempat menghitung regresi fatas daftar udan v, menemukan jari m- jari dan n, sudut rotasi o, dan offset (p,q).

  • Baris terakhir menghitung luas elips dengan rumus A = pi*r1*r2

Anda juga dapat mencobanya secara online (tautan berbeda) untuk versi visual interaktif yang sedikit diperluas. Anda dapat bergerak di sekitar lima titik dan melihat elips dan area secara real time:

masukkan deskripsi gambar di sini

Sebagai alternatif, berikut adalah solusi yang sedikit lebih lama menggunakan rumus ini (sama dengan jawaban @ flawr ):

Desmos, 106 byte

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}

Cobalah secara Online!

Scott Milner
sumber
Anda mungkin tidak perlu garis miring terbalik di sana sebelumnya pipada baris terakhir: jika saya mengetik mnpi, simbol pi masih muncul. Juga, maksud Anda " output ditampilkan pada baris terakhir", bukan input?
numbermaniac
1
@numbermaniac Saya meletakkan backslash karena ketika saya salin-tempel, itu tidak mengenali mnpi, meskipun kata-kata ketika saya mengetiknya. Dan ya, maksud saya output, bukan input, terima kasih.
Scott Milner