Bagaimana untuk melukis heksagon biasa dalam bulatan. Heksagon biasa dan sifatnya

Kandungan:

Heksagon sekata, juga dipanggil heksagon sempurna, mempunyai enam sisi yang sama dan enam sudut yang sama. Anda boleh melukis heksagon dengan ukuran pita dan protraktor, heksagon kasar dengan objek bulat dan pembaris, atau heksagon lebih kasar dengan hanya pensel dan sedikit gerak hati. Jika anda ingin tahu cara melukis heksagon dengan cara yang berbeza, teruskan membaca.

Langkah-langkah

1 Lukis heksagon sempurna menggunakan kompas

  1. 1 Menggunakan kompas, lukis bulatan. Masukkan pensel ke dalam kompas. Panjangkan kompas ke lebar jejari bulatan anda yang dikehendaki. Jejari boleh dari beberapa hingga sepuluh sentimeter lebar. Seterusnya, letakkan kompas dan pensel di atas kertas dan lukis bulatan.
    • Kadang-kadang lebih mudah untuk melukis separuh bulatan dahulu dan kemudian separuh lagi.
  2. 2 Gerakkan jarum kompas ke tepi bulatan. Letakkannya di atas bulatan. Jangan ubah sudut atau kedudukan kompas.
  3. 3 Buat tanda pensel kecil di tepi bulatan. Jelaskannya, tetapi jangan terlalu gelap kerana anda akan memadamkannya kemudian. Ingat untuk mengekalkan sudut yang anda tetapkan untuk kompas.
  4. 4 Gerakkan jarum kompas ke tanda yang baru anda buat. Letakkan jarum terus pada tanda.
  5. 5 Buat satu lagi tanda pensel di tepi bulatan. Dengan cara ini anda akan membuat tanda kedua pada jarak tertentu dari tanda pertama. Terus bergerak ke satu arah.
  6. 6 Gunakan kaedah yang sama untuk membuat empat markah lagi. Anda mesti kembali ke tanda asal. Jika tidak, kemungkinan besar sudut di mana anda memegang kompas dan membuat markah anda telah berubah. Ini mungkin berlaku kerana anda memerahnya terlalu kuat atau, sebaliknya, melonggarkannya sedikit.
  7. 7 Sambungkan tanda menggunakan pembaris. Enam tempat di mana tanda anda bersilang dengan tepi bulatan ialah enam bucu heksagon. Menggunakan pembaris dan pensel, lukis garis lurus yang menghubungkan tanda bersebelahan.
  8. 8 Padamkan bulatan, tanda di tepi bulatan dan sebarang tanda lain yang anda buat. Sebaik sahaja anda telah memadamkan semua garisan pembinaan anda, heksagon sempurna anda harus sedia.

2 Lukiskan heksagon kasar menggunakan objek bulat dan pembaris

  1. 1 Jejak rim kaca dengan pensel. Dengan cara ini anda akan melukis bulatan. Adalah sangat penting untuk melukis dengan pensil, kerana kemudian anda perlu memadamkan semua garisan tambahan. Anda juga boleh mengesan kaca terbalik, balang atau apa sahaja yang mempunyai tapak bulat.
  2. 2 Lukis garisan mendatar melalui pusat bulatan anda. Anda boleh menggunakan pembaris, buku - apa sahaja dengan tepi lurus. Jika anda mempunyai pembaris, anda boleh menandakan bahagian tengah dengan mengira panjang menegak bulatan dan membahagikannya kepada separuh.
  3. 3 Lukiskan "X" pada separuh bulatan, bahagikannya kepada enam bahagian yang sama. Memandangkan anda telah melukis garisan melalui tengah bulatan, X perlu lebih lebar daripada tinggi supaya bahagiannya sama. Bayangkan membahagikan pizza kepada enam keping.
  4. 4 Buat segitiga daripada setiap bahagian. Untuk melakukan ini, gunakan pembaris untuk melukis garis lurus di bawah bahagian melengkung setiap bahagian, menyambungkannya ke dua garisan lain untuk membentuk segi tiga. Lakukan ini dengan lima bahagian yang tinggal. Fikirkan ia seperti membuat kerak di sekeliling kepingan pizza anda.
  5. 5 Padamkan semua garisan tambahan. Garis panduan termasuk bulatan anda, tiga baris yang membahagikan bulatan anda kepada bahagian dan tanda lain yang anda buat di sepanjang jalan.

3 Lukis heksagon kasar menggunakan satu pensel

  1. 1 Lukis garisan mendatar. Untuk melukis garis lurus tanpa pembaris, hanya lukis titik permulaan dan penamat garisan mendatar anda. Kemudian letakkan pensel pada titik permulaan dan lukis garisan ke penghujung. Panjang garisan ini boleh hanya beberapa sentimeter.
  2. 2 Lukis dua garisan pepenjuru dari hujung garis mendatar. Garis pepenjuru di sebelah kiri hendaklah menghala ke luar dengan cara yang sama seperti garis pepenjuru di sebelah kanan. Anda boleh bayangkan bahawa garis-garis ini membentuk sudut 120 darjah berkenaan dengan garis mendatar.
  3. 3 Lukis dua lagi garisan mendatar yang datang daripada garisan mendatar pertama yang dilukis ke dalam. Ini akan mencipta imej cermin dua garis pepenjuru pertama. Garis kiri bawah haruslah pantulan baris kiri atas, dan baris kanan bawah harus pantulan baris atas kanan. Walaupun garis mendatar atas harus melihat ke luar, garis bawah harus melihat ke dalam ke pangkalan.
  4. 4 Lukis satu lagi garisan mendatar yang menghubungkan dua garisan pepenjuru bawah. Dengan cara ini anda akan melukis asas untuk heksagon anda. Sebaik-baiknya, garisan ini hendaklah selari dengan garisan mendatar atas. Sekarang anda telah melengkapkan heksagon anda.
  • Pensel dan kompas hendaklah tajam untuk meminimumkan ralat daripada tanda yang terlalu lebar.
  • Apabila menggunakan kaedah kompas, jika anda menyambung setiap tanda dan bukannya semua enam, anda akan mendapat segi tiga sama sisi.

Amaran

  • Kompas adalah objek yang agak tajam, berhati-hati dengannya.

Prinsip operasi

  • Setiap kaedah akan membantu anda melukis heksagon yang dibentuk oleh enam segi tiga sama sisi dengan jejari yang sama dengan panjang semua sisi. Enam jejari yang dilukis adalah sama panjang dan semua garisan untuk mencipta heksagon juga sama panjang, kerana lebar kompas tidak berubah. Disebabkan oleh fakta bahawa enam segi tiga adalah sama sisi, sudut antara bucunya ialah 60 darjah.

Apa yang anda perlukan

  • kertas
  • Pensel
  • pembaris
  • Sepasang kompas
  • Sesuatu yang boleh diletakkan di bawah kertas untuk mengelakkan jarum kompas daripada tergelincir.
  • Pemadam

Pembinaan geometri adalah salah satu bahagian utama latihan. Mereka membentuk pemikiran spatial dan logik, dan juga membolehkan kita memahami kesahihan geometri primitif dan semula jadi. Pembinaan dibuat di atas kapal terbang menggunakan kompas dan pembaris. Alat ini boleh digunakan untuk membina sejumlah besar bentuk geometri. Pada masa yang sama, banyak angka yang kelihatan agak sukar dibina menggunakan peraturan yang paling mudah. Sebagai contoh, cara membina heksagon biasa boleh diterangkan dalam beberapa perkataan.

Anda perlu

  • Kompas, pembaris, pensel, helaian kertas.

Arahan

1. Lukis bulatan. Tetapkan beberapa jarak antara kaki kompas. Jarak ini akan menjadi jejari bulatan. Pilih jejari sedemikian rupa sehingga melukis bulatan agak selesa. Bulatan mesti muat sepenuhnya pada helaian kertas. Jarak yang terlalu besar atau terlalu kecil antara kaki kompas boleh menyebabkan perubahannya semasa melukis. Jarak optimum adalah di mana sudut antara kaki kompas ialah 15-30 darjah.

