Kelas master "Bola Natal" terbuat dari kertas dengan tangan Anda sendiri. Bola dua segitiga

Segitiga bulat dan penerapannya.

segitiga bulat- sosok geometris di permukaan bola, dibentuk oleh persimpangan tiga lingkaran besar. Tiga lingkaran besar pada permukaan bola yang tidak berpotongan pada satu titik membentuk delapan segitiga bola. Segitiga bulat yang semua sisinya kurang dari setengah lingkaran besar disebut Euler.

Sisi segitiga bola diukur dengan nilai sudut pusat berdasarkan itu. Sudut segitiga bola diukur dengan nilai sudut dihedral antara bidang-bidang di mana sisi-sisi sudut ini terletak. Hubungan antara elemen segitiga bola dipelajari oleh trigonometri bola.

Sifat-sifat segitiga bola:

  1. Selain tiga syarat persamaan segitiga bidang, satu lagi berlaku untuk segitiga bola: dua segitiga bola adalah sama jika sudut-sudut yang bersesuaian sama besar.
  2. Untuk sisi-sisi segitiga bola, berlaku 3 pertidaksamaan segitiga: setiap sisi lebih kecil dari jumlah kedua sisi lainnya dan lebih besar dari selisihnya.
  3. Jumlah semua sisi a + b + c selalu lebih kecil dari 2πR.
  4. Besaran 2πR (a + b + c) disebut cacat bola
  5. Jumlah sudut-sudut suatu segitiga bulat s = + + selalu lebih kecil dari 3π dan lebih besar dari
  6. Kuantitas ini disebut kelebihan bola atau kelebihan bola
  7. Luas segitiga bola ditentukan oleh rumus.
  8. Tidak seperti segitiga datar, segitiga bola dapat memiliki dua atau bahkan tiga sudut masing-masing 90°.

Di antara semua poligon bola, yang paling menarik adalah segitiga bola. Tiga lingkaran besar, berpotongan berpasangan di dua titik, membentuk delapan segitiga bola pada bola. Mengetahui elemen (sisi dan sudut) dari salah satunya, Anda dapat menentukan elemen dari semua yang lain, oleh karena itu, pertimbangkan hubungan antara elemen salah satunya, yang semua sisinya kurang dari setengah lingkaran besar. Sisi-sisi segitiga diukur dengan sudut datar dari sudut trihedral OABS, sudut segitiga diukur dengan sudut dihedral dari sudut trihedral yang sama, lihat Gambar.

Sifat-sifat segitiga bola berbeda dalam banyak hal dari sifat-sifat segitiga pada bidang. Jadi, untuk tiga kasus persamaan segitiga siku-siku yang terkenal, ditambahkan keempat: dua segitiga ABC dan A`B`C` sama jika ketiga sudut PA = RA`, PB = PB`, PC = PC` adalah sama, masing-masing. Jadi, segitiga serupa tidak ada pada bola; apalagi, dalam geometri bola tidak ada konsep kesamaan itu sendiri, karena tidak ada transformasi yang mengubah semua jarak dengan jumlah yang sama (tidak sama dengan 1). Fitur-fitur ini terkait dengan pelanggaran aksioma Euclidean tentang garis paralel dan juga melekat pada geometri Lobachevsky. Segitiga yang memiliki elemen yang sama dan orientasi yang berbeda disebut simetris, seperti, misalnya, segitiga AC`C dan BCC`

Jumlah sudut setiap segitiga bola selalu lebih besar dari 180°. Perbedaan RA + RV + RS - p \u003d d (diukur dalam radian) - adalah nilai positif dan disebut kelebihan bola dari segitiga bola yang diberikan. Luas segitiga bola: S = R2 d di mana R adalah jari-jari bola dan d adalah kelebihan bola. Rumus ini pertama kali diterbitkan oleh orang Belanda A. Girard pada tahun 1629 dan dinamai menurut namanya.

Jika kita mempertimbangkan digon dengan sudut a, maka pada 226 = 2p/n (n adalah bilangan bulat) bola dapat dipotong menjadi tepat n salinan dari digon tersebut, dan luas bola adalah 4pR2 = 4p di R = 1, jadi luas digon adalah 4p/n = 2a. Rumus ini juga berlaku untuk a = 2pt/n dan, oleh karena itu, berlaku untuk semua a. Jika kita melanjutkan sisi-sisi segitiga bola ABC dan menyatakan luas bola dalam bentuk luas diagon-diagon yang dibentuk dalam hal ini dengan sudut A, B, C dan luasnya sendiri, maka kita dapat sampai pada soal di atas rumus gir.

