Konstruksi segi enam biasa - cara menggambar segi enam. Cara membuat segi enam beraturan Cara menggambar segi enam dengan pensil

Apakah ada pensil di dekatmu? Lihatlah penampangnya - ini adalah segi enam biasa atau, disebut juga, segi enam. Penampang kacang, bidang catur heksagonal, beberapa molekul karbon kompleks (misalnya grafit), kepingan salju, sarang lebah, dan benda lain juga memiliki bentuk ini. Sebuah segi enam raksasa beraturan baru-baru ini ditemukan pada tahun Bukankah aneh jika alam begitu sering menggunakan struktur dengan bentuk khusus ini untuk pembuatannya? Mari kita lihat lebih dekat.

Segi enam beraturan adalah poligon dengan enam sisi yang sama besar dan sudut yang sama besar. Dari pelajaran sekolah kita mengetahui bahwa ia mempunyai sifat-sifat sebagai berikut:

  • Panjang sisi-sisinya sama dengan jari-jari lingkaran yang dibatasi. Dari semuanya, hanya segi enam biasa yang memiliki sifat ini.
  • Sudut-sudutnya sama besar, dan masing-masing besarnya 120°.
  • Keliling segi enam dapat dicari dengan rumus P=6*R jika jari-jari lingkaran yang mengelilinginya diketahui, atau P=4*√(3)*r jika terdapat lingkaran di dalamnya. R dan r adalah jari-jari lingkaran berbatas dan bertulis.
  • Luas yang ditempati segi enam beraturan ditentukan sebagai berikut: S=(3*√(3)*R 2)/2. Jika jari-jarinya tidak diketahui, substitusikan panjang salah satu sisinya - seperti diketahui, panjang tersebut sama dengan panjang jari-jari lingkaran yang dibatasi.

Segi enam biasa memiliki satu fitur menarik, berkat sifatnya yang begitu luas - ia mampu mengisi permukaan bidang apa pun tanpa tumpang tindih atau celah. Bahkan ada yang disebut Pal lemma, yang menurutnya segi enam beraturan, yang sisinya sama dengan 1/√(3), merupakan penutup universal, yaitu dapat menutupi himpunan apa pun dengan diameter satu satuan. .

Sekarang mari kita lihat membuat segi enam beraturan. Ada beberapa cara, yang paling sederhana adalah menggunakan kompas, pensil, dan penggaris. Pertama, kita menggambar lingkaran sembarang dengan kompas, lalu kita membuat titik di sembarang tempat pada lingkaran tersebut. Tanpa mengubah sudut kompas, kita tempatkan ujungnya pada titik ini, tandai takik berikutnya pada lingkaran, dan lanjutkan hingga kita mendapatkan 6 titik. Sekarang yang tersisa hanyalah menghubungkannya dengan segmen lurus, dan Anda akan mendapatkan bentuk yang diinginkan.

Dalam praktiknya, ada kalanya Anda perlu menggambar segi enam besar. Misalnya, pada langit-langit eternit dua tingkat, di sekitar lokasi pemasangan lampu gantung pusat, Anda perlu memasang enam lampu kecil di tingkat bawah. Kompas sebesar ini akan sangat-sangat sulit ditemukan. Apa yang harus dilakukan dalam kasus ini? Bagaimana cara menggambar lingkaran besar? Sangat sederhana. Anda perlu mengambil benang kuat dengan panjang yang dibutuhkan dan mengikat salah satu ujungnya di seberang pensil. Sekarang tinggal mencari asisten yang akan menekan ujung kedua benang ke langit-langit pada titik yang diinginkan. Tentu saja, dalam kasus ini, kesalahan kecil mungkin saja terjadi, tetapi kemungkinan besar kesalahan tersebut tidak akan terlihat oleh orang luar sama sekali.

Isi:

Segi enam beraturan, juga disebut segi enam sempurna, memiliki enam sisi yang sama besar dan enam sudut yang sama besar. Anda dapat menggambar segi enam dengan pita pengukur dan busur derajat, segi enam kasar dengan benda bulat dan penggaris, atau segi enam yang lebih kasar hanya dengan pensil dan sedikit intuisi. Jika Anda ingin mengetahui cara menggambar segi enam dengan berbagai cara, baca terus.

Langkah

1 Gambarlah segi enam sempurna menggunakan kompas

  1. 1 Dengan menggunakan kompas, gambarlah sebuah lingkaran. Masukkan pensil ke dalam kompas. Perluas kompas ke lebar radius lingkaran yang diinginkan. Jari-jarinya bisa dari beberapa hingga sepuluh sentimeter. Selanjutnya, letakkan kompas dan pensil di atas kertas dan gambarlah sebuah lingkaran.
    • Terkadang lebih mudah menggambar setengah lingkaran terlebih dahulu, lalu setengah lingkaran lainnya.
  2. 2 Pindahkan jarum kompas ke tepi lingkaran. Letakkan di atas lingkaran. Jangan mengubah sudut atau posisi kompas.
  3. 3 Buatlah tanda pensil kecil di tepi lingkaran. Buatlah berbeda, tetapi jangan terlalu gelap karena Anda akan menghapusnya nanti. Ingatlah untuk menjaga sudut yang Anda tetapkan untuk kompas.
  4. 4 Pindahkan jarum kompas ke tanda yang baru saja Anda buat. Tempatkan jarum tepat pada sasaran.
  5. 5 Buat tanda pensil lagi di tepi lingkaran. Dengan cara ini Anda akan membuat tanda kedua pada jarak tertentu dari tanda pertama. Terus bergerak ke satu arah.
  6. 6 Gunakan metode yang sama untuk membuat empat tanda lagi. Anda harus kembali ke tanda semula. Jika tidak, kemungkinan besar sudut di mana Anda memegang kompas dan membuat tanda telah berubah. Hal ini mungkin terjadi karena Anda meremasnya terlalu erat atau sebaliknya sedikit mengendurkannya.
  7. 7 Hubungkan tanda-tanda tersebut menggunakan penggaris. Enam titik perpotongan tanda Anda dengan tepi lingkaran adalah enam titik sudut segi enam. Dengan menggunakan penggaris dan pensil, gambarlah garis lurus yang menghubungkan tanda yang berdekatan.
  8. 8 Hapus lingkaran, tanda di tepi lingkaran, dan tanda lain yang Anda buat. Setelah Anda menghapus semua garis konstruksi, segi enam sempurna Anda seharusnya sudah siap.