2. Bina titik bucu bagi bucu heksagon sekata. Letakkan kaki kompas, di mana jarum dipasang, pada mana-mana titik pada bulatan. Jarum harus menembusi garis yang dilukis. Lebih tepat kompas dipasang, lebih tepat pembinaannya. Lukis lengkok bulat supaya ia bersilang dengan bulatan yang dilukis sebelumnya. Gerakkan jarum kompas ke titik persilangan lengkok yang baru dilukis dengan bulatan. Lukis lengkok lain yang bersilang dengan bulatan. Gerakkan jarum kompas sekali lagi ke titik persilangan lengkok dan bulatan dan lukis lengkok sekali lagi. Ulangi tindakan ini tiga kali lagi, bergerak ke satu arah mengelilingi bulatan. Setiap satu harus mempunyai enam lengkok dan enam titik persilangan.

3. Bina heksagon positif. Berperingkat menggabungkan kesemua enam titik persilangan lengkok dengan bulatan yang dilukis pada asalnya. Sambungkan titik dengan garis lurus yang dilukis menggunakan pembaris dan pensel. Selepas melakukan tindakan ini, heksagon yang betul tertulis dalam bulatan akan diperolehi.

Heksagon Poligon dianggap mempunyai enam sudut dan enam sisi. Poligon boleh sama ada cembung atau cekung. Heksagon cembung mempunyai semua sudut dalam tumpul, manakala heksagon cekung mempunyai satu atau lebih sudut lancip. Heksagon agak mudah untuk dibina. Ini dilakukan dalam beberapa langkah.

Anda perlu

  • Pensel, helaian kertas, pembaris

Arahan

1. Ambil sehelai kertas dan tandakan 6 mata padanya lebih kurang seperti yang ditunjukkan dalam Rajah. 1.

2. Selepas mata telah ditanda, ambil pembaris dan pensel dan, dengan bantuan mereka, langkah demi langkah, satu demi satu, sambungkan titik-titik seperti yang kelihatan dalam Rajah. 2.

Video mengenai topik

Catatan!
Jumlah semua sudut pedalaman sebuah heksagon ialah 720 darjah.

Heksagon ialah poligon, yang mempunyai enam sudut. Untuk melukis heksagon sewenang-wenangnya, anda perlu melakukan 2 langkah setiap satu.

Anda perlu

  • Pensel, pembaris, helaian kertas.

Arahan

1. Anda perlu mengambil pensel di tangan anda dan tandakan 6 titik rawak pada helaian. Pada masa hadapan, titik ini akan memainkan peranan sudut dalam heksagon. (Rajah 1)

2. Ambil pembaris dan lukis 6 segmen berdasarkan titik ini yang akan bersambung antara satu sama lain di sepanjang titik yang dilukis sebelum ini (Gamb. 2)

Video mengenai topik

Catatan!
Jenis heksagon istimewa ialah heksagon positif. Ia dipanggil sedemikian kerana semua sisi dan sudutnya adalah sama antara satu sama lain. Anda boleh menerangkan atau menulis bulatan di sekeliling heksagon sedemikian. Perlu diingat bahawa pada titik yang diperoleh dengan menyentuh bulatan bertulis dan sisi heksagon, sisi heksagon positif dibahagikan kepada separuh.

Nasihat yang berguna
Secara semula jadi, heksagon positif sangat popular. Sebagai contoh, keseluruhan sarang lebah mempunyai bentuk heksagon positif. Atau kekisi kristal graphene (pengubahsuaian karbon) juga mempunyai bentuk heksagon positif.

Bagaimana untuk membina satu atau yang lain sudut- soalan besar. Tetapi untuk beberapa sudut, tugas itu tidak kelihatan dipermudahkan. Salah satu sudut ini ialah sudut pada 30 darjah. Ia bersamaan dengan?/6, iaitu, nombor 30 ialah pembahagi 180. Selain itu, sinusnya diketahui. Ini membantu dalam pembinaannya.

Anda perlu

  • protraktor, segi empat sama, kompas, pembaris

Arahan

1. Mula-mula, mari kita lihat situasi yang sangat primitif apabila anda mempunyai protraktor di tangan anda. Kemudian garis lurus pada sudut 30 darjah kepada ini boleh dengan mudah diketepikan dengan sokongan untuknya.

2. Selain protraktor, terdapat juga sudut gerbang, salah satu sudutnya adalah sama dengan 30 darjah. Kemudian satu lagi sudut sudut sudut akan sama dengan 60 darjah, iaitu, anda memerlukan visual yang lebih kecil sudut untuk membina garis lurus yang diperlukan.

3. Sekarang mari kita beralih kepada cara yang tidak remeh untuk membina sudut 30 darjah. Seperti yang anda ketahui, sinus sudut 30 darjah adalah sama dengan 1/2. Untuk membinanya, kita perlu membina secara langsung sudut sionari sudut nik. Ada kemungkinan kita boleh membina dua garis serenjang. Tetapi tangen 30 darjah adalah nombor tidak rasional, oleh itu kita hanya boleh mengira kira-kira nisbah antara kaki (secara eksklusif jika tiada kalkulator), dan, oleh itu, membina sudut lebih kurang 30 darjah.

4. Dalam kes ini, adalah mungkin untuk membuat pembinaan yang tepat. Mari kita sekali lagi membina dua garis lurus berserenjang, di mana kaki akan terletak lurus sudut tidak pergi sudut nik. Marilah kita meletakkan satu kaki lurus BC yang agak panjang dengan sokongan kompas (B – lurus sudut). Selepas ini, kami akan menambah panjang antara kaki kompas sebanyak 2 kali ganda, iaitu asas. Melukis bulatan dengan pusat pada titik C dengan jejari panjang ini, kita dapati titik persilangan bulatan dengan garis lurus yang lain. Titik ini akan menjadi titik A secara langsung sudut tidak pergi sudut ABC, dan sudut A akan bersamaan dengan 30 darjah.

5. Tegak sudut pada 30 darjah dibenarkan dan dengan sokongan bulatan, menggunakan apa yang sama dengannya?/6. Mari bina bulatan dengan jejari OB. Mari kita lihat teorinya sudut nik, di mana OA = OB = R – jejari bulatan, di mana sudut OAB = 30 darjah. Biarkan OE ialah ketinggian segi tiga sama kaki ini sudut nik, dan, akibatnya, pembahagi dua dan mediannya. Kemudian sudut AOE = 15 darjah, dan, mengikut formula separuh sudut, sin(15o) = (sqrt(3)-1)/(2*sqrt(2)). Akibatnya, AE = R*sin(15o). Oleh itu, AB = 2AE = 2R*sin(15o). Dengan membina bulatan berjejari BA dengan pusat di titik B, kita dapati titik persilangan A bulatan ini dengan titik awal. Sudut AOB ialah 30 darjah.

6. Jika kita boleh menentukan panjang lengkok dalam beberapa cara, maka, mengetepikan lengkok panjang?*R/6, kita juga mendapat sudut pada 30 darjah.

Catatan!
Kita mesti ingat bahawa dalam perenggan 5 kita hanya boleh membina sudut lebih kurang, kerana nombor tidak rasional akan muncul dalam pengiraan.

Heksagon dipanggil kes khas poligon - angka yang dibentuk oleh majoriti titik satah, dibatasi oleh garis poli tertutup. Heksagon positif (heksagon), sebaliknya, juga merupakan kes khas - ia adalah poligon dengan enam sisi yang sama dan sudut yang sama. Angka ini penting kerana panjang semua sisinya adalah sama dengan jejari bulatan yang diterangkan di sekeliling rajah itu.

Anda perlu

  • – kompas;
  • - pembaris;
  • - pensel;
  • - kertas.

Arahan