Yang dimaksud dengan segitiga bola adalah segitiga di permukaan bola, terdiri dari busur lingkaran besar - yaitu, lingkaran seperti itu, yang pusatnya adalah pusat bola. Sudut segitiga bola adalah sudut antara garis singgung dengan sisi-sisinya yang ditarik pada titik-titiknya. Seperti sudut segitiga biasa, mereka berkisar dari 0 hingga 180 °. Tidak seperti segitiga datar, segitiga bola tidak memiliki jumlah sudut yang sama dengan 180 °, tetapi lebih: mudah untuk memverifikasi ini dengan mempertimbangkan, misalnya, segitiga yang dibentuk oleh busur dua meridian dan khatulistiwa pada bola dunia. : meskipun meridian bertemu di kutub, keduanya tegak lurus terhadap khatulistiwa, sehingga segitiga ini memiliki dua sudut siku-siku!

Segitiga bola dapat memiliki dua sudut siku-siku

Sudah Varahamihira India (abad ke-5-6), matematikawan dan astronom Arab dari abad ke-9. (Sabit ibn Korra, al-Battani), dan di antara matematikawan Barat, mulai dari Regiomontanus (abad XV), ada teorema yang luar biasa tentang segitiga bola dalam berbagai formulasi. Berikut adalah bagaimana hal itu dapat dirumuskan dalam notasi modern:

cosa = cosbcosc + sinbsinccosA. Teorema kosinus bola sangat penting untuk astronomi dan geografi. Teorema ini memungkinkan menggunakan koordinat dua kota A dan B untuk menemukan jarak di antara mereka. Selain itu, teorema kosinus bola membantu matematikawan di negara-negara Islam dalam memecahkan masalah praktis lain: di kota dengan koordinat tertentu, temukan arah ke kota suci Mekah (setiap Muslim ortodoks harus berdoa lima kali sehari ke arah Mekah) . Ketika memecahkan masalah ini, mengingat kota B sebagai Mekah, diperlukan untuk menemukan sudut A dari segitiga yang sama.

Sebuah halaman dari "Collection of Rules for the Science of Astronomy", abad ke-11, penulis tidak diketahui.

Dalam astronomi, teorema kosinus bola memungkinkan Anda untuk berpindah dari satu sistem koordinat pada bola langit ke yang lain. Tiga sistem seperti itu paling sering digunakan: dalam satu, khatulistiwa langit berfungsi sebagai khatulistiwa, dan kutub dunia berfungsi sebagai kutub, di mana rotasi harian yang terlihat dari tokoh-tokoh terjadi; di sisi lain, khatulistiwa adalah ekliptika - lingkaran di mana pergerakan Matahari yang terlihat dengan latar belakang bintang terjadi sepanjang tahun; di ketiga, peran khatulistiwa dimainkan oleh cakrawala, dan peran kutub dimainkan oleh zenit dan nadir. Secara khusus, berkat teorema kosinus bola, dimungkinkan untuk menghitung ketinggian Matahari di atas cakrawala pada waktu yang berbeda dan pada hari yang berbeda dalam setahun.

Layar dalam arsitektur adalah segitiga bola, memberikan transisi dari ruang kubah persegi ke keliling kubah. Sail, pandative (dari pendentif Prancis) - bagian dari kubah, elemen struktur kubah, di mana transisi dari dasar persegi panjang ke langit-langit kubah atau drumnya dibuat. Layar memiliki bentuk segitiga bola, dengan puncaknya ke bawah, dan mengisi ruang di antara lengkungan pegas yang menghubungkan pilar-pilar persegi berkubah yang berdekatan. Basis segitiga bola layar bersama-sama membentuk lingkaran dan mendistribusikan beban kubah di sepanjang lengkungan.

Kubah di layar lukisan layar

George Nelson

"Desainer dapat bersantai dan bersenang-senang; hasilnya bisa menjadi lelucon, kesenangan. Sungguh menakjubkan betapa seringnya ini sangat menyenangkan." George Nelson

George Nelson adalah seorang desainer Amerika, arsitek, kritikus dan ahli teori desain. (1908, Hartford, Connecticut - 1986, New York)

Dia merancang perlengkapan pencahayaan, jam, furnitur, pengemasan, dan terlibat dalam desain pameran.

Proyek desain paling terkenal dari George Nelson adalah stylization bentuk geometris yang ahli dalam semangat seni op atau abstraksionisme geometris.

Perancang membangun bentuk kursi hitamnya yang terkenal berdasarkan segitiga bola, yang banyak digunakan dalam struktur arsitektur struktur kubah. Secara khusus, di gereja-gereja Bizantium dan Rusia, segitiga bulat seperti itu disebut "layar". Berkat "layar", transisi yang mulus dari dukungan kubah ke kubah dilakukan.

George Nelson (George Harold Nelson, 1908-1986)

ukiran escher

Bola konsentris 1935. Ukiran ujung 24 kali 24 cm.

Empat bola konsentris berongga diterangi oleh sumber cahaya pusat. Setiap bola terdiri dari kisi-kisi yang dibentuk oleh sembilan cincin besar yang berpotongan; mereka membagi permukaan bola menjadi 48 segitiga bola yang serupa. Maurits Cornelis Escher (Belanda. Maurits Cornelis 17 Juni 1898, Leeuwarden, Belanda - 27 Maret 1972, Laren, Belanda) - seniman grafis Belanda.