2 Gambarlah segi enam kasar menggunakan benda bulat dan penggaris

  1. 1 Jiplak pinggiran gelas dengan pensil. Dengan cara ini Anda akan menggambar sebuah lingkaran. Sangat penting untuk menggambar dengan pensil, karena nanti Anda harus menghapus semua garis bantu. Anda juga bisa menjiplak gelas, toples, atau benda apa pun yang terbalik yang alasnya bulat.
  2. 2 Gambarlah garis horizontal melalui pusat lingkaran Anda. Anda bisa menggunakan penggaris, buku - apa saja yang ujungnya lurus. Jika Anda memiliki penggaris, Anda dapat menandai bagian tengahnya dengan menghitung panjang vertikal lingkaran dan membaginya menjadi dua.
  3. 3 Gambarlah tanda "X" pada setengah lingkaran, lalu bagilah menjadi enam bagian yang sama besar. Karena Anda sudah menggambar garis di tengah lingkaran, tanda X harus lebih lebar daripada tingginya agar bagian-bagiannya sama. Bayangkan membagi pizza menjadi enam bagian.
  4. 4 Buatlah segitiga dari setiap bagian. Caranya, gunakan penggaris untuk menggambar garis lurus di bawah bagian lengkung setiap bagian, menghubungkannya dengan dua garis lainnya hingga membentuk segitiga. Lakukan ini dengan lima bagian sisanya. Anggap saja seperti membuat kerak di sekitar irisan pizza Anda.
  5. 5 Hapus semua garis bantu. Garis panduannya mencakup lingkaran Anda, tiga garis yang membagi lingkaran Anda menjadi beberapa bagian, dan tanda lain yang Anda buat di sepanjang jalan.

3 Gambarlah segi enam kasar menggunakan satu pensil

  1. 1 Gambarlah garis horizontal. Untuk menggambar garis lurus tanpa penggaris, cukup gambar titik awal dan akhir garis horizontal Anda. Kemudian letakkan pensil di titik awal dan tarik garis sampai akhir. Panjang garis ini mungkin hanya beberapa sentimeter.
  2. 2 Gambarlah dua garis diagonal dari ujung garis horizontal. Garis diagonal di sisi kiri harus mengarah ke luar seperti garis diagonal di sebelah kanan. Bisa dibayangkan garis-garis tersebut membentuk sudut 120 derajat terhadap garis horizontal.
  3. 3 Gambarlah dua garis horizontal lagi yang berasal dari garis horizontal pertama yang ditarik ke dalam. Ini akan membuat bayangan cermin dari dua garis diagonal pertama. Garis kiri bawah harus mencerminkan garis kiri atas, dan garis kanan bawah harus mencerminkan garis kanan atas. Meskipun garis horizontal atas harus menghadap ke luar, garis horizontal bawah harus menghadap ke dalam hingga ke alasnya.
  4. 4 Gambarlah garis horizontal lain yang menghubungkan dua garis diagonal terbawah. Dengan cara ini Anda akan menggambar dasar segi enam Anda. Idealnya, garis ini harus sejajar dengan garis horizontal atas. Sekarang Anda telah menyelesaikan segi enam Anda.
  • Pensil dan kompas harus tajam untuk meminimalkan kesalahan akibat tanda yang terlalu lebar.
  • Saat menggunakan metode kompas, jika Anda menghubungkan setiap tanda, bukan keenamnya, Anda akan mendapatkan segitiga sama sisi.

Peringatan

  • Kompas adalah benda yang agak tajam, berhati-hatilah saat menggunakannya.

Prinsip operasi

  • Setiap metode akan membantu Anda menggambar segi enam yang dibentuk oleh enam segitiga sama sisi dengan jari-jari sama dengan panjang semua sisinya. Keenam jari-jari yang digambar mempunyai panjang yang sama dan semua garis yang membuat segi enam juga mempunyai panjang yang sama, karena lebar kompas tidak berubah. Karena keenam segitiga tersebut sama sisi, maka sudut antara titik sudutnya adalah 60 derajat.

Apa yang Anda perlukan

  • Kertas
  • Pensil
  • Penggaris
  • Sepasang kompas
  • Sesuatu yang bisa diletakkan di bawah kertas untuk mencegah jarum kompas tergelincir.
  • Penghapus

Segitiga berbatas beraturan dibuat sebagai berikut(Gambar 38). Dari pusat lingkaran berjari-jari tertentu R 1 menggambar sebuah lingkaran dengan jari-jari R2 = 2R1 dan membaginya menjadi tiga bagian sama besar. Poin pembagian A, B, C adalah titik sudut segitiga beraturan yang dibatasi pada lingkaran berjari-jari R 1 .

Gambar 38

Segi empat berbatas beraturan (persegi) dapat dibuat dengan menggunakan kompas dan penggaris (Gambar 39). Pada suatu lingkaran terdapat dua diameter yang saling tegak lurus. Mengambil titik potong diameter dengan lingkaran sebagai pusat, maka jari-jari lingkaran R jelaskan busur sampai mereka berpotongan satu sama lain di titik-titik A, B, C, D . Poin A , B , C , D dan merupakan titik sudut suatu persegi yang dibatasi pada lingkaran tertentu.

Gambar 39

Untuk membuat segi enam berbatas beraturan pertama-tama perlu untuk membuat simpul dari persegi yang dijelaskan dengan cara yang ditunjukkan di atas (Gambar 40, a). Bersamaan dengan menentukan titik sudut suatu persegi, diberikan radius lingkaran R dibagi menjadi enam bagian yang sama pada titik-titiknya 1, 2, 3, 4, 5, 6 dan gambarlah sisi vertikal persegi tersebut. Menggambar lingkaran melalui titik-titik pemisah 2–5 Dan 3–6 garis lurus sampai berpotongan dengan sisi vertikal persegi (Gambar 40, b), kita mendapatkan simpulnya A, B, D, E dijelaskan segi enam beraturan.

Gambar 40

Puncak lainnya C Dan F ditentukan dengan menggunakan busur jari-jari lingkaran O.A., yang dilakukan sampai berpotongan dengan kelanjutan diameter vertikal suatu lingkaran tertentu.
3 PASANGAN

Mari belajar cara menggambar prisma heksagonal di berbagai posisi.

Pelajari berbagai cara membuat segi enam beraturan, buat gambar segi enam, periksa kebenaran konstruksinya. Buatlah prisma heksagonal berdasarkan segi enam.

Perhatikan prisma heksagonal pada Gambar. 3.52 dan proyeksi ortogonalnya pada Gambar. 3.53. Pada alas prisma heksagonal (segi enam) terdapat segi enam beraturan, sisi-sisinya berbentuk persegi panjang yang identik. Untuk menggambarkan segi enam dengan benar dalam perspektif, Anda harus terlebih dahulu mempelajari cara menggambarkan alasnya dalam perspektif dengan benar (Gbr. 3.54). Dalam segi enam pada Gambar. 3,55 simpul ditandai dengan angka dari satu sampai enam. Jika Anda menghubungkan titik 1 dan 3, 4 dan 6 dengan garis lurus vertikal, Anda akan melihat bahwa garis lurus tersebut, bersama dengan titik pusat lingkaran, membagi diameter 5 - 2 menjadi empat segmen yang sama besar (segmen ini ditandai dengan busur ). Sisi-sisi yang berhadapan pada segi enam sejajar satu sama lain dan terhadap garis yang melalui pusatnya dan menghubungkan dua titik sudut (misalnya, sisi 6 - 1 dan 4 - 3 sejajar dengan garis 5 - 2). Pengamatan ini akan membantu Anda membuat segi enam dalam perspektif, serta memeriksa kebenaran konstruksi ini. Ada dua cara untuk membuat segi enam beraturan dari representasi: berdasarkan lingkaran dan berdasarkan persegi.