1. Pilih panjang sisi heksagon. Ambil kompas dan tetapkan jarak antara hujung jarum yang terletak pada salah satu kakinya dan hujung plumbum yang terletak pada kaki yang lain, sama dengan panjang sisi rajah yang dilukis. Untuk melakukan ini, anda boleh menggunakan pembaris atau memilih jarak rawak jika momen ini tidak penting. Selamatkan kaki kompas dengan skru, jika boleh.

2. Lukis bulatan menggunakan kompas. Jarak yang dipilih antara kaki akan menjadi jejari bulatan.

3. Bahagikan bulatan kepada enam bahagian yang sama dengan titik. Titik ini akan menjadi bucu sudut heksagon dan, dengan itu, hujung segmen yang mewakili sisinya.

4. Letakkan kaki kompas dengan jarum pada titik sewenang-wenangnya yang terletak pada garisan bulatan yang digariskan. Jarum harus menusuk garisan dengan betul. Ketepatan binaan secara langsung bergantung pada ketepatan pemasangan kompas. Lukis lengkok dengan kompas supaya ia bersilang dengan bulatan yang dilukis dahulu pada 2 mata.

5. Gerakkan kaki kompas dengan jarum ke salah satu titik persilangan lengkok yang dilukis dengan bulatan asal. Lukis lengkok lain, juga bersilang dengan bulatan pada 2 titik (salah satu daripadanya akan bertepatan dengan titik lokasi jarum kompas sebelumnya).

6. Dengan cara yang sama, susun semula jarum kompas dan lukis lengkok empat kali lagi. Gerakkan kaki kompas dengan jarum ke satu arah mengelilingi bulatan (selalunya mengikut arah jam atau lawan jam). Akibatnya, enam titik persilangan lengkok dengan bulatan yang dibina pada mulanya mesti dikenal pasti.

7. Lukis heksagon positif. Secara berperingkat, secara berpasangan, satukan enam mata yang diperoleh pada langkah sebelumnya dengan segmen. Lukiskan bahagian menggunakan pensel dan pembaris. Hasilnya akan menjadi heksagon yang betul. Selepas melengkapkan pembinaan, anda boleh memadamkan elemen tambahan (arka dan bulatan).

Catatan!
Adalah masuk akal untuk memilih jarak antara kaki kompas supaya sudut di antara mereka adalah 15-30 darjah, sebaliknya, apabila membuat pembinaan, jarak ini mudah hilang.

Apabila membina atau membangunkan rancangan reka bentuk rumah, selalunya perlu untuk membina sudut, sama dengan yang sedia ada. Sampel dan kemahiran geometri sekolah datang untuk menyokong.

Arahan

1. Sudut dibentuk oleh dua garis lurus yang terpancar dari satu titik. Titik ini akan dipanggil puncak sudut, dan garisan akan menjadi sisi sudut.

2. Gunakan tiga huruf untuk mewakili sudut: satu di bahagian atas, dua di sisi. Dipanggil sudut, bermula dengan huruf yang berdiri di sebelah, kemudian huruf yang berdiri di bahagian atas dipanggil, dan selepas itu huruf di sisi yang lain. Gunakan kaedah lain untuk menandakan sudut jika anda lebih selesa bertentangan. Kadang-kadang, hanya satu huruf yang dinamakan, yang terletak di bahagian atas. Dan ia dibenarkan untuk menandakan sudut dengan huruf Yunani, katakan, α, β, γ.

3. Terdapat situasi apabila anda perlu melukis sudut, supaya ia sama dengan sudut yang diberikan. Jika tiada peluang untuk menggunakan protraktor semasa membina lukisan, anda hanya boleh bertahan dengan pembaris dan kompas. Ada kemungkinan, pada garis lurus yang ditunjukkan dalam lukisan oleh huruf MN, adalah perlu untuk membina sudut pada titik K, supaya ia sama dengan sudut B. Iaitu, dari titik K anda perlu melukis garis lurus yang terbentuk dengan garis MN sudut, yang akan sama dengan sudut B.

4. Mula-mula, tanda satu titik pada keseluruhan sisi sudut tertentu, katakan, titik A dan C, kemudian sambungkan titik C dan A dengan garis lurus. Dapatkan tre sudut nik ABC.

5. Sekarang bina tre yang sama pada garis lurus MN sudut supaya bucu Bnya berada pada garis di titik K. Gunakan peraturan untuk membina segi tiga sudut pada tiga sisi. Buang segmen KL dari titik K. Ia mestilah sama dengan segmen BC. Dapatkan mata L.

6. Dari titik K, lukis bulatan dengan jejari sama dengan segmen BA. Dari L, lukis bulatan dengan jejari CA. Gabungkan titik (P) yang terhasil bagi persilangan 2 bulatan dengan K. Dapatkan tiga sudut nik KPL, yang akan sama dengan tiga sudut Buku ABC. Ini adalah cara anda mendapat sudut K. Ia akan sama dengan sudut B. Untuk menjadikan pembinaan ini lebih selesa dan lebih pantas, tolakkan segmen yang sama dari bucu B, menggunakan satu penyelesaian kompas, tanpa menggerakkan kaki, huraikan bulatan dengan jejari yang sama dari titik K.

Video mengenai topik

Catatan!
Elakkan menukar jarak antara kaki kompas secara tidak sengaja. Dalam kes ini, heksagon mungkin menjadi salah.

Nasihat yang berguna
Dia mempunyai kebolehan untuk membuat binaan menggunakan kompas dengan plumbum yang diasah dengan sempurna. Dengan cara ini pembinaan akan menjadi sangat tepat.

Adakah terdapat pensel berhampiran anda? Lihatlah keratan rentasnya - ia ialah heksagon biasa atau, kerana ia juga dipanggil, heksagon. Keratan rentas kacang, bidang catur heksagon, beberapa molekul karbon kompleks (contohnya, grafit), kepingan salji, sarang lebah dan objek lain juga mempunyai bentuk ini. Heksagon biasa gergasi baru-baru ini ditemui pada tahun Adakah nampaknya pelik bahawa alam semula jadi sering menggunakan struktur bentuk tertentu ini untuk ciptaannya? Mari kita lihat lebih dekat.

Heksagon sekata ialah poligon dengan enam sisi yang sama dan sudut yang sama. Dari kursus sekolah kita tahu bahawa ia mempunyai ciri-ciri berikut:

  • Panjang sisinya sepadan dengan jejari bulatan yang dihadkan. Daripada semua, hanya heksagon biasa yang mempunyai sifat ini.
  • Sudut adalah sama antara satu sama lain, dan setiap ukuran ialah 120°.
  • Perimeter heksagon boleh didapati menggunakan formula P=6*R, jika jejari bulatan yang diterangkan di sekelilingnya diketahui, atau P=4*√(3)*r, jika bulatan itu tertulis di dalamnya. R dan r ialah jejari bagi bulatan berhad dan bergaris.
  • Kawasan yang diduduki oleh heksagon sekata ditentukan seperti berikut: S=(3*√(3)*R 2)/2. Jika jejari tidak diketahui, gantikan panjang salah satu sisi - seperti yang diketahui, ia sepadan dengan panjang jejari bulatan yang dihadkan.

Heksagon biasa mempunyai satu ciri yang menarik, kerana ia telah menjadi begitu meluas dalam alam semula jadi - ia mampu mengisi mana-mana permukaan pesawat tanpa pertindihan atau jurang. Malah terdapat apa yang dipanggil Pal lemma, yang mengikutnya heksagon biasa, sisi yang sama dengan 1/√(3), adalah penutup universal, iaitu, ia boleh menutup mana-mana set dengan diameter satu unit .

Sekarang mari kita lihat membina heksagon biasa. Terdapat beberapa kaedah, yang paling mudah melibatkan penggunaan kompas, pensel dan pembaris. Pertama, kita melukis bulatan sewenang-wenangnya dengan kompas, kemudian kita membuat titik di tempat sewenang-wenangnya pada bulatan ini. Tanpa mengubah sudut kompas, kami meletakkan hujung pada titik ini, menandakan takuk seterusnya pada bulatan, dan teruskan ini sehingga kami mendapat semua 6 mata. Sekarang yang tinggal hanyalah menyambungkannya bersama-sama dengan segmen lurus, dan anda akan mendapat angka yang dikehendaki.