Penerapan segitiga bola:

  1. Penggunaan segitiga bola dalam grafik 3D
  2. Dalam astronomi
  3. Dalam geografi. Teorema segitiga bola memungkinkan Anda menggunakan koordinat dua kota A dan B untuk menemukan jarak di antara keduanya.
  4. Dalam arsitektur
  5. Desain kursi oleh George Nelson
  6. dalam ukiran

trigonometri bola

segitiga bola. Di permukaan bola, jarak terpendek antara dua titik diukur sepanjang keliling lingkaran besar, yaitu lingkaran yang bidangnya melewati pusat bola. Titik sudut segitiga bola adalah titik potong dari tiga sinar yang muncul dari pusat bola dan permukaan bola. Para Pihak sebuah, b, c dari segitiga bola adalah sudut-sudut antara sinar yang lebih kecil (jika salah satu sudut ini sama, maka segitiga bola merosot menjadi setengah lingkaran dari lingkaran besar). Setiap sisi segitiga sesuai dengan busur lingkaran besar di permukaan bola (lihat gambar).

sudut A, B, C segitiga bola sisi yang berhadapan sebuah, b, c masing-masing, adalah, menurut definisi, lebih kecil dari , sudut antara busur lingkaran besar yang sesuai dengan sisi segitiga, atau sudut antara bidang yang ditentukan oleh sinar ini.

trigonometri bola berkaitan dengan studi tentang hubungan antara sisi dan sudut segitiga bola (misalnya, di permukaan Bumi dan di bola langit). Namun, fisikawan dan insinyur dalam banyak masalah lebih suka menggunakan transformasi rotasi daripada trigonometri bola.

Sifat-sifat segitiga bola. Setiap sisi dan sudut segitiga bola, menurut definisi, kurang dari .

Geometri pada permukaan bola adalah non-Euclidean; di setiap segitiga bola jumlah sisi adalah antara 0 dan , jumlah sudut antara dan . Dalam setiap segitiga bola, sudut yang lebih besar terletak di seberang sisi yang lebih besar. Jumlah dua sisi lebih besar dari sisi ketiga, jumlah dua sudut lebih kecil dari ditambah sudut ketiga.

Segitiga bola dan rumus dasar trigonometri bola

Banyak masalah astronomi yang terkait dengan posisi dan pergerakan benda langit yang tampak direduksi menjadi penyelesaian segitiga bola.

Segitiga bola adalah sosok ABC di permukaan bola, yang dibentuk oleh busur tiga lingkaran besar (Gbr. 15).

Sudut segitiga bola adalah sudut dihedral antara bidang lingkaran besar yang membentuk sisi segitiga bola. Sudut-sudut ini diukur dengan sudut datar di simpul segitiga antara garis singgung ke sisi-sisinya.

Segitiga biasanya dianggap, sudut dan sisi yang kurang dari 180 °. Untuk segitiga berbentuk bola seperti itu, jumlah sudutnya selalu lebih besar dari 180° tetapi kurang dari 540°, dan jumlah sisinya selalu kurang dari 360°. Selisih antara jumlah ketiga sudut segitiga bola dan 180° disebut kelebihan bola , yaitu

= DA + DB + DC - 180°.

Luas segitiga bola s adalah

Dimana R adalah jari-jari bola pada permukaan segitiga yang terbentuk.

Segitiga bola, oleh karena itu, berbeda dalam sifat-sifatnya dari yang datar, dan tidak mungkin untuk menerapkan rumus trigonometri pada bidang itu.

Ambil segitiga bola ABC (Gbr. 15), dibentuk pada bola dengan jari-jari R dan berpusat di titik O.

Dari titik A kita tarik garis singgung AD dan AE ke sisi b dan c sampai mereka berpotongan dengan perpanjangan jari-jari OS dan 0B, yang terletak pada bidang yang sama dengan garis singgung yang sesuai. Menghubungkan titik-titik langsung perpotongan D dan E, kita memperoleh dua segitiga miring datar ADE dan ODE dengan sisi DE yang sama. Menerapkan teorema geometri dasar untuk segitiga ini, kami menulis:

DE 2 \u003d OD 2 + OE 2 - 2OD × OE × karena a,

DE 2 \u003d AD 2 + AE 2 - 2AD × AE × cos A.

Dengan mengurangkan persamaan kedua dari persamaan pertama, kita memperoleh:

2OD × OE × cos a \u003d OD 2 - AD 2 + OE 2 - AE 2 + 2AD × AE × cos A. (1.31)

Dari segitiga datar siku-siku OAE dan OAD berikut:

OD 2 -AD 2 =R 2 ;OE 2 -AE 2 =R 2 ;

AD = Rtg b ; AE = Rtg s;

Substitusikan hubungan ini ke dalam rumus (1.31) dan buat pengurangan dan transfer yang sesuai, kita peroleh

