Representasi peta berbentuk bola


19

Game terbaru saya akan berlangsung di planetoid kecil. Saya mencari struktur data yang baik untuk mewakili sel-sel pada permukaan bola. Segitiga, bujur sangkar, segilima, segi enam? Manakah yang meminimalkan bentangan paling banyak dan menciptakan ubin terbaik?

Pemetaan bola adalah yang termudah tetapi peregangan di kutub tidak dapat diterima. Kubemap juga cukup mudah tetapi masih akan ada bentangan besar di dekat sudut kubus. Membagi lagi icosahedron tampaknya yang terbaik dalam hal peregangan tetapi ada masalah pengindeksan banyak array segitiga dan menemukan sel-sel tetangga di perbatasan akan sulit.

Saya kira saya bisa menggunakan array linier tunggal dari poin yang mewakili N-gon, masing-masing dengan array dari indeks tetangga N, tetapi itu tampak seperti pemborosan besar ruang.

Gim ini memiliki elemen RTS jadi saya akan menyimpan hal-hal seperti memengaruhi peta dan melakukan pencarian jalan dan konvolusi A *, sehingga representasi harus efisien.


Seberapa pentingkah topologi peta itu, bukan hanya membiarkan para pelaku pergi ke satu arah dan akhirnya berakhir di tempat mereka mulai? Representasi yang paling sederhana dan paling efisien adalah torus / donat.
congusbongus

1
Ya, saya menyebutkan pemetaan bola dan masalah yang ada pada kutub. Saya ingin menyimpan nilai di sekitar permukaan jadi saya perlu pemetaan dari titik permukaan 3D ke indeks array dengan peregangan sesedikit mungkin.
DaleyPaley

Anda bisa mencoba membagi tetrahedon untuk membuat bola. Ini terdiri dari segitiga yang berukuran sama dan didistribusikan.
thalador

1
@ thalador Terima kasih atas sarannya. Tidak yakin tapi saya pikir icosahedron lebih baik daripada tetrahedron jika saya memilih rute segitiga. Tapi bagaimanapun, tesselation bukanlah masalahnya. Ini pengindeksan array efisien yang mengganggu saya.
DaleyPaley

Jawaban:


12

Oke, bagi siapa pun yang tertarik dengan topik ini sekarang saya akan merinci solusi yang saya pilih. Terima kasih untuk setiap orang yang menjawab dan memberi saya ide.

Pertama, untuk tesselation 'terbaik', saya akan memilih icosahedron yang terpotong sebagai titik awal. Membagi lagi itu mengarah pada sebuah tesselation hexagon yang sangat bagus dengan 12 pentagon menyediakan kelengkungan. Juga, melanjutkan subdivisi pada dual-nya akan memberi saya mesh segitiga yang sangat baik untuk rendering dengan properti bagus. Mengenai 12 sel pentagonal: Saya dapat mengabaikannya, menjadikannya istimewa (seperti satu-satunya tempat basis dapat dibangun), atau saya dapat menyembunyikannya di bawah pemandangan.

Sel-sel heksagonal dan pentagonal akan disimpan dalam struktur data setengah sisi untuk akses mudah ke tetangga dan traversal cepat. Satu-satunya bagian yang sulit adalah menemukan sel mana yang menjadi titik dunia tertentu, tetapi itu dapat dilakukan dengan mulai dari sel acak dan berjalan menuju titik melalui tetangga.

Saya harap seseorang menemukan informasi ini berguna. Saya telah belajar banyak dan berharap untuk mendapatkan beberapa hasil.

Edit:

Berikut adalah gambar yang menunjukkan hasil subdivisi icosahedron saya dan dual mesh switching menggunakan struktur data setengah-tepi.

Saya dapat melakukan beberapa iterasi relaksasi untuk mendapatkan area sel yang lebih seragam.

subdivisi icosahedron


7

Ada cara untuk melakukan ini dengan agak elegan berdasarkan pembagian icosahedron, seperti yang Anda sarankan dalam pertanyaan Anda. Icosahedron terbuat dari 20 segitiga sama sisi, dan segitiga ini dapat dikelompokkan menjadi 5 set, di mana 4 segitiga dalam satu set membentuk bentuk jajaran genjang:

masukkan deskripsi gambar di sini

(Kelompok empat segitiga dengan coretan ditarik melalui mereka adalah jajaran genjang yang saya bicarakan. Panah mengatakan tepi mana yang akan direkatkan untuk melipat ini menjadi icosahedron.)