Dalam amalan, terdapat kes apabila anda perlu melukis heksagon besar. Sebagai contoh, pada siling papan eternit dua tingkat, di sekitar lokasi pemasangan candelier pusat, anda perlu memasang enam lampu kecil di tingkat bawah. Kompas saiz ini akan menjadi sangat, sangat sukar untuk dicari. Apa yang perlu dilakukan dalam kes ini? Bagaimana anda boleh melukis bulatan besar? Sangat ringkas. Anda perlu mengambil benang yang kuat dengan panjang yang diperlukan dan mengikat salah satu hujungnya bertentangan dengan pensil. Sekarang yang tinggal hanyalah mencari pembantu yang akan menekan hujung kedua benang ke siling pada titik yang dikehendaki. Sudah tentu, dalam kes ini, kesilapan kecil mungkin, tetapi mereka tidak mungkin dapat dilihat oleh orang luar sama sekali.

Pembinaan heksagon biasa yang ditulis dalam bulatan. Pembinaan heksagon adalah berdasarkan fakta bahawa sisinya adalah sama dengan jejari bulatan yang dihadkan. Oleh itu, untuk membinanya, cukup untuk membahagikan bulatan kepada enam bahagian yang sama dan menyambungkan titik yang ditemui antara satu sama lain (Rajah 60, a).

Heksagon biasa boleh dibina menggunakan tepi lurus dan segi empat sama 30X60°. Untuk menjalankan pembinaan ini, kita mengambil diameter mendatar bulatan sebagai pembahagi dua sudut 1 dan 4 (Rajah 60, b), bina sisi 1 -6, 4-3, 4-5 dan 7-2, selepas itu kita lukis sisi 5-6 dan 3- 2.

Membina segi tiga sama sisi yang ditulis dalam bulatan. Bucu segitiga tersebut boleh dibina menggunakan kompas dan segi empat sama dengan sudut 30 dan 60° atau hanya satu kompas.

Mari kita pertimbangkan dua cara untuk membina segitiga sama sisi yang ditulis dalam bulatan.

Cara pertama(Gamb. 61,a) adalah berdasarkan fakta bahawa ketiga-tiga sudut segitiga 7, 2, 3 mengandungi 60°, dan garis menegak yang dilukis melalui titik 7 ialah kedua-dua ketinggian dan pembahagi dua sudut 1. Oleh kerana sudut ialah 0-1- 2 adalah sama dengan 30°, kemudian untuk mencari sisi

1-2, sudah cukup untuk membina sudut 30° dari titik 1 dan sisi 0-1. Untuk melakukan ini, pasang palang dan segi empat sama seperti yang ditunjukkan dalam rajah, lukis garisan 1-2, yang akan menjadi salah satu sisi segitiga yang dikehendaki. Untuk membina sisi 2-3, tetapkan palang pada kedudukan yang ditunjukkan oleh garis putus-putus, dan lukis garis lurus melalui titik 2, yang akan menentukan bucu ketiga segi tiga.

Cara kedua adalah berdasarkan fakta bahawa jika anda membina heksagon biasa yang tertulis dalam bulatan dan kemudian menyambungkan bucunya melalui satu, anda akan mendapat segi tiga sama.

Untuk membina segi tiga (Rajah 61, b), tandakan titik bucu 1 pada diameter dan lukis garis diameter 1-4. Seterusnya, dari titik 4 dengan jejari bersamaan dengan D/2, kami menerangkan lengkok sehingga ia bersilang dengan bulatan pada titik 3 dan 2. Titik yang terhasil ialah dua bucu lain bagi segi tiga yang dikehendaki.

Membina segi empat sama yang ditulis dalam bulatan. Pembinaan ini boleh dilakukan menggunakan segi empat sama dan kompas.

Kaedah pertama adalah berdasarkan fakta bahawa pepenjuru segi empat sama bersilang di tengah bulatan berbatas dan condong ke paksinya pada sudut 45°. Berdasarkan ini, kami memasang palang dan segi empat sama dengan sudut 45° seperti yang ditunjukkan dalam Rajah. 62, a, dan tanda titik 1 dan 3. Seterusnya, melalui titik ini kita lukis sisi mendatar petak 4-1 dan 3-2 menggunakan palang. Kemudian, menggunakan tepi lurus, kami melukis sisi menegak persegi 1-2 dan 4-3 di sepanjang kaki persegi.

Kaedah kedua adalah berdasarkan fakta bahawa bucu segi empat sama membahagi dua lengkok bulatan yang tertutup di antara hujung diameter (Rajah 62, b). Kami menandakan titik A, B dan C pada hujung dua diameter yang saling berserenjang dan daripadanya dengan jejari y kami menerangkan lengkok sehingga ia bersilang antara satu sama lain.

Seterusnya, melalui titik persilangan arka kita melukis garis lurus tambahan, ditandakan dalam rajah dengan garis pepejal. Titik persilangan mereka dengan bulatan akan menentukan bucu 1 dan 3; 4 dan 2. Kami menyambungkan bucu segi empat sama yang dikehendaki yang diperoleh dengan cara ini secara bersiri antara satu sama lain.

Pembinaan pentagon biasa yang tertulis dalam bulatan.

Untuk memasukkan pentagon biasa ke dalam bulatan (Gamb. 63), kami membuat binaan berikut.

Kami menandakan titik 1 pada bulatan dan mengambilnya sebagai salah satu bucu pentagon. Kami membahagikan segmen AO kepada separuh. Untuk melakukan ini, kita menerangkan lengkok dari titik A dengan jejari AO sehingga ia bersilang dengan bulatan pada titik M dan B. Dengan menyambungkan titik-titik ini dengan garis lurus, kita mendapat titik K, yang kemudiannya kita sambungkan ke titik 1. Dengan jejari yang sama dengan segmen A7, kita menerangkan lengkok dari titik K sehingga ia bersilang dengan garis diametrik AO pada titik H. Dengan menyambungkan titik 1 dengan titik H, kita mendapat sisi pentagon. Kemudian, dengan menggunakan penyelesaian kompas yang sama dengan segmen 1H, menerangkan lengkok dari bucu 1 ke persilangan dengan bulatan, kita dapati bucu 2 dan 5. Setelah membuat takuk dari bucu 2 dan 5 dengan penyelesaian kompas yang sama, kita memperoleh baki bucu 3 dan 4. Kami menyambungkan titik yang ditemui secara berurutan antara satu sama lain.

Membina pentagon sekata sepanjang sisi tertentu.

Untuk membina pentagon sekata di sepanjang sisi tertentu (Rajah 64), kami membahagikan segmen AB kepada enam bahagian yang sama. Dari titik A dan B dengan jejari AB kami menerangkan lengkok, persilangan yang akan memberikan titik K. Melalui titik ini dan pembahagian 3 pada garis AB kami melukis garis menegak.

Kami mendapat titik 1-bucu pentagon. Kemudian, dengan jejari sama dengan AB, dari titik 1 kita menghuraikan lengkok sehingga ia bersilang dengan lengkok yang sebelumnya dilukis dari titik A dan B. Titik persilangan lengkok menentukan bucu pentagon 2 dan 5. Kami menyambungkan bucu yang ditemui dalam siri antara satu sama lain.

Pembinaan heptagon biasa yang tertulis dalam bulatan.