cos a \u003d cos b cos c + sin b sin c cos A, (1.32)

itu. kosinus dari sisi segitiga bola sama dengan produk dari kosinus dari dua sisi lainnya ditambah dengan produk dari sinus dari sisi yang sama dan kosinus dari sudut di antara mereka.

Rumus (1.32) dapat ditulis untuk sembarang sisi segitiga. Mari kita tulis, misalnya, untuk sisi b:

cos b = cos dengan cos a + sin dengan sin a cos B

dan, dengan mensubstitusi cos a ke dalam rumus (1.32), kita peroleh

cos b = cos c (cos b cos c + sin b sin c cos A) + sin c sin a cos B.

Memperluas tanda kurung dan memindahkan suku pertama dari sisi kanan ke kiri, kita akan mendapatkan:

cos b (1 - cos 2 s) \u003d sin b sin dengan cos dengan cos A + sin c sin a cos B.

Mengganti (1 - cos 2 s) dengan sin 2 s dan mengurangi semuanya dengan sin c, akhirnya diperoleh

sin a cos B \u003d sinc cos b - cos c sin b cos A, (1.33)

itu. hasil kali sinus sisi dan kosinus sudut yang disertakan sama dengan produk sinus sisi lain yang membatasi sudut yang disertakan dengan kosinus sisi ketiga dikurangi produk kosinus sisi yang membatasi sisi yang disertakan sudut dengan sinus sisi ketiga dan kosinus dari sudut yang berhadapan dengan sisi pertama.

Rumus (1.33) disebut rumus lima unsur. Dapat ditulis dengan analogi untuk perkalian sin a cos C, sin b cos A, sin b cos C, sin dengan cos A dan sin dengan cos B.

Kami sekarang memecahkan persamaan (1.32) sehubungan dengan cos A:

Dengan mengkuadratkan kedua ruas persamaan terakhir dan mengurangkannya dari 1, kita peroleh:

Membuka tanda kurung dan membagi kedua bagian dari ekspresi ini dengan sin 2 a, kita dapatkan

Ekspresi yang dihasilkan simetris sempurna terhadap a, b dan c, dan mengganti A dengan B dan b atau A dengan C dan a dengan c, kita tulis

itu. sinus sisi-sisi segitiga bola sebanding dengan sinus sudut-sudutnya yang berlawanan; atau rasio sinus dari sisi segitiga bola dengan sinus sudut yang berlawanan adalah konstan.

Tiga hubungan turunan (1,32), (1,33), (1,34) antara sisi dan sudut segitiga bola adalah yang utama; banyak rumus lain dari trigonometri bola dapat diturunkan dari mereka. Kami membatasi diri untuk menurunkan hanya satu rumus untuk segitiga bola siku-siku. Misalkan A = 90°; kemudian sin A \u003d 1, cos A \u003d 0, dan dari rumus (1.33) kita dapatkan

sin a cos B \u003d sin dengan cos b.

Membagi kedua bagian persamaan ini dengan sin b dan mensubstitusinya, menurut (1.34), kita akan mendapatkan:

ctg B = sin c ctg b

itu. rasio tangen salah satu kaki segitiga bola siku-siku dengan tangen dari sudut yang berlawanan sama dengan sinus kaki lainnya.

Untuk mewakili informasi tentang gambar pada bola Gaussian di komputer, masuk akal untuk membagi permukaannya menjadi sel.

Dalam hal ini, area bagian permukaan asli itu, yang berorientasi di dalam kerucut arah yang ditentukan oleh sel partisi, dikaitkan dengan setiap sel. Pendekatan diskrit seperti itu dari gambar bola yang diperluas disebut histogram orientasi. Idealnya, sel harus memenuhi persyaratan berikut:

Memiliki luas yang sama;

Jadilah bentuk yang sama

Berjarak secara teratur;

Memiliki bentuk bulat;

Partisi harus memberikan resolusi sudut yang cukup baik;

Harus ada rotasi yang membawa partisi ke dalam dirinya sendiri.

Sel yang memanjang harus dikecualikan, karena mereka akan sesuai dengan informasi tentang area permukaan, yang orientasinya lebih berubah daripada dalam kasus sel yang lebih bulat di area yang sama. Pada saat yang sama, jika sel-sel diatur secara teratur, maka lokasi mereka dalam kaitannya dengan tetangga mereka akan sama untuk semua sel, dan konfigurasi seperti itu sangat diinginkan. Sayangnya, tidak mungkin untuk memenuhi semua persyaratan ini secara bersamaan.

Salah satu partisi yang mungkin dibentuk oleh sabuk latitudinal, yang masing-masing kemudian dibagi lagi oleh garis-garis meridional (Gbr. 16.13). Sel-sel yang dihasilkan dapat dibuat hampir sama luasnya jika jumlah pita seperti itu di garis lintang tinggi dikurangi. Salah satu keuntungan dari skema tersebut adalah kesederhanaan menemukan sel yang perlu untuk menetapkan normal tertentu ke permukaan. Namun, metode seperti itu terlalu jauh dari memenuhi persyaratan yang tercantum di atas. Misalnya, tidak ada rotasi yang dengannya partisi bola yang dibangun diterjemahkan ke dalam dirinya sendiri (kecuali untuk rotasi tentang sumbu yang menghubungkan kutub).