Jika segitiga ini dibagi lagi menjadi segitiga yang lebih kecil, seluruh jajaran genjang dapat diindeks seperti n oleh array persegi 4n (n = 4 dalam contoh):

masukkan deskripsi gambar di sini

Angka-angka di setiap sel adalah nomor kolom dari array persegi panjang. Aturan untuk menemukan tetangga dalam array cukup sederhana: tetangga horisontal hanya plus atau minus 1 kolom, sedangkan tetangga vertikal adalah minus satu baris dan ditambah satu kolom, atau ditambah satu baris dan minus satu kolom, tergantung pada apakah nomor kolom genap atau ganjil, masing-masing.

Namun, Anda masih harus menulis beberapa kode kasus khusus untuk menemukan tetangga yang melewati batas dari satu jajaran genjang ke berikutnya. Agak sulit karena di beberapa tempat, bagian atas atau bawah satu jajaran genjang akan terhubung ke sisi genjang lainnya, atau bagian atas dan bawah akan dihubungkan dengan offset horizontal di antara mereka, dll. Mungkin struktur setengah sisi atau serupa untuk jajaran genjang akan berguna di sini. Namun, setidaknya hubungan itu simetris di antara semua 5 jajaran genjang: mereka semua mengikuti pola yang sama di mana sisi terhubung ke sisi lain tetangga mereka.


Itu memang representasi yang sangat bagus. Perhatian utama saya dengan metode segitiga adalah dengan mempertahankan array segitiga dan semua jahitan. Masih ada sedikit jahitan di sini, tetapi susunannya persegi panjang. Terima kasih, sangat bagus untuk mengetahui
DaleyPaley

3

Hmmm - komentar tentang stretch menunjukkan Anda bergerak antara pemetaan bola dan planar, itulah yang menyebabkan distorsi di kutub

Jika Anda ingin ubin menjadi rata dan seragam, Anda benar bahwa icosahedron, khususnya icosahedron yang terpotong cukup umum

Anda dapat menemukan semua pemetaan yang berbeda di sini - Polyhedron Bulat di wikipedia

Sejauh mempertahankan hubungan di antara wajah-wajah, itu adalah masalah topologi - Anda mungkin menemukan baik ujung bersayap atau ujung kuadrat membantu (dan Anda mendapatkan kesempatan luar biasa untuk memenuhi bentuk aljabar yang sama sekali baru) Winged Edge


Ah, icosahedron yang terpotong. Ya, itulah yang saya butuhkan. Terima kasih. Juga, sementara saya tidak pernah menggunakan ujung bersayap, saya telah menggunakan banyak sisi untuk manipulasi jala jadi saya cukup berpengalaman dalam bidang itu. Ceria, saya dekat solusi.
DaleyPaley

2

Saya kira saya datang sedikit terlambat ke pesta, tapi di sini ada solusi yang dapat digunakan untuk mempertahankan dunia bola ukuran sewenang-wenang dan penampilan seragam.

Hal utama yang harus dipahami di sini adalah bahwa dunia tidak datar, dan oleh karena itu ubin seragam 100% tidak mungkin (ini mengikuti apa yang disebut Hairor Ball Theorem ). Beberapa penyimpangan harus diizinkan, dan yang terbaik yang bisa kita harapkan adalah menyebarkan penyimpangan itu secara merata di permukaan, membuat masing-masing sekecil mungkin.

Ini sebenarnya cukup mudah dilakukan dengan cara non-deterministik. Pertama, pilih N titik acak secara seragam di sekitar permukaan. Pastikan titik-titik tersebut benar-benar seragam (lihat Pemungutan titik Sphere , rumus 9-11). Pada langkah kedua kita membuat titik-titik itu kurang acak dan lebih seragam: anggap semua titik memiliki muatan listrik negatif sehingga mereka saling tolak. Simulasikan pergerakan titik untuk beberapa langkah, sampai titik-titik tersebut menyatu menjadi keadaan setimbang. Konfigurasi akhir dari titik-titik ini akan memberi Anda jaring yang hampir merata di sekitar permukaan bola.


1
Saya belum pernah mendengar teori bola berbulu, ini cukup menarik. Harus menghentikan diriku dari membuat lelucon masa kecil. Saya telah mendistribusikan titik pada bola sebelumnya seperti itu, tetapi masalahnya adalah bahwa poligonisasi jauh lebih lambat daripada membagi polytope. Juga, bentuk dan valensi sel akan terlalu seragam untuk seleraku. Tapi Terimakasih.
DaleyPaley
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.