Biarkan bulatan diameter D diberikan; anda perlu memasukkan heptagon biasa ke dalamnya (Gamb. 65). Bahagikan diameter menegak bulatan kepada tujuh bahagian yang sama. Dari titik 7 dengan jejari yang sama dengan diameter bulatan D, kami menerangkan lengkok sehingga ia bersilang dengan kesinambungan diameter mengufuk pada titik F. Kami memanggil titik F sebagai kutub poligon. Mengambil titik VII sebagai salah satu bucu heptagon, kita melukis sinar dari tiang F melalui pembahagian genap diameter menegak, persilangannya dengan bulatan akan menentukan bucu VI, V dan IV heptagon. Untuk mendapatkan bucu / - // - /// dari titik IV, V dan VI, lukis garisan mendatar sehingga ia bersilang dengan bulatan. Kami menyambungkan bucu yang ditemui secara berurutan antara satu sama lain. Heptagon boleh dibina dengan melukis sinar dari kutub F dan melalui pembahagian ganjil diameter menegak.

Kaedah di atas sesuai untuk membina poligon sekata dengan sebarang bilangan sisi.

Pembahagian bulatan kepada sebarang bilangan bahagian yang sama juga boleh dilakukan menggunakan data dalam Jadual. 2, yang menyediakan pekali yang memungkinkan untuk menentukan dimensi sisi poligon bertulis biasa.

Grid heksagon (grid heksagon) digunakan dalam sesetengah permainan, tetapi ia tidak semudah atau biasa seperti grid segi empat tepat. Saya telah mengumpul sumber pada jerat heksagon selama hampir 20 tahun, dan saya menulis panduan ini kepada pendekatan paling elegan yang dilaksanakan dalam kod yang paling mudah. Artikel ini menggunakan panduan Charles Fu dan Clark Verbrugge secara meluas. Saya akan menerangkan cara berbeza untuk mencipta jerat heksagon, perhubungannya dan algoritma yang paling biasa. Banyak bahagian artikel ini adalah interaktif: memilih jenis grid mengubah gambar rajah, kod dan teks yang sepadan. (Nota per.: ini hanya terpakai kepada yang asal, saya menasihati anda untuk mengkajinya. Dalam terjemahan, semua maklumat yang asal disimpan, tetapi tanpa interaktiviti.).

Contoh kod dalam artikel ditulis dalam pseudokod, jadi ia lebih mudah dibaca dan difahami untuk menulis pelaksanaan anda sendiri.

Geometri

Heksagon ialah poligon enam segi. Heksagon biasa mempunyai semua sisi (tepi) yang sama panjang. Kami hanya akan bekerja dengan heksagon biasa. Biasanya, jerat heksagon menggunakan orientasi mendatar (atas runcing) dan menegak (atas rata).


Heksagon dengan bahagian atas rata (kiri) dan tajam (kanan).

Heksagon mempunyai 6 muka. Setiap muka adalah biasa kepada dua heksagon. Heksagon mempunyai 6 titik sudut. Setiap titik sudut adalah biasa kepada tiga heksagon. Anda boleh membaca lebih lanjut mengenai pusat, tepi dan titik sudut dalam artikel saya tentang bahagian jejaring (segi empat sama, heksagon dan segi tiga).

Sudut

Dalam heksagon sekata, sudut dalam ialah 120°. Terdapat enam "baji", setiap satunya adalah segi tiga sama sisi dengan sudut dalaman 60°. Titik sudut i terletak pada jarak (60° * i) + 30°, unit saiz dari pusat tengah. Dalam kod:

Fungsi hex_corner(pusat, saiz, i): var angle_deg = 60 * i + 30 var angle_rad = PI / 180 * angle_deg return Point(center.x + saiz * cos(angle_rad), center.y + saiz * sin(angle_rad) )
Untuk mengisi heksagon, anda perlu mendapatkan bucu poligon daripada hex_corner(…, 0) ke hex_corner(…, 5) . Untuk melukis garis besar heksagon, anda perlu menggunakan bucu ini dan kemudian lukis garisan sekali lagi dalam hex_corner(..., 0) .

Perbezaan antara dua orientasi ialah x dan y ditukar, mengakibatkan perubahan sudut: heksagon atas rata mempunyai sudut 0°, 60°, 120°, 180°, 240°, 300°, dan atas runcing heksagon mempunyai sudut 30 °, 90°, 150°, 210°, 270°, 330°.


Sudut heksagon dengan puncak rata dan tajam

Saiz dan lokasi

Sekarang kita mahu meletakkan beberapa heksagon bersama-sama. Dalam orientasi mendatar, ketinggian heksagon ialah ketinggian = saiz * 2 . Jarak menegak antara heksagon bersebelahan ialah vert = tinggi * 3/4 ​​​​.

Lebar heksagon lebar = sqrt(3)/2 * tinggi . Jarak mengufuk antara heksagon bersebelahan ialah horiz = lebar .

Sesetengah permainan menggunakan seni piksel untuk heksagon, yang tidak betul-betul sepadan dengan heksagon biasa. Formula sudut dan peletakan yang diterangkan dalam bahagian ini tidak akan sepadan dengan dimensi heksagon tersebut. Selebihnya artikel yang menerangkan algoritma jejaring heksagon terpakai walaupun heksagon sedikit diregangkan atau terjepit.



Sistem koordinat

Mari mulakan memasang heksagon ke dalam grid. Dalam kes grid segi empat sama, terdapat hanya satu cara yang jelas untuk dipasang. Untuk heksagon, terdapat banyak pendekatan. Saya mengesyorkan menggunakan koordinat padu sebagai perwakilan utama anda. Koordinat paksi atau koordinat mengimbangi harus digunakan untuk menyimpan peta dan memaparkan koordinat kepada pengguna.

Koordinat mengimbangi

Pendekatan yang paling biasa adalah untuk mengimbangi setiap lajur atau baris berikutnya. Lajur ditetapkan kol atau q. Baris dilambangkan dengan baris atau r . Anda boleh mengimbangi lajur/baris ganjil atau genap, jadi heksagon mendatar dan menegak masing-masing mempunyai dua pilihan.


Susunan mendatar "odd-r"


Susunan mendatar "gen-r"


Susunan "ganjil-q" menegak


Susunan menegak "gen-q"

Koordinat padu

Satu lagi cara untuk melihat grid heksagon ialah melihatnya sebagai tiga paksi utama, bukan dua, seperti dalam grid segi empat sama. Mereka memaparkan simetri yang elegan.

Mari kita ambil grid kiub dan mari kita potong satah pepenjuru pada x + y + z = 0. Ini idea yang pelik, tetapi ia akan membantu kami memudahkan algoritma mesh heksagon. Khususnya, kita akan dapat menggunakan operasi standard daripada koordinat Cartes: menjumlah dan menolak koordinat, mendarab dan membahagi dengan kuantiti skalar, serta jarak.

Perhatikan tiga paksi utama pada grid kubus dan hubungannya dengan enam pepenjuru arah grid heksagon. Paksi pepenjuru grid sepadan dengan arah utama grid heksagon.


Heksagon


kiub

Memandangkan kami sudah mempunyai algoritma untuk jerat segi empat sama dan kubus, menggunakan koordinat kubik membolehkan kami menyesuaikan algoritma ini kepada jerat heksagon. Saya akan menggunakan sistem ini untuk kebanyakan algoritma artikel. Untuk menggunakan algoritma dengan sistem koordinat yang berbeza, saya mengubah koordinat padu, menjalankan algoritma dan kemudian menukarnya kembali.

Ketahui cara koordinat padu berfungsi untuk jejaring heksagon. Apabila anda memilih heksagon, koordinat kubik sepadan dengan tiga paksi diserlahkan.

  1. Setiap arah grid kubus sepadan dengan garisan pada grid heksagon. Cuba pilih heksagon dengan z sama dengan 0, 1, 2, 3 untuk melihat sambungan. Garisan ditandakan dengan warna biru. Cuba perkara yang sama untuk x (hijau) dan y (ungu).
  2. Setiap arah grid heksagon ialah gabungan dua arah grid kubus. Sebagai contoh, "utara" grid heksagon terletak di antara +y dan -z , jadi setiap langkah mengikut "utara" meningkat y sebanyak 1 dan mengecilkan z sebanyak 1.