Partisi yang lebih cocok dapat diperoleh dengan memproyeksikan ke polihedra reguler bola unit yang pusatnya bertepatan dengan pusat bola. Wajah polihedron beraturan adalah poligon beraturan (dan semuanya sama). Oleh karena itu, partisi yang diperoleh dengan proyeksi polihedron beraturan memiliki sifat bahwa semua sel memiliki bentuk dan luas yang sama. Selain itu, susunan geometris semua sel terhadap tetangganya adalah sama. Sayangnya,

Beras. 16.13. Pembagian bola menjadi elemen oleh meridian dan paralel. Sayangnya, partisi seperti itu hanya memiliki sedikit properti yang diperlukan untuk menyimpan histogram orientasi.

Beras. 16.14. (lihat pindaian) Memproyeksikan dodecahedron dan icosahedron ke satu bola untuk mendapatkan partisi ke dalam dan sel.

hanya lima benda biasa yang diketahui, dari mana seseorang harus memilih (tetrahedron, hexahedron, octahedron, dodecahedron dan icosahedron). Untuk dodecahedron, selnya cukup bulat (Gbr. 16.14, a). Dodecahedron, bagaimanapun, hanya memiliki dua belas wajah. Bahkan ikosahedron memberikan representasi orientasi yang sangat kasar (Gambar 16.14b). Selain itu, dua puluh selnya tidak terlalu bulat.

Kita bisa melangkah lebih jauh dan mempertimbangkan polyhedra semi-reguler. Wajah mereka juga poligon biasa, tetapi tidak harus sama. Area semua wajah tidak sama. Dalam beberapa kasus, dimungkinkan untuk membangun polihedron baru yang memiliki topologi yang sama dari koneksi antar muka seperti polihedron semireguler asli, tetapi luas mukanya sama. Di mana

Beras. 16.15. a - icosahedron terpotong, yang merupakan polihedron semi-reguler dengan 32 wajah; b - penta hingga decahedron, terdiri dari 60 wajah segitiga. Partisi yang lebih kecil dari permukaan unit bola dapat didasarkan pada polihedra semireguler tersebut.

Beras. 16.16. Kemampuan untuk membangun jaringan geodesi berdasarkan salah satu proyeksi polihedra reguler atau semi-reguler.

Setiap wajah dibagi menjadi sel segitiga. Jaringan yang ditampilkan di sini didasarkan pada ikosahedron dan memiliki 12 simpul, yang berdekatan dengan 5 sel. Enam sel berkumpul di simpul yang tersisa.

bentuk beberapa wajah tidak lagi benar. Contoh partisi berdasarkan polihedron semi-reguler memberikan bola sepak (Gbr. 16.15, a). Icosahedron terpotong, yaitu, tubuh dengan 12 wajah pentagonal dan 20 heksagonal, diambil sebagai yang pertama. Sayangnya, hanya ada 13 polihedra semireguler (lima polihedra reguler terpotong, kuboctahedron, icosidodecahedron, snub cube, icosidodecahedron snub, cuboctahedron terpotong, rhombicuboctahedron, icosidodecahedron terpotong, dan dodereredhombicedron). Mereka tidak mengarah ke partisi yang cukup kecil untuk tujuan kita.

Jika kita masih ingin mendapatkan partisi yang lebih halus, maka kita dapat mencoba menguraikan partisi yang sudah ada menjadi elemen segitiga. Misalnya, jika kita memecah masing-masing wajah pentagonal dari dodecahedron menjadi lima segitiga yang sama, kita mendapatkan pentadodecahedron dengan 60 wajah (Gbr. 16.15, b). Ohm adalah ganda ke icosahedron terpotong.

Dengan arah yang sama, masing-masing segitiga yang dihasilkan dapat dibagi lagi menjadi empat segitiga yang lebih kecil, sesuai dengan struktur kubah yang terkenal dalam geodesi (Gbr. 16.16). Dengan melonggarkan beberapa persyaratan di atas, resolusi tinggi dapat dicapai. Bahkan, lebih baik menggunakan konstruksi ganda, karena wajah mereka sangat heksagonal (tidak beraturan) dengan 12 pentagon tersebar di antara mereka (Gbr. 16.15, b). Partisi kecil sewenang-wenang dapat disediakan dengan cara ini.