Berdasarkan lingkaran yang dibatasi. Lihatlah Gambar. 3.56. Semua titik sudut segi enam beraturan termasuk dalam lingkaran luar yang jari-jarinya sama dengan sisi segi enam.


segi enam horisontal. Gambarlah elips horizontal dengan bukaan sembarang, yaitu lingkaran terbatas dalam perspektif. Sekarang Anda perlu menemukan enam titik di atasnya, yang merupakan simpul segi enam. Gambarkan diameter berapa pun dari lingkaran tertentu melalui pusatnya (Gbr. 3.57). Titik ekstrim diameter - 5 dan 2, terletak pada elips, adalah simpul segi enam. Untuk mencari simpul yang tersisa, diameter ini perlu dibagi menjadi empat segmen yang sama besar. Diameternya sudah dibagi titik pusat lingkaran menjadi dua jari-jari, yang tersisa hanyalah membagi setiap jari-jari menjadi dua. Dalam gambar perspektif, keempat segmen berkontraksi secara merata saat menjauh dari pengamat (Gbr. 3.58). Sekarang gambarlah titik tengah jari-jari - titik A dan B - garis lurus yang tegak lurus garis lurus 5 - 2. Anda dapat mencari arahnya menggunakan garis singgung elips di titik 5 dan 2 (Gbr. 3.59). Garis singgung tersebut akan tegak lurus terhadap diameter 5 - 2, dan garis yang melalui titik A dan B yang sejajar dengan garis singgung tersebut juga akan tegak lurus terhadap garis 5 - 2. Tentukan titik-titik yang diperoleh pada perpotongan garis-garis tersebut dengan elips sebagai 1, 3, 4, 6 ( Gambar 3.60). Hubungkan keenam simpul dengan garis lurus (Gbr. 3.61).

Periksa kebenaran konstruksi Anda dengan berbagai cara. Jika konstruksinya benar, maka garis-garis yang menghubungkan titik-titik sudut yang berhadapan pada segi enam berpotongan di tengah lingkaran (Gbr. 3.62), dan sisi-sisi yang berhadapan pada segi enam sejajar dengan diameter yang bersesuaian (Gbr. 3.63). Metode pemeriksaan lain ditunjukkan pada Gambar. 3.64.

segi enam vertikal. Pada segi enam seperti itu, garis lurus yang menghubungkan titik 7 dan 3, b dan 4, serta garis singgung lingkaran yang dibatasi di titik 5 dan 2, mempunyai arah vertikal dan mempertahankannya dalam gambar perspektif. Jadi, dengan menggambar dua garis singgung vertikal elips, kita menemukan titik 5 dan 2 (titik singgung). Hubungkan dengan garis lurus, lalu bagi diameter yang dihasilkan 5 - 2 menjadi 4 segmen yang sama, dengan mempertimbangkan pengurangan perspektifnya (Gbr. 3.65). Gambarlah garis vertikal melalui titik A dan B, dan pada perpotongannya dengan elips, carilah titik 1,3,6l4. Kemudian hubungkan titik 1 – 6 secara berurutan dengan garis lurus (Gbr. 3.66). Periksa kebenaran konstruksi segi enam dengan cara yang sama seperti contoh sebelumnya.

Metode pembuatan segi enam yang dijelaskan memungkinkan kita memperoleh gambar ini berdasarkan lingkaran, yang lebih mudah untuk digambarkan dalam perspektif daripada persegi dengan proporsi tertentu. Oleh karena itu, metode pembuatan segi enam ini tampaknya yang paling akurat dan universal. Metode konstruksi berbasis persegi memudahkan penggambaran segi enam jika sudah ada kubus pada gambar, dengan kata lain, ketika proporsi persegi dan arah sisi-sisinya ditentukan.

Berdasarkan persegi. Lihatlah Gambar. 3.67. Segi enam yang terdapat pada suatu persegi sama dengan sisi persegi pada arah horizontal 5 - 2, dan kurang dari panjangnya pada arah vertikal.

segi enam vertikal. Gambarlah persegi vertikal dalam perspektif. Tariklah garis lurus melalui perpotongan diagonal-diagonalnya yang sejajar dengan sisi-sisi mendatarnya. Bagilah segmen yang dihasilkan 5 - 2 menjadi empat bagian yang sama dan tarik garis vertikal melalui titik A dan B (Gbr. 3.68). Garis pembatas segi enam di bagian atas dan bawah tidak berhimpitan dengan sisi-sisi persegi. Gambarlah pada jarak tertentu (1114 a) dari sisi horizontal persegi dan sejajar dengannya. Dengan menghubungkan titik 1 dan 3 yang ditemukan dengan cara ini dengan titik 2, dan titik 6 dan 4 dengan titik 5, kita memperoleh segi enam (Gbr. 3.69).

Segi enam horizontal dibuat dalam urutan yang sama (Gbr. 3.70 dan 3.71).

Metode konstruksi ini hanya cocok untuk segi enam dengan bukaan yang cukup. Jika bukaan segi enam tidak signifikan, lebih baik menggunakan metode berdasarkan lingkaran yang dibatasi. Untuk memeriksa segi enam yang dibangun melalui persegi, Anda dapat menggunakan metode yang sudah Anda ketahui.

Selain itu, ada cara lain - untuk menggambarkan lingkaran di sekitar segi enam yang dihasilkan (dalam gambar Anda - elips). Semua simpul segi enam harus termasuk dalam elips ini.

Setelah Anda menguasai keterampilan menggambar segi enam, Anda bebas melanjutkan menggambar prisma heksagonal. Perhatikan baik-baik diagram pada Gambar. 3.72, serta diagram pembuatan prisma heksagonal berdasarkan lingkaran berbatas (Gbr. 3.73; 3.74 dan 3.75) dan berdasarkan persegi (Gbr. 3.76; 3.77 dan 3.78). Gambarlah segi enam vertikal dan horizontal dengan berbagai cara. Pada gambar segi enam vertikal, sisi panjang sisi-sisinya akan berupa garis lurus vertikal yang sejajar satu sama lain, dan segi enam alasnya akan semakin terbuka jika semakin jauh dari garis horizon. Dalam gambar segi enam horizontal, sisi-sisi panjang sisi-sisinya akan menyatu pada titik hilang di cakrawala, dan bukaan segi enam dasar akan semakin besar jika semakin jauh jaraknya dari pengamat. Saat menggambarkan segi enam, pastikan juga bahwa tepi sejajar kedua alasnya bertemu dalam perspektif (Gbr. 3.79; 3.80).