Koordinat kubik ialah pilihan yang munasabah untuk sistem koordinat grid heksagon. Keadaannya ialah x + y + z = 0, jadi ia mesti dikekalkan dalam algoritma. Syarat ini juga memastikan bahawa akan sentiasa ada koordinat kanonik untuk setiap heksagon.

Terdapat banyak sistem koordinat yang berbeza untuk kubus dan heksagon. Dalam sesetengahnya keadaannya berbeza daripada x + y + z = 0. Saya hanya menunjukkan satu daripada banyak sistem. Anda juga boleh mencipta koordinat kubik dengan x-y , y-z , z-x , yang mempunyai set sifat menarik mereka sendiri, tetapi saya tidak akan membincangkannya di sini.

Tetapi anda boleh berhujah bahawa anda tidak mahu menyimpan 3 nombor untuk koordinat kerana anda tidak tahu cara menyimpan peta dengan cara itu.

Koordinat paksi

Sistem koordinat paksi, kadangkala dipanggil sistem koordinat "trapezoid", dibina daripada dua atau tiga koordinat daripada sistem koordinat padu. Oleh kerana kita mempunyai keadaan x + y + z = 0, koordinat ketiga tidak diperlukan. Koordinat paksi berguna untuk menyimpan peta dan memaparkan koordinat kepada pengguna. Seperti koordinat padu, anda boleh menggunakan operasi standard menambah, menolak, mendarab dan membahagi koordinat Cartesan.

Terdapat banyak sistem koordinat padu dan banyak sistem paksi. Saya tidak akan merangkumi setiap kombinasi dalam panduan ini. Saya akan memilih dua pembolehubah, q (lajur) dan r (baris). Dalam rajah dalam artikel ini, q sepadan dengan x dan r sepadan dengan z, tetapi surat-menyurat ini adalah sewenang-wenangnya kerana anda boleh memutar dan memutar rajah untuk mendapatkan surat-menyurat yang berbeza.

Kelebihan sistem ini berbanding grid anjakan ialah algoritma lebih mudah difahami. Kelemahan sistem ialah menyimpan kad segi empat tepat agak pelik; lihat bahagian menyimpan peta. Sesetengah algoritma adalah lebih jelas dalam koordinat padu, tetapi kerana kita mempunyai keadaan x + y + z = 0, kita boleh mengira koordinat tersirat ketiga dan menggunakannya dalam algoritma ini. Dalam projek saya, saya memanggil paksi q, r, s, jadi keadaan kelihatan seperti q + r + s = 0, dan saya boleh mengira s = -q - r apabila diperlukan.

gandar

Koordinat mengimbangi ialah perkara pertama yang difikirkan oleh kebanyakan orang kerana ia adalah sama dengan koordinat Cartesan standard yang digunakan untuk grid segi empat sama. Malangnya, salah satu daripada dua paksi mesti berjalan melawan bijirin, dan ini akhirnya merumitkan perkara. Sistem kubus dan paksi pergi jauh dan mempunyai algoritma yang lebih mudah, tetapi storan kad adalah lebih kompleks sedikit. Terdapat satu lagi sistem yang dipanggil "bergantian" atau "berdua", tetapi kami tidak akan mempertimbangkannya di sini; sesetengah mendapati ia lebih mudah untuk bekerja daripada padu atau paksi.


Koordinat mengimbangi, padu dan paksi

paksi ialah arah di mana koordinat yang sepadan semakin meningkat. Serenjang dengan paksi ialah garis di mana koordinat kekal malar. Rajah grid di atas menunjukkan garis serenjang.

Transformasi koordinat

Kemungkinan besar anda akan menggunakan koordinat paksi atau offset dalam reka bentuk anda, tetapi banyak algoritma lebih mudah dinyatakan dalam koordinat padu. Oleh itu, kita perlu dapat menukar koordinat antara sistem.

Koordinat paksi berkait rapat dengan koordinat padu, jadi penukaran adalah mudah:

# tukarkan koordinat padu kepada paksi q = x r = z # tukarkan koordinat paksi kepada padu x = q z = r y = -x-z
Dalam kod, kedua-dua fungsi ini boleh ditulis seperti berikut:

Fungsi cube_to_hex(h): # paksi var q = h.x var r = h.z return Hex(q, r) function hex_to_cube(h): # cubic var x = h.q var z = h.r var y = -x-z return Cube(x, y , z)
Koordinat offset agak rumit:

Heksagon bersebelahan

Diberi satu heksagon, apakah enam heksagon di sebelahnya? Seperti yang anda jangkakan, jawapannya adalah paling mudah dalam koordinat padu, agak mudah dalam koordinat paksi, dan sedikit lebih sukar dalam koordinat anjakan. Anda juga mungkin perlu mengira enam heksagon "pepenjuru".

Koordinat padu

Mengalihkan satu ruang dalam koordinat heks menyebabkan salah satu daripada tiga koordinat padu bertukar kepada +1 dan satu lagi kepada -1 (jumlah mesti kekal 0). Pada +1, tiga koordinat yang mungkin boleh berubah, dan pada -1, dua koordinat yang selebihnya. Ini memberi kita enam kemungkinan perubahan. Setiap satu sepadan dengan salah satu arah heksagon. Cara yang paling mudah dan terpantas adalah dengan membuat prakiraan perubahan dan meletakkannya ke dalam jadual koordinat padu Kubus(dx, dy, dz) pada masa penyusunan:

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

Koordinat paksi

Seperti sebelum ini, kami menggunakan sistem kubik untuk bermula. Mari kita ambil jadual Cube(dx, dy, dz) dan tukarkannya menjadi jadual 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(direction): return directions function hex_neighbor(hex, direction): var dir = hex_direction(direction) return Hex(hex.q + dir.q, hex.r + dir.r)

Koordinat mengimbangi

Dalam koordinat paksi, kami membuat perubahan bergantung pada tempat kami berada di grid. Jika kita berada dalam lajur/baris offset, maka peraturannya berbeza daripada kes lajur/baris tanpa ofset.

Seperti sebelum ini, kami mencipta jadual nombor yang perlu ditambah pada col dan row . Walau bagaimanapun, kali ini kita akan mempunyai dua tatasusunan, satu untuk lajur/baris ganjil dan satu lagi untuk yang genap. Lihat (1,1) dalam imej peta grid di atas dan perhatikan bagaimana kol dan baris berubah semasa anda bergerak dalam setiap enam arah. Sekarang mari kita ulangi proses untuk (2,2). Jadual dan kod akan berbeza untuk setiap empat jenis grid anjakan di sini ialah kod yang sepadan untuk setiap jenis grid.