Untuk menggunakan pendekatan ini, perlu untuk dapat secara efisien menentukan elemen yang sesuai dengan normal yang diberikan ke permukaan. Dalam kasus partisi yang diperoleh berdasarkan politop biasa, mudah untuk menghitung kosinus sudut antara vektor satuan yang diberikan dan vektor yang sesuai dengan pusat sel. (Yang terakhir sesuai dengan simpul dari dual

polihedron biasa.) Kemudian vektor yang diberikan ditugaskan ke sel yang pusatnya paling dekat. Dalam kasus partisi yang mirip dengan jaringan geodetik, dimungkinkan untuk bertindak secara hierarkis. Partisi semacam itu didasarkan pada beberapa polihedron biasa. Sel dengan pusat terdekat ditemukan seperti dijelaskan di atas. Setelah itu, kami menentukan segitiga mana yang membaginya, vektor normal satuan jatuh. Proses ini berlanjut untuk empat segitiga berikutnya yang membagi yang ditemukan, dan seterusnya.Dalam praktiknya, metode pencarian tabel dapat digunakan yang, meskipun tidak akurat, sangat cepat.

Biarkan sudut padat yang diisi oleh satu sel pada bola menjadi (dalam kasus ikosahedron). Banyaknya normal yang diharapkan yang berada di dalam sel tersebut untuk benda cembung adalah

Jelas bahwa histogram orientasi, yaitu pendekatan diskrit dari gambar sferis yang diperluas, dapat dihitung secara lokal. Kami hanya menghitung jumlah normal yang dimiliki setiap sel. Pada saat yang sama, kelengkungan Gaussian dinyatakan dalam turunan parsial pertama dan kedua dari fungsi yang mendefinisikan permukaan. Dalam praktiknya, perkiraan turunan ini ternyata tidak dapat diandalkan karena adanya kebisingan. Oleh karena itu, fakta bahwa gambar sferis yang diperluas dapat dihitung tanpa menghitung turunan sangat penting.

Kisah demo ini adalah sebagai berikut: suatu kali seorang teman saya membuat generator peta planet untuk gimnya dan ingin peta yang dibuat dengan cara ini ditampilkan sebagai bola berputar. Namun, pada saat yang sama, dia tidak ingin menggunakan grafik 3D, melainkan menghasilkan banyak bingkai dengan bola yang sama yang diputar pada sudut yang berbeda. Jumlah memori yang digunakan adalah ... boleh kami katakan, berlebihan, tetapi kecepatan pembuatan bingkai (serta kualitas eksekusinya) sangat menurun. Setelah sedikit berpikir, saya berhasil membantunya mengoptimalkan proses ini, tetapi secara umum saya merasa bahwa ini adalah tugas untuk OpenGL, dan bukan untuk grafik 2D sama sekali.

Jadi, suatu hari, ketika saya tersiksa oleh insomnia, saya memutuskan untuk mencoba menggabungkan dua pendekatan ini: menggambar bola yang berputar (dengan peta planet yang terbentang di atasnya) melalui OpenGL, tetapi pada saat yang sama membiarkannya datar.

Dan saya harus mengatakan bahwa saya berhasil. Tapi hal pertama yang pertama.

Proses Matematika

Untuk memulainya, mari kita definisikan tugas yang sebenarnya. Untuk setiap titik di layar, kami memiliki dua koordinat layar dalam sistem koordinat Cartesian, dan kami perlu menemukan koordinat bola untuk itu (sebenarnya, lintang dan bujur), yang sebenarnya adalah koordinat tekstur untuk peta planet.

Jadi. Transisi dari sistem koordinat bola ke sistem Cartesian diberikan oleh sistem persamaan (diambil dari Wikipedia):

Dan transisi terbalik - dengan persamaan seperti itu:

Koordinat Z kita dapat dengan mudah keluar X dan kamu, mengetahui jari-jarinya, dan kita dapat mengambil jari-jari itu sendiri sama dengan satu.
Di masa depan, kita akan setuju bahwa kita akan sedikit mengubah persamaan di atas dengan menukar konsep kamu(bagi kami itu akan menjadi layar vertikal) dan Z(ini akan menjadi kedalaman adegan).

Bagian teknis

Implementasi ide akan mengharuskan kita untuk menggunakan quad (saya sudah berbicara tentang cara menggunakannya, jadi saya tidak akan mengulanginya, terutama karena di bawah ini adalah tautan ke kode sumber lengkap proyek), serta dua tekstur: peta planet yang sebenarnya (saya menggunakan tekstur Bumi 2048x1024 ) dan peta koordinat tekstur. Kode untuk menghasilkan tekstur kedua dengan rapi mengulangi matematika konversi dari koordinat Cartesian ke bola:

int ukuranteks = 1024; double r = texSize * 0,5; int piksel = int baru; for (int baris = 0, idx = 0; baris< texSize; row++) { double y = (r - row) / r; double sin_theta = Math.sqrt(1 - y*y); double theta = Math.acos(y); long v = Math.round(255 * theta / Math.PI); for (int col = 0; col < texSize; col++) { double x = (r - col) / r; long u = 0, a = 0; if (x >= -sin_theta && x<= sin_theta) { double z = Math.sqrt(1 - y*y - x*x); double phi = Math.atan2(z, x); u = Math.round(255 * phi / (2 * Math.PI)); a = Math.round(255 * z); } pixels = (int) ((a << 24) + (v << 8) + u); } } GLES20.glGenTextures(1, genbuf, 0); offsetTex = genbuf; if (offsetTex != 0) { GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, offsetTex); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_NONE); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_NONE); GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, texSize, texSize, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, IntBuffer.wrap(pixels)); }
Perhatikan bahwa koordinat X dan kamu ditransfer dari rentang ke rentang [-1..1], dan koordinat tekstur kamu dan V dikonversi dari radian ke kisaran , setelah itu masing-masing ditulis ke komponen merah dan hijau dari tekstur 32-bit. Saluran alfa digunakan untuk menyimpan "kedalaman" (koordinat Z), sementara biru tetap tidak digunakan untuk saat ini. Menonaktifkan pemfilteran bilinear juga tidak disengaja: pada tahap ini tidak memberikan efek apa pun (titik tetangga dalam hal apa pun memiliki nilai yang sama, dengan lompatan yang agak tajam), dan dalam apa yang akan saya tunjukkan selanjutnya, itu akan berbahaya. Tetapi lebih lanjut tentang itu di bawah ini.

Kedua tekstur diumpankan ke input shader piksel sederhana (selanjutnya, gambar dapat diklik):

Private final String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "vec4 TexCoord0 yang bervariasi;\n" + "void main() (\n" + " vec4 vTex = texture2D(uTexture0, TexCoord0.xy);\n" + " vec3 vCol = texture2D(uTexture1, vTex.xy).rgb;\n" + " gl_FragColor = vec4(vCol, (vTex.w >
Saya tidak memberikan kode rendering adegan, karena semuanya agak sepele di dalamnya (dan, sekali lagi, Anda dapat melihatnya di sumber lengkap), dan shader itu sendiri cukup primitif. Hal yang paling aneh tentangnya, mungkin, adalah sejauh ini saluran alfa hanya diperiksa kepositifannya, sementara itu dapat digunakan untuk efek pencahayaan.

Ternyata cukup baik, tapi entah bagaimana datar, ditambah saya ingin menambahkan rotasi aktual planet di sekitar porosnya.

Kami menyertakan satu parameter lagi di shader (kami akan mengubahnya tergantung pada waktu dalam rentang), ditambah kami menambahkan "kedalaman" (mengkalikan warna dengan nilai dari saluran alfa):

QuadFS String akhir pribadi = "float mediump presisi;\n" + "sampel seragam2D uTexture0;\n" + "sampel seragam2D uTexture1;\n" + "pelampung seragam uOffset;\n" + "vec4 TexCoord0;\n" + "void main() (\n" + " vec4 vTex = texture2D(uTexture0, TexCoord0.xy);\n" + " vTex.x += uOffset;\n" + " vec3 vCol = texture2D(uTexture1, vTex.xy ).rgb;\n" + " gl_FragColor = vec4(vCol * vTex.w, (vTex.w > 0.0 ? 1.0: 0.0));\n" + ")\n";
Yah, tidak ada keluhan tentang bola itu sendiri, tetapi gambarnya terlihat entah bagaimana ... delapan-bit, atau sesuatu. Dan tidak heran: kami mencatat koordinat tekstur dalam rentang (maksimum yang tersedia untuk kami dalam komponen warna biasa), yang berarti bahwa tekstur kami tidak boleh memiliki tinggi lebih dari 256 titik (dan lebar 512, dengan mempertimbangkan rotasi). Tidak cukup, Anda membutuhkan setidaknya presisi 10-bit.

Meningkatkan resolusi

Saya segera memperingatkan Anda: kode yang dijelaskan di sini dapat bekerja secara tidak benar pada perangkat apa pun, meskipun saya berhasil mencapai rendering normal pada semua perangkat yang dapat saya pegang di tangan saya. Bagaimanapun, apa yang dijelaskan di sini adalah peretasan umum.

Jadi, sejauh ini kami telah menggunakan dua dari tiga komponen warna, yaitu. 16 bit dari 24. Nah, mari kita kemas data sehingga setiap koordinat tekstur memiliki ukuran 12 bit, yang akan memungkinkan kita bekerja dengan tekstur setinggi 4096 piksel! Untuk melakukan ini, kami akan mengubah tiga baris dalam program secara harfiah:

Panjang v = Math.round(4095 * theta / Math.PI); ...u = Math.round(4095 * phi / (2 * Math.PI)); ... piksel = (int) ((a<< 24) + (v << 12) + ((u & 15) << 8) + (u >> 4)); ...
dan tulis shader baru yang memperhitungkan skema pengalamatan 12-bit (ini adalah tempat penyaringan bilinear harus dinonaktifkan!):