Kisi-kisi segi enam (kisi-kisi heksagonal) digunakan dalam beberapa permainan, tetapi tidak sesederhana atau umum seperti kisi-kisi persegi panjang. Saya telah mengumpulkan sumber daya tentang hex mesh selama hampir 20 tahun, dan saya menulis panduan tentang pendekatan paling elegan ini, yang diterapkan dalam kode paling sederhana. Artikel ini banyak menggunakan panduan Charles Fu dan Clark Verbrugge. Saya akan menjelaskan berbagai cara untuk membuat jerat segi enam, hubungannya, dan algoritma yang paling umum. Banyak bagian artikel ini bersifat interaktif: memilih jenis kisi akan mengubah diagram, kode, dan teks yang sesuai. (Catatan per.: ini hanya berlaku untuk aslinya, saya menyarankan Anda untuk mempelajarinya. Dalam terjemahan, semua informasi dari aslinya dipertahankan, tetapi tanpa interaktivitas.).

Contoh kode dalam artikel ditulis dalam pseudocode, sehingga lebih mudah dibaca dan dipahami untuk menulis implementasi Anda sendiri.

Geometri

Segi enam adalah poligon bersisi enam. Segi enam beraturan memiliki semua sisi (tepinya) dengan panjang yang sama. Kami hanya akan bekerja dengan segi enam biasa. Biasanya, jerat segi enam menggunakan orientasi horizontal (atas runcing) dan vertikal (atas datar).


Segi enam dengan puncak datar (kiri) dan lancip (kanan).

Segi enam memiliki 6 sisi. Setiap muka sama dengan dua segi enam. Segi enam mempunyai 6 titik sudut. Setiap titik sudut sama dengan tiga segi enam. Anda dapat membaca lebih lanjut tentang pusat, tepi, dan titik sudut di artikel saya tentang bagian jaring (persegi, segi enam, dan segitiga).

Sudut

Pada segi enam beraturan, sudut dalamnya adalah 120°. Ada enam "irisan", yang masing-masing berbentuk segitiga sama sisi dengan sudut dalam 60°. Titik sudut Saya terletak pada jarak (60° * i) + 30°, satuan ukuran dari pusat pusat. Dalam kode:

Fungsi hex_corner(pusat, ukuran, i): var angle_deg = 60 * i + 30 var angle_rad = PI / 180 * angle_deg return Point(center.x + ukuran * cos(angle_rad), center.y + ukuran * sin(angle_rad) )
Untuk mengisi segi enam, Anda perlu mendapatkan simpul poligon dari hex_corner(…, 0) hingga hex_corner(…, 5) . Untuk menggambar garis segi enam, Anda perlu menggunakan simpul ini dan kemudian menggambar garis lagi di hex_corner(..., 0) .

Perbedaan antara kedua orientasi tersebut adalah x dan y ditukar, sehingga menghasilkan perubahan sudut: segi enam dengan puncak datar memiliki sudut 0°, 60°, 120°, 180°, 240°, 300°, dan puncak runcing segi enam mempunyai sudut 30°, 90°, 150°, 210°, 270°, 330°.


Sudut segi enam dengan bagian atas rata dan lancip

Ukuran dan lokasi

Sekarang kita ingin menempatkan beberapa segi enam secara bersamaan. Dalam orientasi horizontal, tinggi segi enam adalah height = size * 2 . Jarak vertikal antara segi enam yang berdekatan adalah titik sudut = tinggi * 3/4 ​​​​.

Lebar segi enam lebar = persegi(3)/2 * tinggi . Jarak mendatar antara segi enam yang berdekatan adalah horizontal = lebar.

Beberapa game menggunakan seni piksel untuk segi enam, yang tidak sama persis dengan segi enam biasa. Rumus sudut dan penempatan yang dijelaskan di bagian ini tidak akan cocok dengan dimensi segi enam tersebut. Artikel selanjutnya yang menjelaskan algoritme hex mesh berlaku meskipun segi enam sedikit meregang atau tergencet.



Sistem koordinat

Mari kita mulai merakit segi enam menjadi sebuah kotak. Dalam kasus kisi-kisi kotak, hanya ada satu cara yang jelas untuk merakitnya. Untuk segi enam, ada banyak pendekatan. Saya sarankan menggunakan koordinat kubik sebagai representasi utama Anda. Koordinat aksial atau koordinat offset harus digunakan untuk menyimpan peta dan menampilkan koordinat kepada pengguna.

Koordinat offset

Pendekatan yang paling umum adalah dengan mengimbangi setiap kolom atau baris berikutnya. Kolom ditunjuk col atau q. Baris dilambangkan dengan baris atau r . Anda dapat mengimbangi kolom/baris ganjil atau genap, sehingga segi enam horizontal dan vertikal masing-masing memiliki dua opsi.


Susunan horizontal "ganjil-r"


Susunan horizontal “genap-r”


Susunan "ganjil-q" vertikal


Susunan vertikal “genap-q”

Koordinat kubik

Cara lain untuk melihat kisi-kisi segi enam adalah dengan melihatnya sebagai tiga sumbu utama, tidak dua, seperti pada kisi-kisi kotak. Mereka menampilkan simetri yang elegan.

Mari kita ambil kotak kubus dan mari kita hentikan bidang diagonal di x + y + z = 0. Ini adalah ide yang aneh, tetapi ini akan membantu kita menyederhanakan algoritma mesh segi enam. Secara khusus, kita dapat menggunakan operasi standar dari koordinat Kartesius: menjumlahkan dan mengurangi koordinat, mengalikan dan membagi dengan besaran skalar, serta jarak.

Perhatikan tiga sumbu utama pada kisi-kisi kubus dan hubungannya dengan keenam sumbu tersebut diagonal arah grid segi enam. Sumbu diagonal grid sesuai dengan arah utama grid segi enam.


segi enam


kotak

Karena kita telah memiliki algoritma untuk mesh persegi dan kubus, penggunaan koordinat kubik memungkinkan kita untuk mengadaptasi algoritma ini ke mesh segi enam. Saya akan menggunakan sistem ini untuk sebagian besar algoritma artikel. Untuk menggunakan algoritme dengan sistem koordinat berbeda, saya mengonversi koordinat kubik, menjalankan algoritme, lalu mengonversinya kembali.

Pelajari cara kerja koordinat kubik untuk jaring segi enam. Saat Anda memilih segi enam, koordinat kubik yang sesuai dengan tiga sumbu akan disorot.

  1. Setiap arah kotak kubus bersesuaian garis pada kotak segi enam. Coba pilih segi enam dengan z sama dengan 0, 1, 2, 3 untuk melihat hubungannya. Garis tersebut ditandai dengan warna biru. Coba hal yang sama untuk x (hijau) dan y (ungu).
  2. Tiap arah kisi segi enam merupakan kombinasi dua arah kisi kubus. Misalnya, bagian "utara" dari kisi segi enam terletak di antara +y dan -z , sehingga setiap langkah di "utara" menambah y sebanyak 1 dan mengurangi z sebanyak 1.
