Ukuran misteri bulan
Saya yakin Anda pernah mendengar bahwa bulan mengubah ukurannya. Ketika Anda sedang jatuh cinta dan Anda beruntung, ukuran bulan hampir dua kali lipat dibandingkan dengan situasi normal. Sebagian orang mengatakan alasannya adalah suasana yang bertindak sebagai lensa. Yang lain berpikir bahwa itu hanya masalah perbandingan dengan benda lain seperti pohon di dekatnya. Apapun penjelasan yang Anda baca, itu cukup subjektif.
Ukuran ilmu bulan
Ok, kita programmer, bukan? Kami mengandalkan fakta, bukan? Jadi inilah eksperimennya:
- Ambil kamera yang bagus yang mendukung pengaturan waktu dan bukaan secara manual.
- Setel kamera Anda ke level zoom maksimum.
- Pergi keluar, ambil beberapa foto bulan untuk mendeteksi pengaturan terbaik sehingga bulan tajam dan pencahayaan baik-baik saja.
- Ingat pengaturannya
- Ambil foto bulan dengan pengaturan itu setiap kali Anda berpikir bulan besar atau kecil.
- Hitung ukuran bulan dalam piksel
Kamera tidak akan berbohong, bukan? Dengan menghitung piksel cerah kita dapat secara efektif mengukur ukuran bulan - setidaknya dalam piksel.
Jika ukurannya sama di semua foto, maka itu adalah bug di otak kita. Jika ukurannya berbeda, maka ada ruang untuk spekulasi
- bulan benar-benar tumbuh (tetapi apa yang dimakannya?)
- ada efek lensa atmosfer
- bulan memiliki kurva elips dan kadang lebih dekat, kadang jauh dari bumi
- ...
Tapi saya akan membiarkannya terbuka sampai tugas Anda selesai. Tentu saja Anda ingin tahu sebelumnya jika perangkat lunak Anda dapat menghitung ukuran bulan secara akurat.
Tugas
Diberikan beberapa gambar bulan yang dioptimalkan, harap hitung ukuran bulan. Optimasinya adalah: pikselnya hitam atau putih. Tidak ada di antara keduanya. Tidak ada antialiasing. Itu membuatnya mudah, bukan?
Peringatan: bulan tidak selalu penuh, Anda tahu ... itu bisa menjadi sabit! Tetapi bahkan dalam bentuk sabit, ukuran bulan lebih besar. Jadi, Anda akan menghitung ukuran penuh, silakan.
- Program Anda mengambil PNG sebagai input, misalnya sebagai argumen baris perintah nama file, disalurkan ke
stdin
atau sebagai objek Bitmap (dari pustaka kerangka kerja standar) jika Anda menulis fungsi alih-alih program. - Program Anda bekerja dengan ukuran bitmap input yang masuk akal, tidak harus kuadrat. Lebar minimum dan tinggi 150 piksel dijamin.
- Bulan purnama mencakup setidaknya 25% dari gambar.
- Program Anda menampilkan ukuran bulan yang dihitung dalam piksel seolah-olah bulan purnama.
- Kami berasumsi bahwa bulan adalah bola yang sempurna.
- Ukuran pastinya selalu angka integer, tetapi Anda bisa menampilkan angka desimal jika kalkulasi Anda mengembalikannya.
- Akurasi harus antara 98% dan 102%. (Itu lebih merupakan dugaan daripada sesuatu yang dapat saya jamin untuk dapat dicapai. Jika Anda pikir itu terlalu sulit untuk dijangkau, silakan tinggalkan komentar.)
Perbarui :
- Pusat bulan tidak harus di tengah-tengah gambar.
- Daerah minimum yang terlihat adalah 5% dari bulan atau 1,25% dari total jumlah piksel.
- Gambar diambil sedemikian rupa sehingga seluruh bulan akan sesuai dengan gambar, yaitu jumlah total piksel adalah batas atas untuk ukuran bulan.
- Bulan tidak akan dipotong / dipotong.
Sampel
Anda dapat membuat sampel sendiri menggunakan file campuran jika diinginkan. Saya telah membuat gambar-gambar berikut untuk Anda. Anda dapat menghitung piksel dalam file PNG menggunakan WhitePixelCounter.exe (perlu .NET) untuk memeriksa apakah gambar tersebut hanya berisi piksel hitam putih saja dan berapa jumlahnya.
Gambar 256x256 piksel berikut berbeda dalam jumlah piksel putih, tetapi semua harus menghasilkan ukuran bulan terhitung 16416 piksel.
Dan gambar 177x177 piksel ini harus mengembalikan 10241 piksel. Gambar pada dasarnya sama, tetapi kali ini kamera dengan focal length berbeda digunakan.
Sampel non-square dan non-centered dengan hasil 9988:
Oh, saya tidak memiliki implementasi referensi untuk saat ini dan saya bahkan tidak tahu apakah saya bisa mengimplementasikan sesuatu. Tetapi di otak saya ada keyakinan kuat yang mengatakan bahwa itu harus dipecahkan secara matematis.
Aturan
Ini Golf Code. Kode terpendek pada 2015-03-30 diterima.
sumber
Jawaban:
Mathematica
126 119109 byteMathematica dapat mengukur perpanjangan komponen dalam suatu gambar. Bulan purnama, menjadi simetris sempurna, memiliki perpanjangan 0, pada skala 0 hingga 1.
Bulan yang semakin berkurang semakin memanjang, hingga maksimum sekitar 0,8.
0.998 -0.788 x-0.578 x^2
adalah model yang ditentukan secara empiris (berdasarkan foto-foto besar) untuk `memprediksi kepenuhan bulan (berdasarkan area), mengingat pemanjangannya.Saya menyesuaikan model
1- 0.788 x -0.578 x^2
sehingga dengan pemanjangan nol (bulan purnama) model akan mengembalikan 1 untuk faktor skala piksel. Menghemat 4 byte dan masih tetap dalam batas akurasi.Model ini digunakan untuk berbagai ukuran gambar. Gambar bulan tidak perlu dipusatkan. Itu juga tidak perlu mencakup proporsi foto yang tetap.
Berikut adalah titik data (perpanjangan, ditampilkanMoonPixels / fullMoonPixels) untuk gambar besar dan model parabola yang dihasilkan agar sesuai dengan data. Model linier pas ok, tetapi model kuadrat mati, dalam batas (lihat di bawah).
Di sini datanya dari gambar-gambar besar. Begitu juga modelnya
Di bawah ini, data (titik merah) dari gambar kecil. Model (kurva biru) adalah yang dihasilkan oleh gambar-gambar besar, sama seperti yang ditampilkan di atas.
Bulan sabit terkecil memiliki 7,5% luas bulan purnama. (Bulan sabit terkecil di antara foto-foto besar adalah 19% dari bulan purnama.) Jika model kuadratik didasarkan pada foto-foto kecil, pas di bawah akan lebih baik, hanya karena menampung bulan sabit kecil. Model yang kuat, yang akan bertahan dalam berbagai kondisi, termasuk bulan sabit yang sangat kecil, akan lebih baik dibuat dari variasi gambar yang lebih besar.
Kedekatan cocok menunjukkan bahwa model itu tidak memiliki kode untuk gambar yang diberikan. Kita dapat cukup yakin bahwa perpanjangan bulan tidak tergantung pada ukuran foto, seperti yang diharapkan.
f
mengambil gambar,,i
sebagai input dan output ukuran bulan purnama, dalam piksel. Ini berfungsi untuk pemotretan di luar tengah.Seperti yang ditunjukkan oleh data di bawah ini, semua kasus uji kecuali satu. Bulan-bulan itu diatur dari penuh hingga paling berkurang.
Lebih dari satu komponen gambar dapat muncul di foto. Bahkan satu piksel terpisah dari yang lain akan dianggap sebagai komponen yang berbeda. Untuk alasan ini, perlu mencari komponen "semua", untuk menemukan komponen yang memiliki jumlah piksel lebih besar. (Salah satu foto kecil memiliki lebih dari satu komponen gambar.)
Gambar besar
Prediksi ukuran bulan yang dibuat dari foto-foto besar itu akurat secara seragam.
Gambar kecil
Prediksi ukuran bulan yang dibuat dari foto-foto kecil itu seragam, dengan satu pengecualian besar, gambar akhir. Saya menduga masalah ini berasal dari kenyataan bahwa bulan sabit sangat sempit.
sumber
i_~c~t_:=Max[#2&@@@i~ComponentMeasurements~t];f@i_:=i~c~"Count"/(1-0.788x-0.578x^2/.x->i~c~"Elongation")
#2&@@@
saran tersebut tidak berfungsic
adalahc=Max@ComponentMeasurements[##][[All,2]]&
J,
227207 byte (kesalahan maksimal 1,9%)Gagasan utama saya adalah bahwa jika kita dapat menemukan 3 titik pada kontur bulan yang berada pada kontur bulan purnama juga kita dapat menghitung lingkaran dari titik-titik ini. Lingkaran itu akan menuju bulan purnama.
Jika kita menemukan dua titik putih dengan jarak maksimal, itu akan selalu menjadi titik-titik karena keduanya akan berupa diagonal nyata di bulan purnama atau titik akhir bulan sabit.
Kita dapat menemukan pasangan titik dengan jarak terbesar dalam grafik apa pun dengan memilih titik terjauh dari titik awal yang diberikan dan kemudian memilih titik terjauh dari titik yang dipilih.Kami menemukan titik ketiga dengan nilai maksimal dari produk jarak dari titik sebelumnya. Ini akan selalu berada di kontur dan di sisi luar bulan sabit atau sisi yang lebih besar dari siamang.
Diameter sirkumulus dihitung sebagai panjang satu sisi dibagi dengan sinus dari sudut yang berlawanan.
Kompleksitas waktu dari metode ini linier dalam ukuran gambar input.
Kode
Fungsi mengharapkan nama file input sebagai string.
(Untuk versi revisi riwayat revisi yang lebih mudah dibaca.)
Penjelasan kode
bagian kedua dari definisi s membuat daftar 3 poin:
s adalah panjang sisi dari segitiga ABC
Hasil
Kesalahan terbesar adalah 1,9%.
Gambar berada dalam urutan yang sama seperti dalam pertanyaan.
sumber
Matlab
162156 (tidak cukup dalam margin kesalahan saat ini)Pertama-tama: Akurasi di bawah 2% untuk semua kecuali satu gambar di masing-masing dari dua seri, di mana lebih besar (sekitar 5% dan 14%). Pendekatan saya adalah menemukan dua piksel bulan yang paling jauh satu sama lain, dan kemudian menggunakan ini sebagai perkiraan untuk diameter.
Ini adalah hasil akurasi (penyimpangan relatif
1 - (predicted size / real size)
)sumber
C # - 617
Solusi ini tidak berfungsi untuk semua gambar, karena pada salah satu gambar, kemiringan (m) menjadi tak terbatas.
Prinsip itu disebutkan sebelumnya:
Kasus yang bermasalah adalah yang ini, di mana kemiringannya tak terbatas. Dimungkinkan untuk mengatasinya dengan memutar gambar 90 ° atau dalam kode, loop di atas
y
sumbu bukanx
.Akurasi minimum adalah
sumber