private final String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "uniform float uOffset;\n" + "vec4 TexCoord0;\n" + "void main() (\n" + " vec4 vTex = texture2D(uTexture0, TexCoord0.xy);\n" + " vec3 vOff = vTex.xyz * 255.0 + vec3(0.5, 0.5, 0.5);\n" + " float hiY = lantai(vOff.y / 16.0);\n" + " float loY = vOff.y - 16.0 * hiY;\n" + " vec2 vCoord = vec2(\n" + " (vOff.x * 16.0 + loY) / 4095.0 + uOffset,\n" + " (vOff.z * 16.0 + hiY) / 4095.0);\n" + " vec3 vCol = texture2D(uTexture1, vCoord).rgb;\n" + " gl_FragColor = vec4(vCol * vTex.w, (vTex.w > 0.0 ? 1.0: 0.0));\n" + ")\n";
Nah, ini masalah yang sama sekali berbeda! Dengan sedikit modifikasi (menambahkan pinch zoom dan rotasi jari), saya menunjukkan program ini kepada teman dan kolega saya, dan pada saat yang sama bertanya berapa banyak segitiga yang mereka pikir ada di adegan ini. Hasilnya bervariasi, dan pertanyaan itu sendiri menimbulkan kecurigaan adanya tangkapan (dalam hal ini, responden bercanda "satu", yang tidak jauh dari kebenaran), tetapi jawaban yang benar secara konsisten mengejutkan. Dan semua orang, sebagai satu, bertanya: mengapa sebuah bola dapat diputar di sekitar satu sumbu, tetapi tidak dimiringkan? .. Hmm.

Lereng

Tetapi kenyataannya kemiringan dalam skema ini jauh lebih sulit untuk diterapkan. Faktanya, tugas itu tidak dapat diselesaikan, dan saya bahkan mengatasinya, tetapi bukan tanpa nuansa.

Intinya, tugasnya adalah mengambil koordinat yang bergeser V, sedangkan koordinat kamu tidak berubah: ini karena kami menambahkan rotasi di sekitar sumbu X. Rencananya adalah sebagai berikut: kami mengubah koordinat tekstur menjadi koordinat layar (dalam kisaran [-1..1]), menerapkan matriks rotasi di sekitar sumbu horizontal ke mereka (untuk melakukan ini, kami menulis dalam konstanta baru terlebih dahulu uTilt sinus dan kosinus sudut kemiringan), dan kemudian kami menggunakan koordinat baru kamu untuk sampel dalam tekstur template kami. Koordinat "Diputar" Z itu juga akan berguna bagi kita, dengan bantuannya kita akan mencerminkan garis bujur untuk sisi belakang bola). Koordinat layar Z Anda harus menghitung secara eksplisit agar tidak membuat dua pilihan tekstur dari satu tekstur, pada saat yang sama ini akan meningkatkan akurasinya.

private final String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "uniform float uOffset;\n" + "uniform vec2 uTilt;\n" + "memvariasikan vec4 TexCoord0;\n" + "void main() (\n" + " float sx = 2.0 * TexCoord0.x - 1.0;\n" + " float sy = 2.0 * TexCoord0.y - 1.0;\n" + " float z2 = 1.0 - sx * sx - sy * sy;\n" + " if (z2 > 0.0) (;\n" + " float sz = sqrt(z2);\n" + " float y = ( sy * uTilt.y - sz * uTilt.x + 1.0) * 0.5;\n" + " float z = (sy * uTilt.x + sz * uTilt.y);\n" + " vec4 vTex = texture2D(uTexture0 , vec2(TexCoord0.x, y));\n" + " vec3 vOff = vTex.xyz * 255.0 + vec3(0.5, 0.5, 0.5);\n" + " float hiY = lantai(vOff.y / 16.0) ;\n" + " float loY = vOff.y - 16.0 * hiY;\n" + " vec2 vCoord = vec2(\n" + " (vOff.x * 16.0 + loY) / 4095.0,\n" + " ( vOff.z * 16.0 + hiY) / 4095.0);\n" + " if (z< 0.0) { vCoord.x = 1.0 - vCoord.x; }\n" + " vCoord.x += uOffset;\n" + " vec3 vCol = texture2D(uTexture1, vCoord).rgb;\n" + " gl_FragColor = vec4(vCol * sz, 1.0);\n" + " } else {\n" + " gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n" + " }\n" + "}\n";
Hore, kemiringannya berhasil! Itu hanya suara aneh di perbatasan belahan otak yang sedikit memalukan. Jelas, masalahnya terletak pada akurasi pengalamatan yang tidak memadai pada titik batas (titik pada lingkaran itu sendiri sesuai dengan rentang koordinat yang terlalu besar, satu texel menyebar pada interval dengan panjang yang agak terlihat). Pada akhirnya, saya berhasil mengalahkan ini dengan menggunakan dua tekstur yang dihasilkan, bukan satu.

Hasilnya, Anda dapat memperbesar dan memutar bola dengan cara yang hampir sama seperti di Google Earth. Dengan selisih yang hanya ada dua segitiga.

Dan terakhir, janji. Kode sumber untuk proyek ini tersedia di