Koordinat kubik adalah pilihan yang masuk akal untuk sistem koordinat grid segi enam. Syaratnya adalah x + y + z = 0, sehingga harus dipertahankan dalam algoritma. Kondisi tersebut juga memastikan bahwa akan selalu ada koordinat kanonik untuk setiap segi enam.

Ada banyak sistem koordinat yang berbeda untuk kubus dan segi enam. Pada beberapa diantaranya kondisinya berbeda dengan x + y + z = 0. Saya hanya menunjukkan satu dari banyak sistem. Anda juga dapat membuat koordinat kubik dengan x-y , y-z , z-x , yang memiliki serangkaian properti menariknya sendiri, namun saya tidak akan membahasnya di sini.

Namun Anda dapat berargumen bahwa Anda tidak ingin menyimpan 3 angka untuk koordinat tersebut karena Anda tidak tahu cara menyimpan peta seperti itu.

Koordinat aksial

Sistem koordinat aksial, kadang-kadang disebut sistem koordinat "trapesium", dibangun dari dua atau tiga koordinat dari sistem koordinat kubik. Karena kita mempunyai kondisi x + y + z = 0, koordinat ketiga tidak diperlukan. Koordinat aksial berguna untuk menyimpan peta dan menampilkan koordinat kepada pengguna. Seperti halnya koordinat kubik, Anda dapat menggunakan operasi standar penjumlahan, pengurangan, perkalian, dan pembagian koordinat kartesius.

Ada banyak sistem koordinat kubik dan banyak sistem aksial. Saya tidak akan membahas setiap kombinasi dalam panduan ini. Saya akan memilih dua variabel, q (kolom) dan r (baris). Dalam diagram di artikel ini, q berkorespondensi dengan x dan r berkorespondensi dengan z, tetapi korespondensi ini bersifat arbitrer karena Anda dapat memutar dan memutar diagram untuk mendapatkan korespondensi yang berbeda.

Keuntungan sistem ini dibandingkan grid perpindahan adalah algoritmanya lebih mudah dipahami. Kelemahan dari sistem ini adalah menyimpan kartu persegi panjang agak aneh; lihat bagian tentang menyimpan peta. Beberapa algoritma bahkan lebih jelas dalam koordinat kubik, tapi karena kita mempunyai kondisi x + y + z = 0, kita dapat menghitung koordinat tersirat ketiga dan menggunakannya dalam algoritma ini. Dalam proyek saya, saya memanggil sumbu q, r, s, sehingga kondisinya terlihat seperti q + r + s = 0, dan saya dapat menghitung s = -q - r bila diperlukan.

as

Koordinat offset adalah hal pertama yang dipikirkan kebanyakan orang karena sama dengan koordinat Cartesian standar yang digunakan untuk kisi-kisi persegi. Sayangnya, salah satu dari dua sumbu tersebut harus melawan arus, dan ini akhirnya memperumit masalah. Sistem kubus dan sumbu memiliki algoritma yang lebih sederhana, namun penyimpanan kartu sedikit lebih rumit. Ada sistem lain yang disebut “bergantian” atau “ganda”, tetapi kami tidak akan membahasnya di sini; beberapa merasa lebih mudah untuk dikerjakan daripada kubik atau aksial.


Koordinat offset, kubik dan aksial

Sumbu adalah arah kenaikan koordinat yang bersesuaian. Tegak lurus terhadap suatu sumbu adalah garis yang koordinatnya tetap. Diagram grid di atas menunjukkan garis tegak lurus.

Transformasi koordinat

Kemungkinan besar Anda akan menggunakan koordinat aksial atau offset dalam desain Anda, namun banyak algoritma yang lebih mudah dinyatakan dalam koordinat kubik. Oleh karena itu, kita harus mampu mengubah koordinat antar sistem.

Koordinat aksial berkaitan erat dengan koordinat kubik, sehingga konversinya sederhana:

# ubah koordinat kubik ke aksial q = x r = z # ubah koordinat aksial ke kubik x = q z = r y = -x-z
Secara kode, kedua fungsi ini dapat ditulis sebagai berikut:

Fungsi cube_to_hex(h): # aksial var q = h.x var r = h.z return Hex(q, r) fungsi hex_to_cube(h): # kubik var x = h.q var z = h.r var y = -x-z return Cube(x, y , z)
Koordinat offset sedikit lebih rumit:

segi enam yang berdekatan

Diberikan satu segi enam, manakah enam segi enam berikutnya? Seperti yang Anda duga, jawabannya paling mudah dalam koordinat kubik, cukup mudah dalam koordinat aksial, dan sedikit lebih sulit dalam koordinat perpindahan. Anda mungkin juga perlu menghitung enam segi enam "diagonal".

Koordinat kubik

Memindahkan satu ruang dalam koordinat hex menyebabkan salah satu dari tiga koordinat kubik berubah menjadi +1 dan yang lainnya menjadi -1 (jumlahnya harus tetap 0). Pada +1, tiga kemungkinan koordinat dapat berubah, dan pada -1, dua koordinat sisanya. Ini memberi kita enam kemungkinan perubahan. Masing-masing sesuai dengan salah satu arah segi enam. Cara termudah dan tercepat adalah menghitung perubahan terlebih dahulu dan memasukkannya ke dalam tabel koordinat kubik Kubus(dx, dy, dz) pada waktu kompilasi:

Arah Var = [ Kubus(+1, -1, 0), Kubus(+1, 0, -1), Kubus(0, +1, -1), Kubus(-1, +1, 0), Kubus( -1, 0, +1), Kubus(0, -1, +1) ] fungsi cube_direction(arah): mengembalikan arah fungsi cube_neighbor(hex, arah): return cube_add(hex, cube_direction(arah))

Koordinat aksial

Seperti sebelumnya, kami menggunakan sistem kubik untuk memulai. Mari kita ambil tabel Cube(dx, dy, dz) dan mengubahnya menjadi tabel Hex(dq, dr):

Arah Var = [ Hex(+1, 0), Hex(+1, -1), Hex(0, -1), Hex(-1, 0), Hex(-1, +1), Hex(0, +1) ] fungsi hex_direction(arah): mengembalikan arah fungsi hex_neighbor(hex, arah): var dir = hex_direction(direction) return Hex(hex.q + dir.q, hex.r + dir.r)

Koordinat offset

Dalam koordinat aksial, kita membuat perubahan tergantung di mana kita berada di grid. Jika kita berada pada kolom/baris yang diimbangi, maka aturannya berbeda dengan kasus kolom/baris yang tidak diimbangi.

