Kelebihan bola berbentuk segitiga
Seperti yang kita semua tahu, jumlah sudut dari setiap segitiga planar sama dengan 180 derajat.
Namun, untuk segitiga berbentuk bola, jumlah sudut selalu lebih besar dari 180 derajat. Perbedaan antara jumlah sudut segitiga bola dan 180 derajat disebut kelebihan bola . Tugasnya adalah untuk menghitung kelebihan bola dari segitiga dengan koordinat titik yang diberikan.
Beberapa latar belakang
Segitiga bola adalah bagian dari bola yang didefinisikan oleh tiga lingkaran besar bola.
Kedua sisi dan sudut segitiga bola diukur dalam istilah ukuran sudut, karena setiap sisi dapat dianggap sebagai persimpangan bola dan beberapa sudut planar dengan simpul di tengah bola:
Masing-masing tiga lingkaran besar yang berbeda menentukan 8 segitiga, tetapi kami hanya mempertimbangkan segitiga yang tepat , yaitu. segitiga yang ukuran sudut dan sampingnya memuaskan
Lebih mudah untuk mendefinisikan simpul segitiga dalam hal sistem koordinat geografis. Untuk menghitung panjang busur bola diberikan garis bujur λ dan garis lintang Φ dari ujungnya kita dapat menggunakan rumus:
dimana
atau lebih tepatnya:
(sumber: https://en.wikipedia.org/wiki/Haversine_formula )
Dua formula dasar yang dapat digunakan untuk memecahkan segitiga bola adalah:
- hukum cosinus:
- hukum sinus:
(sumber: https://en.wikipedia.org/wiki/Spherical_trigonometry#Cosine_rules_and_sine_rules )
Diberikan tiga sisi, mudah untuk menghitung sudut menggunakan aturan cosinus:
Akhirnya, kelebihan bola dari segitiga didefinisikan:
Apa yang menarik tentang hubungan antara kelebihan bola segitiga dan luasnya:
Jadi pada unit sphere, kelebihan sebuah segitiga sama dengan luas segitiga itu!
Tugas
Tulis fungsi atau program yang akan menghitung kelebihan bola dari segitiga dalam derajat yang diberikan koordinat segitiga simpul. Koordinat titik disediakan dalam hal sistem koordinat geografis.
Setiap titik harus dilewatkan dalam bentuk [latitude in degrees][N|S][longitude in degrees][E|W]
. Bujur dan E
atau W
dapat dilewati ketika lintang adalah 90 yaitu. 90N
, 90S
, 10N100E
, 30S20W
Adalah deskripsi vertex yang tepat, sementara 80N
atau 55S
tidak.
Garis lintang dan bujur selalu bilangan bulat dalam kasus uji.
Jawaban dengan kesalahan kurang dari satu derajat akan diterima (seperti dalam contoh di bawah). Hasilnya dapat ditampilkan sebagai nyata atau bilangan bulat, hingga kenyamanan Anda.
Contohnya
Memasukkan
90N0E
0N0E
0N90E
Keluaran
89.999989
Memasukkan
90N
0N0E
0N90E
Keluaran
89.999989
Memasukkan
0N0E
0N179E
90N0E
Keluaran
178.998863
Memasukkan
10N10E
70N20W
70N40E
Keluaran
11.969793
Dalam semua kasus uji, bujur dan lintang adalah bilangan bulat. Parsing koordinat titik adalah bagian dari tugas, sehingga simpul harus dilalui sebagai satu string / literal, itu tidak diperbolehkan untuk melewati 80N20E
empat parameter / string: 80
, N
, 20
, E
.
Ini dijamin bahwa semua simpul berbeda dan tak satu pun dari tiga simpul membuat pasangan antipodal.
Mencetak gol
Ini kode-golf , jadi kode terpendek menang.
sumber
Jawaban:
Matlab,
288266 bytesDi sini versi komentar yang harus menjelaskan apa yang sedang terjadi:
Sepenuhnya golf (linebreak dapat dihapus):
sumber
Ruby, Rev 3
264255 bytePerubahan besar:
Konstanta baru
r
= 180 / PI didefinisikan dan digunakan di seluruh fungsi.e
harus diinisialisasi ke + PI, jadi kelebihan sekarang dihitung ke bawah dan dinegasikan sebelum kembali.t[]
dihilangkan: Ruby memungkinkan data yang ditugaskan untukt[]
ditugaskan langsung keu,v,w.
Satu
i
loop untuk melakukan pekerjaan dua,?:
operator ternary beralih di antara tugas.Banyak perubahan kecil lainnya.
Ruby, Rev 1
283277 bytesMembutuhkan array 3 string.
Gambaran
Panjang sisi segitiga pada satuan bola sama dengan sudut antara vektor yang menggambarkan dua titik. Tapi kita tidak perlu tahu sudut itu. Cukuplah untuk mengetahui kosinus sudut, yang mudah diperoleh dari koordinat kartesius menggunakan Produk Dot.
Penjelasan
String input dikonversi menjadi representasi string dari array, yang kemudian dievaluasi dan disimpan
t
, seperti di bawah ini. Nol akhir tidak diperlukan jika dua koordinat diberikan. Jika hanya lintang 90 yang diberikan, nol diartikan sebagai garis bujur.Produk Dot berbentuk
a.b=ax*bx+ay*by+az*bz
. Karena semua vektor panjang unit, produk titik sama dengan cosinus sudut antara vektor.Untuk menghitungnya, sebuah loop diulang 6 kali melewati dua kali input data. Pada iterasi genap 0,2,4 variabel
x,y,z
ditetapkan ke 1 untuk memulai perhitungan baru. Pada setiap iterasi, variabel-variabel ini dikalikan dengan komponen x, y dan z dari masing-masing vektor, menggunakan data bujur dan lintang yang disimpan dit[0],t[1]
dalamnya (yang karena alasan golf juga ditugaskanu,v
). Jumlah variabel ditulis ke arrayn
(nilai-nilai sampah pada iterasi bahkan ditimpa oleh nilai-nilai yang benar pada iterasi aneh) sehingga pada akhirnyan
berisi produk 3 titik[a.b, c.a, b.c]
.Untuk aturan cosinus, kita membutuhkan cosinus dari tiga sudut termasuk di antara simpul, tetapi kita juga membutuhkan sinus. Ini diperoleh sebagai
sqrt(1-cosine**2)
. Ketika sinus dikalikan bersama, ekspresi dapat diatur ulang sehingga hanya satu panggilan kesqrt
diperlukan. Fakta bahwa kita tidak tahu apakah sinus itu positif atau negatif tidak masalah, karena rumus haversine selalu memberikan sinus positif pula. Kuantitas fisik yang penting adalah jarak antara titik-titik, yang mutlak dan karenanya selalu positif.Untuk setiap iterasi
i=0..2
, kami menghitung nilai untuk elemen array berlawanan suduti-1
menggunakan elemen laini
dani-2
. Subskrip array negatif seperti ini legal di Ruby, mereka hanya membungkus ke awal array.Tidak digabungkan dalam program uji
Membutuhkan tiga set koordinat pada baris yang sama, dengan spasi di antaranya.
sumber