Ganjil-r
var arah = [ [ 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): pariti var = hex.row & 1 var dir = arah kembali Hex(hex.col + dir.col, hex.row + dir.row)


Genap-r
var arah = [ [ 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): pariti var = hex.row & 1 var dir = arah kembali Hex(hex.col + dir.col, hex.row + dir.row)


Grid untuk baris genap (EVEN) dan ganjil (ODD).

Ganjil-q
var arah = [ [ 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): pariti var = hex.col & 1 var dir = arah kembali Hex(hex.col + dir.col, hex.row + dir.row)


genap-q
var arah = [ [ 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): pariti var = hex.col & 1 var dir = arah kembali Hex(hex.col + dir.col, hex.row + dir.row)


Grid untuk lajur genap (GENAP) dan ganjil (GANDA).

pepenjuru

Bergerak dalam ruang "pepenjuru" dalam koordinat hex menukar satu daripada tiga koordinat padu sebanyak ±2 dan dua lagi sebanyak ∓1 (jumlah mesti kekal 0).

Var pepenjuru = [ 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 kubus_pepenjuru_jiran(heks, arah): kembalikan kubus_tambah(heks, pepenjuru)
Seperti sebelum ini, kita boleh menukar koordinat ini kepada koordinat paksi dengan menjatuhkan salah satu daripada tiga koordinat, atau menukarnya kepada mengimbangi koordinat dengan mengira keputusan terlebih dahulu.


Jarak

Koordinat padu

Dalam sistem koordinat kubik, setiap heksagon ialah kubus dalam ruang tiga dimensi. Heksagon bersebelahan dijarakkan 1 di dalam grid heks, tetapi dijarakkan 2 di dalam grid kubus. Ini menjadikan pengiraan jarak menjadi mudah. Dalam grid segi empat sama, jarak Manhattan ialah abs(dx) + abs(dy) . Dalam grid kiub, jarak Manhattan ialah abs(dx) + abs(dy) + abs(dz) . Jarak dalam grid heksagon adalah sama dengan separuh daripadanya:

Fungsi kubus_jarak(a, b): kembali (abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z)) / 2
Setara dengan tatatanda ini adalah untuk mengatakan bahawa salah satu daripada tiga koordinat mestilah jumlah dua yang lain, dan kemudian ambil itu sebagai jarak. Anda boleh memilih bentuk separuh atau bentuk nilai maksimum di bawah, tetapi ia memberikan hasil yang sama:

Jarak_kubus fungsi(a, b): pulangan maks(abs(a.x - b.x), abs(a.y - b.y), abs(a.z - b.z))
Dalam rajah, nilai maksimum diserlahkan dalam warna. Perhatikan juga bahawa setiap warna mewakili salah satu daripada enam arah "pepenjuru".

GIF


Koordinat paksi

Dalam sistem paksi, koordinat ketiga dinyatakan secara tersirat. Mari kita tukar dari paksi ke kubik untuk mengira jarak:

Fungsi hex_distance(a, b): var ac = hex_to_cube(a) var bc = hex_to_cube(b) return cube_distance(ac, bc)
Jika pengkompil sebaris (sebaris) hex_to_cube dan cube_distance dalam kes anda, maka ia akan menjana kod seperti ini:

Fungsi hex_distance(a, b): kembali (abs(a.q - b.q) + abs(a.q + a.r - b.q - b.r) + abs(a.r - b.r)) / 2
Terdapat banyak cara yang berbeza untuk menulis jarak antara heksagon dalam koordinat paksi, tetapi tanpa mengira kaedah penulisan jarak antara heksagon dalam sistem paksi diekstrak daripada jarak Manhattan dalam sistem padu. Sebagai contoh, "perbezaan perbezaan" yang diterangkan 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 dan bukannya bentuk belah dua kubus_jarak . Kesemuanya adalah serupa jika anda melihat sambungan dengan koordinat padu.

Koordinat mengimbangi

Seperti koordinat paksi, kami menukar koordinat offset kepada koordinat padu dan kemudian menggunakan jarak padu.

Fungsi offset_distance(a, b): var ac = offset_to_cube(a) var bc = offset_to_cube(b) return cube_distance(ac, bc)
Kami akan menggunakan corak yang sama untuk kebanyakan algoritma: tukar daripada heksagon kepada kubus, jalankan versi kubik algoritma dan tukar hasil kubik kepada koordinat heksagon (koordinat paksi atau offset).

Melukis garisan

Bagaimana untuk melukis garisan dari satu heksagon ke yang lain? Saya menggunakan interpolasi linear untuk melukis garisan. Garisan itu disampel secara seragam pada titik N+1 dan dikira dalam heksagon mana sampel ini berada.

GIF


  1. Mula-mula kita mengira N, yang akan menjadi jarak dalam heksagon antara titik akhir.
  2. Kami kemudian sampel N+1 mata secara sama rata antara titik A dan B. Menggunakan interpolasi linear, kami menentukan bahawa untuk nilai i dari 0 hingga N termasuk mereka, setiap titik akan menjadi A + (B - A) * 1.0/N * i . Dalam rajah, titik kawalan ini ditunjukkan dalam warna biru. Hasilnya ialah koordinat titik terapung.
  3. Mari tukar setiap titik kawalan (terapung) kembali kepada heksagon (int). Algoritma dipanggil cube_round (lihat di bawah).
Letakkan semuanya bersama-sama untuk membuat garis dari A ke B:

Fungsi lerp(a, b, t): // untuk float return a + (b - a) * t function cube_lerp(a, b, t): // for hexagons return 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 = kubus_jarak(a, b) var keputusan = untuk setiap 0 ≤ i ≤ N: results.append( kiub_bulat(kubus_lerp(a, b, 1.0/N * i))) mengembalikan hasil
Nota:

  • Terdapat kes di mana cube_lerp mengembalikan titik yang betul-betul berada di tepi antara dua heksagon. Kemudian cube_round menggerakkannya ke satu arah atau yang lain. Garisan kelihatan lebih baik jika ia dialihkan ke satu arah. Ini boleh dilakukan dengan menambahkan Kubus "epsilon"-heksagon(1e-6, 1e-6, -2e-6) pada satu atau kedua-dua titik akhir sebelum memulakan gelung. Ini akan "mendorong" garisan dalam satu arah supaya ia tidak mengenai tepi.
  • Algoritma garisan DDA dalam grid segi empat sama menyamakan N dengan jarak maksimum sepanjang setiap paksi. Kami melakukan perkara yang sama dalam ruang padu, yang serupa dengan jarak dalam grid heksagon.
  • Fungsi cube_lerp harus mengembalikan kiub dengan koordinat apungan. Jika anda memprogramkan dalam bahasa yang ditaip secara statik, anda tidak akan dapat menggunakan jenis Cube. Anda boleh menentukan jenis FloatCube sebaliknya, atau sebaris fungsi dalam kod lukisan baris anda jika anda tidak mahu menentukan jenis lain.
  • Anda boleh mengoptimumkan kod dengan cube_lerp sebaris dan kemudian mengira B.x-A.x , B.x-A.y dan 1.0/N di luar gelung. Pendaraban boleh ditukar kepada penjumlahan berulang. Hasilnya akan menjadi sesuatu seperti algoritma baris DDA.
  • Saya menggunakan koordinat paksi atau padu untuk melukis garisan, tetapi jika anda ingin menggunakan koordinat mengimbangi, lihat .
  • Terdapat banyak pilihan untuk melukis garisan. Kadang-kadang "overcoating" diperlukan. Saya telah dihantar kod untuk melukis garisan tertutup super dalam heksagon, tetapi saya belum melihatnya lagi.

Julat bergerak

Julat koordinat

Diberi pusat heksagon dan julat N, heksagon manakah berada dalam N langkah daripadanya?

Kita boleh melakukan songsangan daripada formula jarak antara heksagon jarak = max(abs(dx), abs(dy), abs(dz)) . Untuk mencari semua heksagon dalam N kita perlukan max(abs(dx), abs(dy), abs(dz)) ≤ N . Ini bermakna ketiga-tiga nilai diperlukan: abs(dx) ≤ N dan abs(dy) ≤ N dan abs(dz) ≤ N . Mengalih keluar nilai mutlak, kita mendapat -N ≤ dx ≤ N dan -N ≤ dy ≤ N dan -N ≤ dz ≤ N . Dalam kod ini akan menjadi gelung bersarang:

Keputusan Var = untuk setiap -N ≤ dx ≤ N: untuk setiap -N ≤ dy ≤ N: untuk setiap -N ≤ dz ≤ N: jika dx + dy + dz = 0: hasil. tambah(kubus_tambah(pusat, Kiub(dx , dy, dz)))
Kitaran ini akan berfungsi, tetapi ia akan menjadi agak tidak berkesan. Daripada semua nilai dz yang kita gelungkan, hanya satu yang benar-benar memenuhi keadaan kubus dx + dy + dz = 0. Sebaliknya, kami akan mengira secara langsung nilai dz yang memenuhi syarat:

Keputusan Var = untuk setiap -N ≤ dx ≤ N: untuk setiap max(-N, -dx-N) ≤ dy ≤ min(N, -dx+N): var dz = -dx-dy results.append(cube_add( pusat, Kiub(dx, dy, dz)))
Kitaran ini hanya melalui koordinat yang diperlukan. Dalam rajah, setiap julat ialah sepasang garis. Setiap baris adalah ketaksamaan. Kami mengambil semua heksagon yang memenuhi enam ketaksamaan.

GIF


Julat bertindih

Jika anda perlu mencari heksagon yang berada dalam berbilang julat, anda boleh memotong julat sebelum menjana senarai heksagon.

Anda boleh mendekati masalah ini dari sudut algebra atau geometri. Secara algebra, setiap rantau dinyatakan sebagai keadaan ketaksamaan dalam bentuk -N ≤ dx ≤ N , dan kita perlu mencari persilangan keadaan ini. Dari segi geometri, setiap rantau ialah kiub dalam ruang 3D, dan kami akan bersilang dua kiub dalam ruang 3D untuk mendapatkan kuboid dalam ruang 3D. Kami kemudian menayangnya semula pada satah x + y + z = 0 untuk mendapatkan heksagon. Saya akan menyelesaikan masalah ini secara algebra.

Mula-mula, kita tulis semula keadaan -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 perkara yang sama untuk y dan z, menghasilkan bentuk umum kod dari bahagian sebelumnya:

Keputusan Var = untuk setiap xmin ≤ x ≤ xmaks: untuk setiap maks(ymin, -x-zmaks) ≤ y ≤ min(ymaks, -x-zmin): var z = -x-y hasil.tambah(Kubus(x, y, z))
Persilangan dua julat a ≤ x ≤ b dan c ≤ x ≤ d ialah maks(a, c) ≤ x ≤ min(b, d) . Oleh kerana luas heksagon dinyatakan sebagai julat atas x, y, z, kita boleh bersilang setiap julat x, y, z secara berasingan dan kemudian menggunakan gelung bersarang untuk menjana senarai heksagon dalam persimpangan itu. Untuk satu kawasan heksagon kita ambil x min = H.x - N dan x max = H.x + N , begitu juga untuk y dan z . Untuk persilangan dua kawasan heksagon, kita ambil x min = max(H1.x - N, H2.x - N) dan x max = min(H1.x + N, H2.x + N), begitu juga untuk y dan z . Corak yang sama berfungsi untuk persimpangan tiga atau lebih kawasan.

GIF


Halangan

Sekiranya terdapat halangan, cara paling mudah ialah mengisi dengan had jarak (carian lebar-pertama). Dalam rajah di bawah kita mengehadkan diri kita kepada empat pergerakan. Dalam kod, pinggir[k] ialah tatasusunan semua heksagon yang boleh dicapai dalam k langkah. Setiap kali kami melalui gelung utama, kami mengembangkan tahap k-1 dengan tahap k.

Fungsi cube_reachable(start, movement): var visited = set() add start to visited 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

Berpusing

Memandangkan vektor heksagon (perbezaan antara dua heksagon), kita mungkin perlu memutarkannya supaya ia menghala ke heksagon yang lain. Ini mudah dilakukan dengan koordinat padu jika anda berpegang pada putaran 1/6 bulatan.

Putaran 60° ke kanan menggerakkan setiap koordinat satu kedudukan ke kanan:

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

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



“Setelah bermain” [dalam artikel asal] dengan gambar rajah, anda boleh melihat bahawa setiap putaran ialah 60° perubahan tanda dan secara fizikal "memutar" koordinat. Selepas putaran 120°, tanda-tanda menjadi sama semula. Putaran 180° menukar tanda, tetapi koordinat kembali ke kedudukan asalnya.

Berikut ialah urutan lengkap putaran kedudukan P di sekeliling kedudukan pusat C, menghasilkan kedudukan baharu R:

  1. Tukarkan kedudukan P dan C kepada koordinat padu.
  2. Mengira vektor dengan menolak pusat: P_from_C = P - C = Kubus(P.x - C.x, P.y - C.y, P.z - C.z) .
  3. Putar vektor P_from_C seperti yang diterangkan di atas dan tetapkan vektor akhir sebutan R_from_C .
  4. Menukarkan vektor kembali ke kedudukan dengan menambah 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. Menukarkan kedudukan padu R kembali kepada sistem koordinat yang dikehendaki.
Terdapat beberapa peringkat transformasi, tetapi setiap daripada mereka agak mudah. Anda boleh memendekkan beberapa langkah ini dengan mentakrifkan putaran secara langsung dalam koordinat paksi, tetapi vektor hex tidak berfungsi dengan koordinat offset dan saya tidak tahu cara memendekkan langkah untuk koordinat offset. Lihat juga perbincangan mengenai stackexchange untuk cara lain mengira putaran.

cincin

Cincin ringkas

Untuk mengetahui sama ada heksagon tertentu tergolong dalam cincin jejari jejari tertentu, anda perlu mengira jarak dari heksagon ini ke pusat, dan mengetahui sama ada ia sama dengan jejari. Untuk mendapatkan senarai semua heksagon tersebut, anda perlu mengambil langkah jejari dari tengah, dan kemudian ikut vektor yang diputar di sepanjang laluan sepanjang gelang.

Fungsi cube_ring(center, radius): var results = # kod ini tidak berfungsi untuk radius == 0; awak faham kenapa? var kiub = kiub_tambah(pusat, kiub_skala(kubus_arah(4), jejari)) untuk setiap 0 ≤ i< 6: for each 0 ≤ j < radius: results.append(cube) cube = cube_neighbor(cube, i) return results
Dalam kod ini, kubus bermula pada gelang, ditunjukkan dengan anak panah besar dari tengah ke penjuru rajah. Saya memilih sudut 4 untuk bermula kerana ia sepadan dengan laluan nombor arah saya bergerak. Anda mungkin memerlukan sudut permulaan yang berbeza. Pada setiap peringkat gelung dalam, kubus menggerakkan satu heksagon mengelilingi gelang. Selepas 6 * langkah jejari dia berakhir di tempat dia bermula.


Cincin lingkaran

Dengan melalui cincin dalam corak lingkaran, kita boleh mengisi bahagian dalam cincin:

Fungsi cube_spiral(pusat, jejari): var keputusan = untuk setiap 1 ≤ k ≤ jejari: keputusan = keputusan + kiub_cincin(pusat, k) kembalikan hasil



Luas heksagon besar ialah hasil tambah semua bulatan ditambah 1 untuk pusat. Gunakan formula ini untuk mengira luas.

Merentasi heksagon dengan cara ini juga boleh digunakan untuk mengira julat pergerakan (lihat di atas).

Kawasan penglihatan

Apakah yang boleh dilihat dari kedudukan tertentu pada jarak tertentu, dan tidak disekat oleh halangan? Cara paling mudah untuk menentukan ini adalah dengan melukis garisan kepada setiap heksagon dalam julat tertentu. Jika garisan tidak memenuhi dinding, maka anda melihat heksagon. Gerakkan tetikus anda ke atas heksagon [pada gambar rajah dalam artikel asal] untuk melihat cara garisan dilukis ke heksagon ini dan dinding yang bertemu dengan garisan.

Algoritma ini boleh menjadi perlahan di kawasan yang besar, tetapi ia mudah dilaksanakan, jadi saya cadangkan bermula dengannya.

GIF



Terdapat banyak definisi keterlihatan yang berbeza. Adakah anda ingin melihat pusat heksagon lain dari pusat heksagon asal? Adakah anda mahu melihat mana-mana bahagian heksagon lain dari tengah bahagian asal? Mungkin mana-mana bahagian heksagon lain dari mana-mana titik yang awal? Halangan yang menghalang pandangan anda adalah lebih kecil daripada heksagon penuh? Skop adalah konsep yang lebih rumit dan lebih pelbagai daripada yang kelihatan pada pandangan pertama. Mari kita mulakan dengan algoritma yang paling mudah, tetapi jangkakan bahawa ia pasti akan mengira jawapan dengan betul dalam projek anda. Malah ada kes apabila algoritma mudah menghasilkan keputusan yang tidak logik.

Saya ingin mengembangkan panduan ini pada masa hadapan. saya ada