Seperti sebelumnya, kita membuat tabel angka yang perlu ditambahkan ke col dan row . Namun, kali ini kita akan memiliki dua array, satu untuk kolom/baris ganjil dan satu lagi untuk kolom/baris genap. Lihatlah (1,1) pada gambar peta grid di atas dan perhatikan bagaimana warna dan baris berubah saat Anda bergerak di masing-masing dari enam arah. Sekarang mari ulangi proses untuk (2,2) . Tabel dan kode akan berbeda untuk masing-masing dari empat jenis grid perpindahan; berikut adalah kode yang sesuai untuk setiap jenis grid.

Aneh-r
arah var = [ [ Hex(+1, 0), Hex(0, -1), Hex(-1, -1), Hex(-1, 0), Hex(-1, +1), Hex(0 , +1) ], [ Hex(+1, 0), Hex(+1, -1), Hex(0, -1), Hex(-1, 0), Hex(0, +1), Hex( +1, +1) ] ] fungsi offset_neighbor(hex, arah): var parity = hex.row & 1 var dir = arah kembali Hex(hex.col + dir.col, hex.row + dir.row)


Bahkan-r
arah var = [ [ Hex(+1, 0), Hex(+1, -1), Hex(0, -1), Hex(-1, 0), Hex(0, +1), Hex(+1 , +1) ], [ Hex(+1, 0), Hex(0, -1), Hex(-1, -1), Hex(-1, 0), Hex(-1, +1), Hex (0, +1) ] ] fungsi offset_neighbor(hex, arah): var parity = hex.row & 1 var dir = arah kembali Hex(hex.col + dir.col, hex.row + dir.row)


Grid untuk baris genap (GENAP) dan ganjil (GANJIL).

Ganjil-q
arah var = [ [ Hex(+1, 0), Hex(+1, -1), Hex(0, -1), Hex(-1, -1), Hex(-1, 0), Hex(0 , +1) ], [ Hex(+1, +1), Hex(+1, 0), Hex(0, -1), Hex(-1, 0), Hex(-1, +1), Hex (0, +1) ] ] fungsi offset_neighbor(hex, arah): var parity = hex.col & 1 var dir = arah kembali Hex(hex.col + dir.col, hex.row + dir.row)


Genap-q
arah var = [ [ Hex(+1, +1), Hex(+1, 0), Hex(0, -1), Hex(-1, 0), Hex(-1, +1), Hex(0 , +1) ], [ Hex(+1, 0), Hex(+1, -1), Hex(0, -1), Hex(-1, -1), Hex(-1, 0), Hex (0, +1) ] ] fungsi offset_neighbor(hex, arah): var parity = hex.col & 1 var dir = arah kembali Hex(hex.col + dir.col, hex.row + dir.row)


Grid untuk kolom genap (GENAP) dan ganjil (GANJIL).

Diagonal

Bergerak dalam ruang "diagonal" dalam koordinat hex mengubah salah satu dari tiga koordinat kubik sebesar ±2 dan dua lainnya sebesar ∓1 (jumlahnya harus tetap 0).

Diagonal Var = [ Kubus(+2, -1, -1), Kubus(+1, +1, -2), Kubus(-1, +2, -1), Kubus(-2, +1, +1 ), Kubus(-1, -1, +2), Kubus(+1, -2, +1) ] fungsi cube_diagonal_neighbor(hex, arah): return cube_add(hex, diagonal)
Seperti sebelumnya, kita dapat mengubah koordinat tersebut menjadi koordinat aksial dengan menghilangkan salah satu dari ketiga koordinat tersebut, atau mengubahnya menjadi koordinat offset dengan terlebih dahulu menghitung hasilnya.


Jarak

Koordinat kubik

Dalam sistem koordinat kubik, setiap segi enam adalah kubus dalam ruang tiga dimensi. Segi enam yang berdekatan diberi jarak 1 pada kisi segi enam, tetapi diberi jarak 2 pada kisi kubus. Hal ini membuat penghitungan jarak menjadi sederhana. Dalam kotak persegi, jarak Manhattan adalah abs(dx) + abs(dy) . Dalam kotak kubus, jarak Manhattan adalah abs(dx) + abs(dy) + abs(dz) . Jarak dalam kotak segi enam sama dengan setengahnya:

Fungsi cube_distance(a, b): return (abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z)) / 2
Persamaan dari notasi ini adalah dengan mengatakan bahwa salah satu dari tiga koordinat harus merupakan jumlah dari dua koordinat lainnya, dan kemudian menganggapnya sebagai jarak. Anda dapat memilih bentuk separuh atau bentuk nilai maksimum di bawah ini, namun hasilnya sama:

Fungsi cube_distance(a, b): return max(abs(a.x - b.x), abs(a.y - b.y), abs(a.z - b.z))
Pada gambar, nilai maksimum disorot dengan warna. Perhatikan juga bahwa setiap warna mewakili salah satu dari enam arah "diagonal".

GIF


Koordinat aksial

Dalam sistem aksial, koordinat ketiga dinyatakan secara implisit. Mari kita konversi dari aksial ke kubik untuk menghitung jarak:

Fungsi hex_distance(a, b): var ac = hex_to_cube(a) var bc = hex_to_cube(b) mengembalikan cube_distance(ac, bc)
Jika kompiler inline (inline) hex_to_cube dan cube_distance dalam kasus Anda, maka akan menghasilkan kode seperti ini:

Fungsi hex_distance(a, b): return (abs(a.q - b.q) + abs(a.q + a.r - b.q - b.r) + abs(a.r - b.r)) / 2
Ada banyak cara berbeda untuk menulis jarak antar segi enam dalam koordinat aksial, apa pun metode penulisannya jarak antara segi enam dalam sistem aksial diekstraksi dari jarak Manhattan dalam sistem kubik. Misalnya, penjelasan "selisih perbedaan" diperoleh dengan menulis a.q + a.r - b.q - b.r sebagai a.q - b.q + a.r - b.r dan menggunakan bentuk nilai maksimum alih-alih bentuk bagi dua cube_distance . Semuanya serupa jika Anda melihat hubungannya dengan koordinat kubik.

Koordinat offset

Seperti halnya koordinat aksial, kita mengubah koordinat offset menjadi koordinat kubik dan kemudian menggunakan jarak kubik.

Fungsi offset_distance(a, b): var ac = offset_to_cube(a) var bc = offset_to_cube(b) mengembalikan cube_distance(ac, bc)
Kita akan menggunakan pola yang sama untuk banyak algoritme: mengonversi dari segi enam menjadi kubus, menjalankan algoritme versi kubik, dan mengonversi hasil kubik menjadi koordinat segi enam (koordinat aksial atau offset).

Menggambar garis

Bagaimana cara menggambar garis dari satu segi enam ke segi enam lainnya? Saya menggunakan interpolasi linier untuk menggambar garis. Garis tersebut diambil sampelnya secara seragam pada titik N+1 dan dihitung di segi enam mana sampel tersebut berada.

GIF


  1. Pertama kita hitung N, yang merupakan jarak dalam segi enam antara titik-titik akhir.
  2. Kami kemudian secara merata mengambil sampel N+1 titik antara titik A dan B. Dengan menggunakan interpolasi linier, kami menentukan bahwa untuk nilai i dari 0 hingga N termasuk nilai tersebut, setiap titik akan menjadi A + (B - A) * 1,0/N * Saya . Pada gambar, titik kontrol ini ditunjukkan dengan warna biru. Hasilnya adalah koordinat floating point.
  3. Mari kita ubah setiap titik kontrol (float) kembali menjadi segi enam (int). Algoritma ini disebut cube_round (lihat di bawah).
Gabungkan semuanya untuk menarik garis dari A ke B:

Fungsi lerp(a, b, t): // untuk float mengembalikan a + (b - a) * t fungsi cube_lerp(a, b, t): // untuk segi enam mengembalikan Cube(lerp(a.x, b.x, t), lerp(a.y, b.y, t), lerp(a.z, b.z, t)) fungsi cube_linedraw(a, b): var N = cube_distance(a, b) var results = untuk setiap 0 ≤ i ≤ N: results.append( cube_round(cube_lerp(a, b, 1.0/N * i))) mengembalikan hasil
Catatan:

  • Ada kasus di mana cube_lerp mengembalikan titik yang tepat berada di tepi antara dua segi enam. Kemudian cube_round memindahkannya ke satu arah atau lainnya. Garis terlihat lebih baik jika digerakkan ke satu arah. Hal ini dapat dilakukan dengan menambahkan Kubus heksagonal "epsilon" (1e-6, 1e-6, -2e-6) ke salah satu atau kedua titik akhir sebelum memulai perulangan. Ini akan "mendorong" garis ke satu arah sehingga tidak mengenai tepinya.
  • Algoritme garis DDA dalam kotak persegi menyamakan N dengan jarak maksimum sepanjang masing-masing sumbu. Kita melakukan hal yang sama pada ruang kubik, yang mirip dengan jarak pada kotak segi enam.
  • Fungsi cube_lerp harus mengembalikan kubus dengan koordinat float. Jika Anda memprogram dalam bahasa yang diketik secara statis, Anda tidak akan bisa menggunakan tipe Cube. Anda dapat mendefinisikan tipe FloatCube sebagai gantinya, atau memasukkan fungsi ke dalam kode gambar garis jika Anda tidak ingin mendefinisikan tipe lainnya.
  • Anda dapat mengoptimalkan kode dengan memasukkan cube_lerp dan kemudian menghitung B.x-A.x , B.x-A.y dan 1.0/N di luar loop. Perkalian dapat diubah menjadi penjumlahan berulang. Hasilnya akan menjadi seperti algoritma garis DDA.
  • Saya menggunakan koordinat aksial atau kubik untuk menggambar garis, tetapi jika Anda ingin bekerja dengan koordinat offset, lihat .
  • Ada banyak pilihan untuk menggambar garis. Terkadang "pelapisan berlebihan" diperlukan. Saya dikirimi kode untuk menggambar garis super tertutup dalam segi enam, tapi saya belum memeriksanya.

Rentang pergerakan

Rentang koordinat

Diketahui sebuah pusat segi enam dan rentang N, segi enam manakah yang berada dalam jarak N langkah darinya?

Kita bisa melakukan kebalikan dari rumus jarak antar segi enam distance = max(abs(dx), abs(dy), abs(dz)) . Untuk mencari semua segi enam dalam N kita membutuhkan max(abs(dx), abs(dy), abs(dz)) ≤ N . Artinya ketiga nilai tersebut diperlukan: abs(dx) ≤ N dan abs(dy) ≤ N dan abs(dz) ≤ N . Menghapus nilai absolut, kita mendapatkan -N ≤ dx ≤ N dan -N ≤ dy ≤ N dan -N ≤ dz ≤ N . Dalam kode ini akan menjadi loop bersarang:

Var hasil = untuk setiap -N ≤ dx ≤ N: untuk setiap -N ≤ dy ≤ N: untuk setiap -N ≤ dz ≤ N: jika dx + dy + dz = 0: results.append(cube_add(center, Cube(dx , dy, dz)))
Siklus ini akan berhasil, namun tidak efektif. Dari semua nilai dz yang kita ulangi, hanya satu yang benar-benar memenuhi kondisi kubus dx + dy + dz = 0. Sebagai gantinya, kita akan langsung menghitung nilai dz yang memenuhi syarat:

Var hasil = untuk setiap -N ≤ dx ≤ N: untuk setiap max(-N, -dx-N) ≤ dy ≤ min(N, -dx+N): var dz = -dx-dy results.append(cube_add( tengah, Kubus(dx, dy, dz)))
Siklus ini hanya melewati koordinat yang diperlukan. Pada gambar, setiap rentang merupakan sepasang garis. Setiap garis merupakan pertidaksamaan. Kami mengambil semua segi enam yang memenuhi enam pertidaksamaan.

GIF


Rentang yang tumpang tindih

Jika Anda perlu menemukan segi enam yang berada dalam beberapa rentang, Anda dapat memotong rentang tersebut sebelum membuat daftar segi enam.

Anda dapat mendekati masalah ini dari sudut pandang aljabar atau geometri. Secara aljabar, setiap wilayah dinyatakan sebagai kondisi pertidaksamaan dalam bentuk -N ≤ dx ≤ N , dan kita perlu mencari titik potong dari kondisi tersebut. Secara geometris, setiap daerah adalah kubus dalam ruang 3D, dan kita akan memotong dua kubus dalam ruang 3D untuk mendapatkan sebuah balok dalam ruang 3D. Kami kemudian memproyeksikannya kembali ke bidang x + y + z = 0 untuk mendapatkan segi enam. Saya akan menyelesaikan masalah ini secara aljabar.

Pertama, kita tulis ulang kondisi -N ≤ dx ≤ N dalam bentuk yang lebih umum x min ≤ x ≤ x max , dan ambil x min = center.x - N dan x max = center.x + N . Mari kita lakukan hal yang sama untuk y dan z, sehingga menghasilkan bentuk umum kode dari bagian sebelumnya:

Hasil var = untuk setiap xmin ≤ x ≤ xmax: untuk setiap max(ymin, -x-zmax) ≤ y ≤ min(ymax, -x-zmin): var z = -x-y results.append(Cube(x, y, z))
Perpotongan dua rentang a ≤ x ≤ b dan c ≤ x ≤ d adalah max(a, c) ≤ x ≤ min(b, d) . Karena luas segi enam dinyatakan sebagai rentang pada x, y, z, kita dapat memotong masing-masing rentang x, y, z secara terpisah, lalu menggunakan perulangan bersarang untuk menghasilkan daftar segi enam pada perpotongan tersebut. Untuk satu luas segi enam kita ambil x min = H.x - N dan x max = H.x + N , begitu pula untuk y dan z . Untuk perpotongan dua daerah segi enam, kita ambil x min = max(H1.x - N, H2.x - N) dan x max = min(H1.x + N, H2.x + N), demikian pula untuk y dan z . Pola yang sama berlaku untuk perpotongan tiga area atau lebih.

GIF


Hambatan

Jika ada kendala, cara paling mudah adalah mengisi dengan batasan jarak (pencarian lebar-pertama). Pada gambar di bawah ini kami membatasi diri pada empat gerakan. Dalam kodenya, fringes[k] adalah larik semua segi enam yang dapat dicapai dalam k langkah. Setiap kali kita melewati loop utama, kita memperluas level k-1 sebanyak level k.

Fungsi cube_reachable(mulai, pergerakan): var yang dikunjungi = set() tambahkan awal yang dikunjungi var fringes = fringes.append() untuk setiap 1< k ≤ movement: fringes.append() for each cube in fringes: for each 0 ≤ dir < 6: var neighbor = cube_neighbor(cube, dir) if neighbor not in visited, not blocked: add neighbor to visited fringes[k].append(neighbor) return visited

Ternyata

Mengingat vektor segi enam (selisih antara dua segi enam), kita mungkin perlu memutarnya agar menunjuk ke segi enam lainnya. Hal ini mudah dilakukan dengan koordinat kubik jika Anda tetap menggunakan rotasi 1/6 lingkaran.

Rotasi 60° ke kanan menggerakkan setiap koordinat satu posisi ke kanan:

[ x, y, z] hingga [-z, -x, -y]
Rotasi 60° ke kiri menggerakkan setiap koordinat satu posisi ke kiri:

[ x, y, z] hingga [-y, -z, -x]



“Setelah bermain” [dalam artikel asli] dengan diagram, Anda dapat melihat bahwa setiap putaran adalah 60° perubahan tanda dan secara fisik “memutar” koordinat. Setelah diputar 120°, tandanya menjadi sama lagi. Rotasi 180° mengubah tanda, tetapi koordinatnya kembali ke posisi semula.

Berikut urutan lengkap perputaran posisi P mengelilingi posisi tengah C sehingga menghasilkan posisi baru R:

  1. Ubah posisi P dan C menjadi koordinat kubik.
  2. Menghitung vektor dengan mengurangkan pusatnya: P_from_C = P - C = Cube(P.x - C.x, P.y - C.y, P.z - C.z) .
  3. Putar vektor P_from_C seperti dijelaskan di atas dan tetapkan vektor terakhir dengan sebutan R_from_C .
  4. Mengubah vektor kembali ke posisinya dengan menambahkan pusat: R = R_from_C + C = Cube(R_from_C.x + C.x, R_from_C.y + C.y, R_from_C.z + C.z) .
  5. Mengonversi posisi kubik R kembali ke sistem koordinat yang diinginkan.
Ada beberapa tahap transformasi, namun masing-masing tahapnya cukup sederhana. Beberapa langkah ini dapat dipersingkat dengan mendefinisikan rotasi secara langsung dalam koordinat aksial, tetapi vektor hex tidak berfungsi dengan koordinat offset, dan saya tidak tahu cara mempersingkat langkah untuk koordinat offset. Lihat juga pembahasan di stackexchange untuk cara lain menghitung rotasi.

Cincin

Cincin sederhana

Untuk mengetahui apakah suatu segi enam termasuk dalam cincin dengan radius tertentu, Anda perlu menghitung jarak dari segi enam ini ke pusat, dan mencari tahu apakah sama dengan jari-jarinya. Untuk mendapatkan daftar semua segi enam tersebut, Anda perlu mengambil langkah radius dari pusat, dan kemudian mengikuti vektor yang diputar di sepanjang jalur di sepanjang cincin.

Fungsi cube_ring(pusat, radius): var results = # kode ini tidak berfungsi untuk radius == 0; apakah kamu mengerti alasannya? var cube = cube_add(center, cube_scale(cube_direction(4), radius)) untuk setiap 0 ≤ i< 6: for each 0 ≤ j < radius: results.append(cube) cube = cube_neighbor(cube, i) return results
Dalam kode ini, kubus dimulai pada sebuah cincin, ditunjukkan dengan panah besar dari tengah ke sudut diagram. Saya memilih sudut 4 untuk memulai karena cocok dengan jalur pergerakan nomor arah saya. Anda mungkin memerlukan sudut awal yang berbeda. Pada setiap tahap putaran dalam, kubus menggerakkan satu segi enam mengelilingi ring. Setelah 6 * langkah radius dia berakhir di tempat dia memulai.


Cincin spiral

Dengan menelusuri cincin dalam pola spiral, kita dapat mengisi bagian dalam cincin:

Fungsi cube_spiral(pusat, radius): var hasil = untuk setiap 1 ≤ k ≤ radius: hasil = hasil + cube_ring(pusat, k) mengembalikan hasil



Luas segi enam besar adalah jumlah semua lingkaran ditambah 1 untuk pusatnya. Gunakan rumus ini untuk menghitung luas.

Melintasi segi enam dengan cara ini juga dapat digunakan untuk menghitung jangkauan pergerakan (lihat di atas).

Area visibilitas

Apa yang terlihat dari posisi tertentu pada jarak tertentu dan tidak terhalang oleh rintangan? Cara termudah untuk menentukannya adalah dengan menggambar garis pada setiap segi enam dalam rentang tertentu. Jika garis tidak memenuhi dinding, maka Anda akan melihat segi enam. Gerakkan mouse Anda ke atas segi enam [pada diagram di artikel asli] untuk melihat bagaimana garis digambar pada segi enam ini dan dinding tempat bertemunya garis tersebut.

Algoritme ini mungkin lambat pada area yang luas, namun mudah diterapkan, jadi saya sarankan untuk memulainya.

GIF



Ada banyak definisi berbeda tentang visibilitas. Apakah Anda ingin melihat pusat segi enam lain dari pusat segi enam aslinya? Apakah Anda ingin melihat bagian segi enam lain dari pusat segi enam aslinya? Mungkin ada bagian dari segi enam lain dari titik mana pun di titik awal? Hambatan yang menghalangi pandangan Anda lebih kecil dari segi enam penuh? Scope adalah konsep yang lebih rumit dan bervariasi daripada yang terlihat pada pandangan pertama. Mari kita mulai dengan algoritme yang paling sederhana, tetapi berharap algoritme tersebut akan menghitung jawaban proyek Anda dengan benar. Bahkan ada kasus ketika algoritma sederhana menghasilkan hasil yang tidak logis.

Saya ingin memperluas panduan ini di masa mendatang. Saya punya