Düzenli altıgen yapısı - altıgen nasıl çizilir. Düzenli altıgen nasıl yapılır Kurşun kalemle altıgen nasıl çizilir

Yakınınızda kalem var mı? Enine kesitine bir bakın - bu normal bir altıgen veya aynı zamanda altıgen olarak da adlandırıldığı gibi. Bir somunun, altıgen bir satranç alanının, bazı karmaşık karbon moleküllerinin (örneğin grafit), bir kar tanesinin, bir bal peteğinin ve diğer nesnelerin kesiti de bu şekle sahiptir. Yakın zamanda dev bir düzenli altıgen keşfedildi. Doğanın, yaratımlarında bu özel şekle sahip yapıları bu kadar sıklıkla kullanması tuhaf görünmüyor mu? Hadi daha yakından bakalım.

Düzenli altıgen, altı eşit kenarı ve eşit açıları olan bir çokgendir. Okul kursundan aşağıdaki özelliklere sahip olduğunu biliyoruz:

  • Kenarlarının uzunluğu, çevrelenen dairenin yarıçapına karşılık gelir. Hepsinden yalnızca normal altıgen bu özelliğe sahiptir.
  • Açılar birbirine eşittir ve her ölçü 120°'dir.
  • Bir altıgenin çevresi, çevresinde tanımlanan dairenin yarıçapı biliniyorsa P=6*R formülü kullanılarak veya dairenin içinde yazılıysa P=4*√(3)*r formülü kullanılarak bulunabilir. R ve r, çevrelenmiş ve yazılı dairenin yarıçaplarıdır.
  • Düzgün altıgenin kapladığı alan şu şekilde belirlenir: S=(3*√(3)*R 2)/2. Yarıçap bilinmiyorsa, kenarlardan birinin uzunluğunu değiştirin - bilindiği gibi, çevrelenen dairenin yarıçapının uzunluğuna karşılık gelir.

Düzenli bir altıgenin ilginç bir özelliği vardır, bu sayede doğada çok yaygın hale gelmiştir - bir düzlemin herhangi bir yüzeyini örtüşmeler veya boşluklar olmadan doldurabilmektedir. Hatta bir tarafı 1/√(3)'e eşit olan normal bir altıgenin evrensel bir örtü olduğu, yani bir birim çapındaki herhangi bir seti kapsayabildiğini söyleyen Pal lemma bile var. .

Şimdi düzgün bir altıgen oluşturmaya bakalım. En basiti pusula, kurşun kalem ve cetvel kullanmayı içeren birkaç yöntem vardır. Önce pergelle rastgele bir daire çiziyoruz, sonra bu dairenin üzerinde rastgele bir yere nokta koyuyoruz. Pusulanın açısını değiştirmeden ucunu bu noktaya yerleştirip daire üzerinde bir sonraki çentiği işaretliyoruz ve 6 noktanın tamamını alana kadar buna devam ediyoruz. Şimdi geriye kalan tek şey onları düz parçalarla birbirine bağlamak ve istediğiniz rakamı elde edeceksiniz.

Uygulamada büyük bir altıgen çizmenin gerekli olduğu durumlar vardır. Örneğin, iki seviyeli bir alçıpan tavanda, merkezi avizenin montaj yerinin çevresine, alt seviyeye altı küçük lamba takmanız gerekir. Bu büyüklükteki pusulaları bulmak çok ama çok zor olacak. Bu durumda ne yapmalı? Büyük bir daireyi nasıl çizersiniz? Çok basit. Gerekli uzunlukta güçlü bir iplik almanız ve uçlarından birini kalemin karşısına bağlamanız gerekir. Artık geriye sadece ipliğin ikinci ucunu tavana istenilen noktada bastıracak bir asistan bulmak kalıyor. Elbette bu durumda küçük hatalar mümkündür, ancak bunların dışarıdan biri tarafından fark edilmesi pek olası değildir.

İçerik:

Mükemmel altıgen olarak da adlandırılan normal altıgen, altı eşit kenara ve altı eşit açıya sahiptir. Bir mezura ve açıölçerle bir altıgen, yuvarlak bir nesne ve bir cetvelle kaba bir altıgen veya sadece bir kalem ve biraz sezgiyle daha da kaba bir altıgen çizebilirsiniz. Altıgenin farklı şekillerde nasıl çizileceğini öğrenmek istiyorsanız okumaya devam edin.

Adımlar

1 Pusula kullanarak mükemmel bir altıgen çizin

  1. 1 Pusula kullanarak bir daire çizin. Kalemi pusulaya yerleştirin. Pusulayı dairenizin istenen yarıçap genişliğine kadar uzatın. Yarıçap birkaç ila on santimetre genişliğinde olabilir. Daha sonra kağıdın üzerine bir pusula ve kalem koyun ve bir daire çizin.
    • Bazen önce dairenin yarısını, sonra diğer yarısını çizmek daha kolaydır.
  2. 2 Pusula iğnesini dairenin kenarına getirin. Dairenin üstüne yerleştirin. Pusulanın açısını veya konumunu değiştirmeyin.
  3. 3 Dairenin kenarına küçük bir kalem işareti yapın. Belirgin yapın ancak daha sonra sileceğiniz için çok koyu olmasın. Pusula için ayarladığınız açıyı korumayı unutmayın.
  4. 4 Pusula iğnesini az önce yaptığınız işarete getirin.İğneyi doğrudan işaretin üzerine yerleştirin.
  5. 5 Dairenin kenarına başka bir kalem işareti yapın. Bu şekilde ilk işaretten belli bir mesafede ikinci bir işaret yapacaksınız. Bir yönde ilerlemeye devam edin.
  6. 6 Dört işaret daha yapmak için aynı yöntemi kullanın. Orijinal işarete geri dönmelisiniz. Değilse, büyük ihtimalle pusulayı tuttuğunuz ve işaretlediğiniz açı değişmiştir. Bu, onu çok sıktığınız veya tam tersine biraz gevşettiğiniz için olmuş olabilir.
  7. 7 İşaretleri bir cetvel kullanarak bağlayın.İşaretlerinizin dairenin kenarıyla kesiştiği altı yer, altıgenin altı köşesidir. Bir cetvel ve kalem kullanarak bitişik işaretleri birleştiren düz çizgiler çizin.
  8. 8 Daireyi, dairenin kenarlarındaki işaretleri ve yaptığınız diğer işaretleri silin. Tüm inşaat çizgilerini sildikten sonra mükemmel altıgeniniz hazır olmalıdır.

2 Yuvarlak bir nesne ve bir cetvel kullanarak kaba bir altıgen çizin

  1. 1 Camın kenarını kalemle çizin. Bu şekilde bir daire çizeceksiniz. Kurşun kalemle çizmek çok önemlidir, çünkü daha sonra tüm yardımcı çizgileri silmeniz gerekecektir. Ayrıca ters bir camın, kavanozun veya yuvarlak tabanlı herhangi bir şeyin izini sürebilirsiniz.
  2. 2 Dairenizin ortasından geçen yatay çizgiler çizin. Bir cetvel, bir kitap, düz kenarı olan herhangi bir şey kullanabilirsiniz. Cetveliniz varsa dairenin dikey uzunluğunu hesaplayıp ikiye bölerek ortasını işaretleyebilirsiniz.
  3. 3 Dairenin yarısının üzerine bir "X" çizerek onu altı eşit parçaya bölün. Zaten dairenin ortasından geçen bir çizgi çizdiğiniz için, parçaların eşit olması için X'in yüksekliğinden daha geniş olması gerekiyor. Bir pizzayı altı parçaya böldüğünüzü hayal edin.
  4. 4 Her bölümden üçgenler yapın. Bunu yapmak için, her bölümün kavisli kısmının altına bir cetvel kullanarak düz bir çizgi çizin ve bunu diğer iki çizgiye bağlayarak bir üçgen oluşturun. Bunu kalan beş bölümle yapın. Bunu pizza dilimlerinizin etrafında bir kabuk oluşturmak gibi düşünün.
  5. 5 Tüm yardımcı hatları silin. Kılavuz çizgileri dairenizi, dairenizi bölümlere ayıran üç çizgiyi ve yol boyunca yaptığınız diğer işaretleri içerir.

3 Bir kalem kullanarak kaba bir altıgen çizin

  1. 1 Yatay bir çizgi çizin. Cetvelsiz düz bir çizgi çizmek için yatay çizginizin başlangıç ​​ve bitiş noktasını çizmeniz yeterlidir. Daha sonra kalemi başlangıç ​​noktasına yerleştirin ve çizgiyi sonuna kadar çizin. Bu çizginin uzunluğu yalnızca birkaç santimetre olabilir.
  2. 2 Yatay olanın uçlarından iki çapraz çizgi çizin. Sol taraftaki çapraz çizgi, sağdaki çapraz çizgiyle aynı şekilde dışarıya doğru bakmalıdır. Bu çizgilerin yatay çizgiye göre 120 derecelik bir açı oluşturduğunu düşünebilirsiniz.
  3. 3 İçe doğru çizilen ilk yatay çizgiden gelen iki yatay çizgi daha çizin. Bu, ilk iki çapraz çizginin ayna görüntüsünü yaratacaktır. Sol alt çizgi, sol üst çizginin bir yansıması olmalı ve sağ alt çizgi, sağ üst çizginin bir yansıması olmalıdır. Üstteki yatay çizgiler dışarıya doğru bakmalı, alttakiler ise tabana doğru içeriye bakmalıdır.
  4. 4 Alttaki iki çapraz çizgiyi birleştiren başka bir yatay çizgi çizin. Bu şekilde altıgeninizin tabanını çizeceksiniz. İdeal olarak bu çizgi üstteki yatay çizgiye paralel olmalıdır. Artık altıgeninizi tamamladınız.
  • Çok geniş işaretlerden kaynaklanan hataları en aza indirmek için kalem ve pusulanın keskin olması gerekir.
  • Pusula yöntemini kullanırken altı işaretin tümü yerine her işareti birleştirirseniz eşkenar üçgen elde edersiniz.

Uyarılar

  • Pusula oldukça keskin bir nesnedir, ona çok dikkat edin.

Çalışma prensibi

  • Her yöntem, yarıçapı tüm kenarların uzunluğuna eşit olan altı eşkenar üçgenden oluşan bir altıgen çizmenize yardımcı olacaktır. Çizilen altı yarıçap aynı uzunluktadır ve pusulanın genişliği değişmediği için altıgeni oluşturan tüm çizgiler de aynı uzunluktadır. Altı üçgen eşkenar olduğundan köşeleri arasındaki açılar 60 derecedir.

Neye ihtiyacınız olacak?

  • Kağıt
  • Kalem
  • Cetvel
  • Pusula çifti
  • Pusula iğnesinin kaymasını önlemek için kağıdın altına yerleştirilebilecek bir şey.
  • Silgi

Düzenli çevrelenmiş bir üçgen aşağıdaki gibi oluşturulur(Şekil 38). Belirli bir yarıçap dairesinin merkezinden R1 yarıçapı olan bir daire çizin R2 = 2R1 ve üç eşit parçaya bölüyoruz. Bölüm noktaları A, B, C yarıçaplı bir daire etrafında çevrelenmiş normal bir üçgenin köşeleridir R1 .

Şekil 38

Düzenli çevrelenmiş dörtgen (kare) pergel ve cetvel kullanılarak oluşturulabilir (Şekil 39). Belirli bir dairede karşılıklı olarak dik iki çap çizilir. Çapların daire ile kesişme noktaları merkez alınarak dairenin yarıçapı R Yayları belirli noktalarda birbirleriyle kesişene kadar tanımlayın A,B,C,D . Puanlar A , B , C , D ve belirli bir daire etrafında çevrelenmiş bir karenin köşeleridir.

Şekil 39

Düzenli çevrelenmiş altıgen oluşturmak içinÖncelikle açıklanan karenin köşelerini yukarıda belirtilen şekilde oluşturmak gerekir (Şekil 40, a). Karenin köşelerinin belirlenmesiyle eşzamanlı olarak belirli bir yarıçaplı daire R noktalarda altı eşit parçaya bölünür 1, 2, 3, 4, 5, 6 ve karenin dikey kenarlarını çizin. Bölme noktalarından bir daire çizmek 2–5 Ve 3–6 karenin dikey kenarlarıyla kesişene kadar düz çizgiler (Şekil 40, b), köşeleri elde ederiz A, B, D, E düzenli altıgen tanımladı.

Şekil 40

Diğer zirveler C Ve F yarıçaplı bir dairenin yayı kullanılarak belirlenir O.A. belirli bir dairenin dikey çapının devamı ile kesişene kadar gerçekleştirilir.
3 EŞLEŞME

Farklı konumlarda altıgen bir prizmanın nasıl çizileceğini öğrenelim.

Düzenli bir altıgen oluşturmanın farklı yollarını inceleyin, altıgen çizimleri yapın, yapılarının doğruluğunu kontrol edin. Altıgenlere dayanarak altıgen prizmalar oluşturun.

Şekil 2'deki altıgen prizmayı düşünün. 3.52 ve Şekil 2'deki dik izdüşümleri. 3.53. Altıgen prizmanın (altıgen) tabanında düzenli altıgenler bulunur, yan yüzleri aynı dikdörtgenlerdir. Bir altıgeni perspektifte doğru şekilde tasvir etmek için, öncelikle tabanını perspektifte doğru şekilde nasıl tasvir edeceğinizi öğrenmelisiniz (Şekil 3.54). Şekil 2'deki altıgende. 3,55 köşe, birden altıya kadar sayılarla belirtilir. 1 ve 3, 4 ve 6 noktalarını dikey düz çizgilerle birleştirirseniz, bu düz çizgilerin dairenin merkez noktasıyla birlikte 5 - 2 çapını dört eşit parçaya böldüğünü fark edeceksiniz (bu bölümler yaylarla gösterilir). ). Bir altıgenin karşıt kenarları birbirine ve merkezinden geçen ve iki köşeyi birleştiren bir çizgiye paraleldir (örneğin, 6 - 1 ve 4 - 3 kenarları 5 - 2 çizgisine paraleldir). Bu gözlemler perspektifte bir altıgen oluşturmanıza ve bu yapının doğruluğunu kontrol etmenize yardımcı olacaktır. Bir gösterimden düzenli bir altıgen oluşturmanın iki yolu vardır: çevrel çembere dayalı ve kareye dayalı.

Sınırlandırılmış bir daireye dayanmaktadır. Şek. 3.56. Düzgün bir altıgenin tüm köşeleri, yarıçapı altıgenin kenarına eşit olan bir çevrel çembere aittir.


Yatay altıgen. Rastgele açılan yatay bir elips, yani perspektifte çevrelenmiş bir daire çizin. Şimdi üzerinde altıgenin köşeleri olan altı nokta bulmanız gerekiyor. Belirli bir dairenin herhangi bir çapını merkezinden çizin (Şekil 3.57). Elips üzerinde yer alan çapın en uç noktaları - 5 ve 2, altıgenin köşeleridir. Kalan köşeleri bulmak için bu çapı dört eşit parçaya bölmek gerekir. Çap zaten dairenin merkez noktası tarafından iki yarıçapa bölünmüştür; geriye kalan tek şey her yarıçapı ikiye bölmektir. Perspektif çizimde dört parçanın tümü izleyiciden uzaklaştıkça eşit şekilde daralır (Şekil 3.58). Şimdi yarıçapların orta noktalarından - A ve B noktaları - 5 - 2 düz çizgisine dik düz çizgiler çizin. Yönlerini, 5 ve 2 noktalarındaki elipse teğetleri kullanarak bulabilirsiniz (Şekil 3.59). Bu teğetler 5 - 2 çapına dik olacak, bu teğetlere paralel A ve B noktalarından çizilen çizgiler de 5 - 2 doğrusuna dik olacaktır. Bu doğruların elips ile kesişiminde elde edilen noktaları şu şekilde belirtin: 1, 3, 4, 6 ( Şekil 3.60). Altı köşenin tamamını düz çizgilerle bağlayın (Şekil 3.61).

İnşaatınızın doğruluğunu farklı şekillerde kontrol edin. Yapı doğruysa, altıgenin karşıt köşelerini birleştiren çizgiler dairenin merkezinde kesişir (Şekil 3.62) ve altıgenin karşıt kenarları karşılık gelen çaplara paraleldir (Şekil 3.63). Başka bir kontrol yöntemi Şekil 2'de gösterilmektedir. 3.64.

Dikey altıgen. Böyle bir altıgende, 7 ve 3, b ve 4 noktalarını birleştiren düz çizgiler ve ayrıca 5 ve 2 noktalarında çevrelenen daireye teğet olan çizgiler dikey bir yöne sahiptir ve bunu perspektif çizimde korur. Böylece elipse iki dikey teğet çizerek 5 ve 2 noktalarını (teğet noktaları) buluruz. Bunları düz bir çizgiyle bağlayın ve ardından ortaya çıkan çapı 5 - 2, perspektif azalmalarını dikkate alarak 4 eşit parçaya bölün (Şekil 3.65). A ve B noktalarından dikey çizgiler çizin ve bunların elips ile kesiştiği noktada 1,3,6l4 noktalarını bulun. Daha sonra 1 - 6 arasındaki noktaları sırayla düz çizgilerle bağlayın (Şekil 3.66). Altıgen yapının doğruluğunu önceki örnekte olduğu gibi kontrol edin.

Bir altıgen oluşturmanın tarif edilen yöntemi, bu rakamı, perspektifte tasvir edilmesi belirli oranlarda bir kareden daha kolay olan bir daireye dayanarak elde etmemizi sağlar. Bu nedenle, altıgen oluşturmanın bu yöntemi en doğru ve evrensel gibi görünmektedir. Kare bazlı yapım yöntemi, çizimde zaten bir küp olması durumunda, yani karenin oranları ve kenarlarının yönü belirlendiğinde altıgenin tasvir edilmesini kolaylaştırır.

Bir kareye dayanmaktadır. Şek. 3.67. Bir karenin içine yazılan bir altıgen, karenin yatay yönde 5 - 2 kenarına eşittir ve dikey yönde uzunluğundan küçüktür.

Dikey altıgen. Perspektifte dikey bir kare çizin. Yatay kenarlarına paralel köşegenlerin kesişiminden düz bir çizgi çizin. Ortaya çıkan 5 - 2 numaralı segmenti dört eşit parçaya bölün ve A ve B noktalarından dikey çizgiler çizin (Şekil 3.68). Altıgeni üstten ve alttan sınırlayan çizgiler karenin kenarlarıyla örtüşmemektedir. Bunları karenin yatay kenarlarından belirli bir mesafede (1114 a) ve onlara paralel olarak çizin. Bu şekilde bulunan 1 ve 3 numaralı noktaları 2 numaralı noktaya, 6 ve 4 numaralı noktaları 5 numaralı noktaya bağlayarak bir altıgen elde ederiz (Şekil 3.69).

Aynı sırayla yatay bir altıgen inşa edilir (Şekil 3.70 ve 3.71).

Bu yapım yöntemi yalnızca yeterli açıklığa sahip altıgenler için uygundur. Altıgenin açıklığı önemsizse, çevrelenmiş daireye dayalı yöntemi kullanmak daha iyidir. Bir kareden oluşan altıgeni kontrol etmek için zaten bildiğiniz yöntemleri kullanabilirsiniz.

Ek olarak, ortaya çıkan altıgenin etrafındaki bir daireyi tanımlamanın başka bir yolu daha var (çiziminizde - bir elips). Altıgenin tüm köşeleri bu elipse ait olmalıdır.

Altıgen çizme becerilerinde ustalaştıktan sonra altıgen prizma çizmeye geçmekte özgür olacaksınız. Şekil 2'deki şemaya dikkatlice bakın. 3.72'nin yanı sıra, çevrelenmiş bir daireye (Şekil 3.73; 3.74 ve 3.75) ve bir kareye (Şekil 3.76; 3.77 ve 3.78) dayalı altıgen prizmalar oluşturmaya yönelik diyagramlar. Dikey ve yatay altıgenleri farklı şekillerde çizin. Dikey altıgen çiziminde yan yüzlerin uzun kenarları birbirine paralel dikey düz çizgiler olacak ve taban altıgeni ufuk çizgisinden uzaklaştıkça daha açık olacaktır. Yatay bir altıgenin çiziminde, yan yüzlerin uzun kenarları ufuktaki ufuk noktasında birleşecek ve bakandan uzaklaştıkça taban altıgenin açıklığı daha büyük olacaktır. Bir altıgeni tasvir ederken, her iki tabanın paralel kenarlarının perspektifte birleştiğinden de emin olun (Şekil 3.79; 3.80).

Bazı oyunlarda altıgen ızgaralar (altıgen ızgaralar) kullanılır ancak bunlar dikdörtgen ızgaralar kadar basit veya yaygın değildir. Yaklaşık 20 yıldır hex mesh'ler üzerine kaynak topluyorum ve bu kılavuzu en basit kodda uygulanan en şık yaklaşımlara göre yazdım. Bu makale Charles Fu ve Clark Verbrugge'un kılavuzlarından geniş ölçüde yararlanmaktadır. Altıgen ağlar oluşturmanın farklı yollarını, bunların ilişkilerini ve en yaygın algoritmaları anlatacağım. Bu makalenin birçok bölümü etkileşimlidir: bir ızgara türü seçildiğinde ilgili diyagramlar, kodlar ve metinler değişir. (Not: bu sadece orijinal için geçerlidir, incelemenizi tavsiye ederim. Çeviride orijinalin tüm bilgileri korunur, ancak etkileşim yoktur.).

Makaledeki kod örnekleri sözde kodla yazılmıştır, böylece kendi uygulamanızı yazabilmeniz için okunması ve anlaşılması daha kolaydır.

Geometri

Altıgenler altı kenarlı çokgenlerdir. Normal altıgenlerin tüm kenarları (kenarları) aynı uzunluktadır. Sadece normal altıgenlerle çalışacağız. Tipik olarak altıgen ağlar yatay (sivri üst) ve dikey (düz üst) yönlendirmeleri kullanır.


Düz (sol) ve keskin (sağ) üst kısımlara sahip altıgenler

Altıgenlerin 6 yüzü vardır. Her yüz iki altıgen için ortaktır. Altıgenlerin 6 köşe noktası vardır. Her köşe noktası üç altıgen için ortaktır. Kafes parçaları (kareler, altıgenler ve üçgenler) hakkındaki makalemde merkezler, kenarlar ve köşe noktaları hakkında daha fazla bilgi edinebilirsiniz.

Açılar

Düzgün altıgenin iç açıları 120°'dir. Her biri iç açıları 60° olan bir eşkenar üçgen olan altı "kama" vardır. Köşe noktası Ben merkez merkezden (60° * i) + 30° birim uzaklıkta bulunmaktadır. Kodda:

Fonksiyon hex_corner(center, size, i): var angle_deg = 60 * i + 30 var angle_rad = PI / 180 * angle_deg return Point(center.x + size * cos(angle_rad), center.y + size * sin(angle_rad) )
Bir altıgeni doldurmak için çokgenin köşelerini hex_corner(…, 0) ile hex_corner(…, 5) arasında almanız gerekir. Altıgenin ana hatlarını çizmek için bu köşeleri kullanmanız ve ardından hex_corner(..., 0) içinde çizgiyi tekrar çizmeniz gerekir.

İki yönelim arasındaki fark, x ve y'nin yer değiştirmesi ve bunun sonucunda açıların değişmesidir: düz tepeli altıgenlerin açıları 0°, 60°, 120°, 180°, 240°, 300°'dir ve sivri uçludur. altıgenlerin açıları 30°, 90°, 150°, 210°, 270°, 330°'dir.


Düz ve keskin üst kısımlara sahip altıgen köşeler

Boyut ve konum

Şimdi birkaç altıgeni bir araya yerleştirmek istiyoruz. Yatay yönde altıgenin yüksekliği yükseklik = boyut * 2'dir. Bitişik altıgenler arasındaki dikey mesafe dikey = yükseklik * 3/4'tür.

Altıgen genişlik genişlik = sqrt(3)/2 * yükseklik . Bitişik altıgenler arasındaki yatay mesafe yatay = genişliktir.

Bazı oyunlar altıgenler için normal altıgenlerle tam olarak eşleşmeyen piksel sanatı kullanır. Bu bölümde açıklanan açı ve yerleştirme formülleri bu tür altıgenlerin boyutlarıyla eşleşmeyecektir. Altıgen ağ algoritmalarını açıklayan makalenin geri kalanı, altıgenler hafifçe gerilmiş veya ezilmiş olsa bile geçerlidir.



Koordinat sistemleri

Altıgenleri bir ızgara halinde birleştirmeye başlayalım. Karelerden oluşan ızgaralar söz konusu olduğunda, birleştirmenin tek bir belirgin yolu vardır. Altıgenler için birçok yaklaşım vardır. Birincil gösteriminiz olarak kübik koordinatları kullanmanızı öneririm. Haritaları depolamak ve koordinatları kullanıcıya görüntülemek için eksenel koordinatlar veya ofset koordinatları kullanılmalıdır.

Ofset koordinatları

En yaygın yaklaşım, sonraki her sütunu veya satırı dengelemektir. Sütunlar col veya q olarak belirtilir. Satırlar satır veya r ile gösterilir. Tek veya çift sütunları/satırları kaydırabilirsiniz; böylece yatay ve dikey altıgenlerin her birinin iki seçeneği vardır.


Yatay düzenleme "tek-r"


Yatay düzenleme “çift-r”


Dikey "tek-q" düzenlemesi


Dikey düzenleme “çift-q”

Kübik koordinatlar

Altıgen ızgaralara bakmanın başka bir yolu da onları şu şekilde görmektir: üç ana eksenler, değil iki karelerden oluşan ızgaralarda olduğu gibi. Zarif bir simetri sergiliyorlar.

Küplerden oluşan bir ızgara alalım ve hadi keselim x + y + z = 0'daki çapraz düzlem. Bu garip bir fikir ama altıgen ağ algoritmalarını basitleştirmemize yardımcı olacak. Özellikle, Kartezyen koordinatlardan standart işlemleri kullanabileceğiz: koordinatların toplanması ve çıkarılması, skaler bir büyüklükle çarpma ve bölmenin yanı sıra mesafeler.

Küplerin oluşturduğu ızgaradaki üç ana eksene ve bunların altı eksenle ilişkilerine dikkat edin. diyagonal altıgen ızgaranın yönleri. Izgaranın çapraz eksenleri altıgen ızgaranın ana yönüne karşılık gelir.


Altıgenler


küpler

Kare ve küp ağlar için zaten algoritmalarımız olduğundan, kübik koordinatları kullanmak bu algoritmaları altıgen ağlara uyarlamamıza olanak tanır. Bu sistemi makalenin algoritmalarının çoğu için kullanacağım. Algoritmaları farklı bir koordinat sistemiyle kullanmak için kübik koordinatları dönüştürüyorum, algoritmayı çalıştırıyorum ve sonra bunları geri dönüştürüyorum.

Altıgen ağ için kübik koordinatların nasıl çalıştığını öğrenin. Altıgenleri seçtiğinizde üç eksene karşılık gelen kübik koordinatlar vurgulanır.

  1. Küp ızgarasının her yönü şuna karşılık gelir: çizgiler altıgenlerden oluşan bir ızgara üzerinde. Bağlantıyı görmek için z'si 0, 1, 2, 3'e eşit olan bir altıgen seçmeyi deneyin. Çizgi mavi renkle işaretlenmiştir. Aynısını x (yeşil) ve y (mor) için de deneyin.
  2. Altıgen ızgaranın her yönü, küp ızgaranın iki yönünün birleşimidir. Örneğin, altıgen bir ızgaranın "kuzey"i +y ile -z arasında yer alır, dolayısıyla "kuzey"e doğru atılan her adım y'yi 1 artırır ve z'yi 1 azaltır.
Kübik koordinatlar, altıgen ızgara koordinat sistemi için makul bir seçimdir. Koşul x + y + z = 0 olduğundan algoritmalarda korunması gerekir. Bu koşul ayrıca her altıgen için her zaman kanonik bir koordinatın olmasını sağlar.

Küpler ve altıgenler için birçok farklı koordinat sistemi vardır. Bazılarında durum x + y + z = 0'dan farklıdır. Birçok sistemden sadece birini gösterdim. Ayrıca x-y, y-z, z-x ile kendi ilginç özellikleri olan kübik koordinatlar da oluşturabilirsiniz, ancak burada bunlara girmeyeceğim.

Ancak haritayı bu şekilde nasıl saklayacağınızı bilmediğiniz için koordinatlar için 3 sayıyı saklamak istemediğinizi iddia edebilirsiniz.

Eksenel koordinatlar

Bazen "yamuk" koordinat sistemi olarak adlandırılan eksenel bir koordinat sistemi, kübik bir koordinat sisteminden iki veya üç koordinattan oluşturulur. x + y + z = 0 koşuluna sahip olduğumuz için üçüncü koordinata ihtiyaç yoktur. Eksenel koordinatlar, haritaların saklanması ve koordinatların kullanıcıya gösterilmesi için kullanışlıdır. Kübik koordinatlarda olduğu gibi Kartezyen koordinatlarda da standart toplama, çıkarma, çarpma ve bölme işlemlerini kullanabilirsiniz.

Birçok kübik koordinat sistemi ve birçok eksenel koordinat sistemi vardır. Bu kılavuzda her kombinasyonu ele almayacağım. İki değişken seçeceğim, q (sütun) ve r (satır). Bu makaledeki diyagramlarda q, x'e ve r, z'ye karşılık gelir, ancak bu yazışma isteğe bağlıdır çünkü farklı yazışmalar elde etmek için diyagramları döndürebilir ve döndürebilirsiniz.

Bu sistemin deplasman gridlerine göre avantajı algoritmalarının daha anlaşılır olmasıdır. Sistemin dezavantajı dikdörtgen bir kartı saklamanın biraz tuhaf olmasıdır; Haritaların kaydedilmesi bölümüne bakın. Bazı algoritmalar kübik koordinatlarda daha da nettir ancak x + y + z = 0 koşuluna sahip olduğumuz için üçüncü ima edilen koordinatı hesaplayıp bu algoritmalarda kullanabiliriz. Projelerimde eksenlere q, r, s adını veriyorum, böylece durum q + r + s = 0 gibi görünüyor ve gerektiğinde s = -q - r'yi hesaplayabiliyorum.

Akslar

Ofset koordinatları çoğu insanın aklına gelen ilk şeydir çünkü bunlar, karelerin ızgaraları için kullanılan standart Kartezyen koordinatlarla aynıdır. Ne yazık ki, iki eksenden birinin ters yönde çalışması gerekiyor ve bu da işleri karmaşık hale getiriyor. Küp ve eksen sistemleri daha ileri gider ve daha basit algoritmalara sahiptir, ancak kart depolama biraz daha karmaşıktır. “Alternatif” ya da “ikili” denilen bir sistem daha var ama onu burada ele almayacağız; bazıları kübik veya eksenel olmaktansa çalışmayı daha kolay buluyor.


Ofset koordinatları, kübik ve eksenel

Eksen karşılık gelen koordinatın arttığı yöndür. Bir eksene dik, koordinatın sabit kaldığı çizgidir. Yukarıdaki ızgara diyagramları dik çizgileri göstermektedir.

Koordinat dönüşümü

Tasarımınızda eksenel veya ofset koordinatları kullanmanız muhtemeldir, ancak çoğu algoritma kübik koordinatlarla daha kolay ifade edilir. Bu nedenle sistemler arasında koordinatları dönüştürebilmemiz gerekiyor.

Eksenel koordinatlar kübik koordinatlarla yakından ilişkilidir, dolayısıyla dönüşüm basittir:

# kübik koordinatları eksenel koordinatlara dönüştürün q = x r = z # eksenel koordinatları kübik koordinatlara dönüştürün x = q z = r y = -x-z
Kodda bu iki fonksiyon şu şekilde yazılabilir:

Function cube_to_hex(h): # eksenel var q = h.x var r = h.z return Hex(q, r) function hex_to_cube(h): # kübik var x = h.q var z = h.r var y = -x-z return Cube(x, y) ,z)
Ofset koordinatları biraz daha karmaşıktır:

Bitişik altıgenler

Bir altıgen verildiğinde, yanındaki altıgen hangisidir? Tahmin edebileceğiniz gibi cevap kübik koordinatlarda en kolay, eksenel koordinatlarda oldukça kolay ve yer değiştirme koordinatlarında biraz daha zordur. Ayrıca altı "köşegen" altıgeni de hesaplamanız gerekebilir.

Kübik koordinatlar

Onaltılık koordinatlarda bir boşluğun taşınması, üç kübik koordinattan birinin +1'e, diğerinin -1'e değişmesine neden olur (toplam 0 kalmalıdır). +1'de üç olası koordinat değişebilir ve -1'de geri kalan ikisi değişebilir. Bu bize altı olası değişiklik sunuyor. Her biri altıgenin yönlerinden birine karşılık gelir. En basit ve en hızlı yol, değişiklikleri önceden hesaplamak ve bunları derleme zamanında Cube(dx, dy, dz) kübik koordinat tablosuna koymaktır:

Var yönleri = [ Küp(+1, -1, 0), Küp(+1, 0, -1), Küp(0, +1, -1), Küp(-1, +1, 0), Küp( -1, 0, +1), Cube(0, -1, +1) ] function cube_direction(yön): dönüş yönleri function cube_neighbor(onaltılık, yön): return cube_add(hex, cube_direction(yön))

Eksenel koordinatlar

Daha önce olduğu gibi, başlangıçta kübik sistemi kullanıyoruz. Cube(dx, dy, dz) tablosunu alıp Hex(dq, dr) tablosuna dönüştürelim:

Var yönleri = [ Hex(+1, 0), Hex(+1, -1), Hex(0, -1), Hex(-1, 0), Hex(-1, +1), Hex(0, +1) ] function hex_direction(yön): dönüş yönleri function hex_neighbor(hex, yön): var dir = hex_direction(yön) return Hex(hex.q + dizin.q, hex.r + dizin.r)

Ofset koordinatları

Eksenel koordinatlarda grid üzerinde nerede olduğumuza bağlı olarak değişiklikler yapıyoruz. Eğer bir uzaklık sütununda/satırındaysak, o zaman kural, uzaklığı olmayan bir sütun/satır durumundan farklıdır.

Daha önce olduğu gibi col ve row'a eklenmesi gereken sayıların tablosunu oluşturuyoruz. Ancak bu sefer iki dizimiz olacak; biri tek sütunlar/satırlar için, diğeri çift sütunlar için. Yukarıdaki ızgara haritası görüntüsünde (1,1)'e bakın ve altı yönün her birinde hareket ettikçe sütun ve satırların nasıl değiştiğine dikkat edin. Şimdi işlemi (2,2) için tekrarlayalım. Tablolar ve kodlar, dört yer değiştirme ızgarası türünün her biri için farklı olacaktır; her ızgara türü için karşılık gelen kodu burada bulabilirsiniz.

Tek-r
var yönler = [ [ 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) ] ] function offset_neighbor(onaltılık, yön): var parity = hex.satır & 1 var dir = yönler dönüş Hex(hex.sütun + dizin.sütun, hex.satır + dizin.satır)


Çift-r
var yönler = [ [ Hex(+1, 0), Hex(+1, -1), Hex(0, -1), Hex(-1, 0), Hex(0, +1), Hex(+1) , +1) ], [ Onaltılı(+1, 0), Onaltılı(0, -1), Onaltılı(-1, -1), Onaltılı(-1, 0), Onaltılı(-1, +1), Onaltılı (0, +1) ] ] function offset_neighbor(hex, yön): var eşlik = hex.satır & 1 var dir = yönler dönüş Hex(hex.sütun + dizin.sütun, hex.satır + dizin.satır)


Çift (ÇİFT) ve tek (ODD) satırlar için ızgara

Tek-q
var yönler = [ [ 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) ] ] function offset_neighbor(onaltılık, yön): var parity = hex.col & 1 var dir = yönler dönüş Hex(hex.col + dizin.col, hex.row + dizin.row)


Çift-q
var yönler = [ [ Hex(+1, +1), Hex(+1, 0), Hex(0, -1), Hex(-1, 0), Hex(-1, +1), Hex(0) , +1) ], [ Onaltılı(+1, 0), Onaltılı(+1, -1), Onaltılı(0, -1), Onaltılı(-1, -1), Onaltılı(-1, 0), Onaltılı (0, +1) ] ] function offset_neighbor(onaltılık, yön): var parity = hex.col & 1 var dir = yönler dönüş Hex(hex.col + dizin.col, hex.row + dizin.row)


Çift (ÇİFT) ve tek (ODD) sütunlar için kılavuz

Köşegenler

Onaltılık koordinatlarda "köşegen" uzayda hareket etmek, üç kübik koordinattan birini ±2, diğer ikisini ∓1 oranında değiştirir (toplam 0 kalmalıdır).

Var köşegenler = [ Küp(+2, -1, -1), Küp(+1, +1, -2), Küp(-1, +2, -1), Küp(-2, +1, +1) ), Cube(-1, -1, +2), Cube(+1, -2, +1) ] function cube_diagonal_neighbor(onaltılık, yön): return cube_add(hex, köşegenler)
Daha önce olduğu gibi, bu koordinatları üç koordinattan birini bırakarak eksenel koordinatlara dönüştürebiliriz veya önce sonuçları hesaplayarak bunları ofset koordinatlara dönüştürebiliriz.


Mesafeler

Kübik koordinatlar

Kübik koordinat sisteminde her altıgen, üç boyutlu uzayda bir küptür. Bitişik altıgenler, altıgen ızgarada 1 aralıklarla, küp ızgarada ise 2 aralıklarla yerleştirilmiştir. Bu, mesafelerin hesaplanmasını kolaylaştırır. Karelerden oluşan bir ızgarada Manhattan mesafeleri abs(dx) + abs(dy) şeklindedir. Küplerden oluşan bir ızgarada Manhattan mesafeleri abs(dx) + abs(dy) + abs(dz) şeklindedir. Altıgen ızgaradaki mesafe bunların yarısına eşittir:

Cube_distance(a, b) işlevi: dönüş (abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z)) / 2
Bu gösterimin eşdeğeri, üç koordinattan birinin diğer ikisinin toplamı olması gerektiğini söylemek ve bunu mesafe olarak almak olacaktır. Aşağıdaki halving formunu veya maksimum değer formunu seçebilirsiniz ancak bunlar aynı sonucu verir:

Cube_distance(a, b) işlevi: return max(abs(a.x - b.x), abs(a.y - b.y), abs(a.z - b.z))
Şekilde maksimum değerler renkli olarak vurgulanmıştır. Ayrıca her rengin altı "köşegen" yönden birini temsil ettiğini unutmayın.

GIF


Eksenel koordinatlar

Eksenel sistemde üçüncü koordinat örtülü olarak ifade edilir. Mesafeyi hesaplamak için eksenelden kübik'e geçiş yapalım:

fonksiyon hex_distance(a, b): var ac = hex_to_cube(a) var bc = hex_to_cube(b) return cube_distance(ac, bc)
Derleyici satır içi (satır içi) hex_to_cube ve cube_distance sizin durumunuzdaysa, şöyle bir kod üretecektir:

hex_distance(a, b) işlevi: dönüş (abs(a.q - b.q) + abs(a.q + a.r - b.q - b.r) + abs(a.r - b.r)) / 2
Altıgenler arasındaki mesafeleri eksenel koordinatlarda yazmanın birçok farklı yolu vardır, ancak yazma yönteminden bağımsız olarak eksenel sistemdeki altıgenler arasındaki mesafe kübik sistemdeki Manhattan mesafesinden çıkarılır. Örneğin, açıklanan "farklılıklar farkı", a.q + a.r - b.q - b.r'nin a.q - b.q + a.r - b.r olarak yazılması ve cube_distance ikiye bölme formu yerine maksimum değer formunun kullanılmasıyla elde edilir. Kübik koordinatlarla bağlantıyı görürseniz hepsi benzerdir.

Ofset koordinatları

Eksenel koordinatlarda olduğu gibi, ofset koordinatlarını kübik koordinatlara dönüştürürüz ve ardından kübik mesafeyi kullanırız.

offset_distance(a, b) işlevi: var ac = offset_to_cube(a) var bc = offset_to_cube(b) return cube_distance(ac, bc)
Algoritmaların çoğu için aynı modeli kullanacağız: altıgenlerden küplere dönüştürün, algoritmanın kübik versiyonunu çalıştırın ve kübik sonuçları altıgen koordinatlara (eksenel veya ofset koordinatlar) dönüştürün.

Çizgi çizme

Bir altıgenden diğerine çizgi nasıl çizilir? Çizgi çizmek için doğrusal enterpolasyon kullanıyorum. Doğru N+1 noktasından düzgün olarak örneklenir ve bu örneklerin hangi altıgenlerde olduğu hesaplanır.

GIF


  1. İlk önce uç noktalar arasındaki altıgen cinsinden mesafe olacak N'yi hesaplıyoruz.
  2. Daha sonra A ve B noktaları arasındaki N+1 noktayı eşit olarak örnekliyoruz. Doğrusal enterpolasyon kullanarak, bunlar da dahil olmak üzere 0'dan N'ye kadar i değerleri için her noktanın A + (B - A) * 1,0/N * olacağını belirliyoruz. Ben . Şekilde bu kontrol noktaları mavi renkle gösterilmiştir. Sonuç, kayan nokta koordinatlarıdır.
  3. Her kontrol noktasını (float) tekrar altıgenlere (int) dönüştürelim. Algoritmanın adı cube_round'dur (aşağıya bakın).
A'dan B'ye bir çizgi çizmek için her şeyi bir araya getirin:

İşlev lerp(a, b, t): // float için dönüş a + (b - a) * t işlevi cube_lerp(a, b, t): // altıgenler için dönüş Küp(lerp(a.x, b.x, t), lerp(a.y, b.y, t), lerp(a.z, b.z, t)) function cube_linedraw(a, b): var N = cube_distance(a, b) var results = her biri için 0 ≤ i ≤ N: results.append( cube_round(cube_lerp(a, b, 1.0/N * i))) sonuçları döndürür
Notlar:

  • cube_lerp'in tam olarak iki altıgen arasındaki kenarda bulunan bir noktayı döndürdüğü durumlar vardır. Daha sonra cube_round onu bir yönde veya başka bir yönde hareket ettirir. Çizgiler tek yönde hareket ettirilirse daha iyi görünür. Bu, döngüyü başlatmadan önce bir veya her iki uç noktaya "epsilon"-altıgen Küp(1e-6, 1e-6, -2e-6) eklenerek yapılabilir. Bu, çizgiyi bir yönde "dürtecektir", böylece kenarlara çarpmayacaktır.
  • Kare ızgaralardaki DDA çizgi algoritması, N'yi eksenlerin her biri boyunca maksimum mesafeye eşitler. Altıgen ızgaradaki mesafeye benzeyen aynı şeyi kübik uzayda da yapıyoruz.
  • cube_lerp işlevi kayan koordinatlara sahip bir küp döndürmelidir. Statik olarak yazılan bir dilde programlama yapıyorsanız Küp türünü kullanamazsınız. Bunun yerine bir FloatCube türü tanımlayabilir veya başka bir tür tanımlamak istemiyorsanız çizgi çizim kodunuzda bir işlevi satır içi olarak tanımlayabilirsiniz.
  • Kodu satır içi cube_lerp ile optimize edebilir ve ardından döngü dışında B.x-A.x, B.x-A.y ve 1.0/N'yi hesaplayabilirsiniz. Çarpma tekrarlanan toplama dönüştürülebilir. Sonuç, DDA çizgi algoritması gibi bir şey olacaktır.
  • Çizgi çizmek için eksenel veya kübik koordinatları kullanıyorum, ancak ofset koordinatlarla çalışmak istiyorsanız, göz atın.
  • Çizgi çizmek için birçok seçenek vardır. Bazen "üst kaplama" gerekir. Altıgen şeklinde süper örtülü çizgiler çizmem için bana kod gönderildi, ancak henüz incelemedim.

Hareket aralığı

Koordinat aralığı

Bir altıgenin merkezi ve N aralığı verildiğinde, hangi altıgenler bunun N adımı dahilindedir?

Altıgenler arasındaki uzaklık formülünden tersini yapabiliriz mesafe = max(abs(dx), abs(dy), abs(dz)) . N içindeki tüm altıgenleri bulmak için max(abs(dx), abs(dy), abs(dz)) ≤ N'ye ihtiyacımız var. Bu, üç değerin de gerekli olduğu anlamına gelir: abs(dx) ≤ N ve abs(dy) ≤ N ve abs(dz) ≤ N . Mutlak değeri çıkardığımızda -N ≤ dx ≤ N ve -N ≤ dy ≤ N ve -N ≤ dz ≤ N elde ederiz. Kodda bu iç içe geçmiş bir döngü olacaktır:

Var sonuçları = her biri için -N ≤ dx ≤ N: her biri için -N ≤ dy ≤ N: her biri için -N ≤ dz ≤ N: if dx + dy + dz = 0: results.append(cube_add(center, Cube(dx) , dy, dz)))
Bu döngü işe yarayacak ama oldukça etkisiz olacak. İçinden geçtiğimiz tüm dz değerleri arasında yalnızca bir tanesi aslında dx + dy + dz = 0 küp koşulunu karşılıyor. Bunun yerine, koşulu karşılayan dz değerini doğrudan hesaplayacağız:

Var sonuçları = her biri için -N ≤ dx ≤ N: her biri için max(-N, -dx-N) ≤ dy ≤ min(N, -dx+N): var dz = -dx-dy results.append(cube_add( merkez, Küp(dx, dy, dz)))
Bu döngü yalnızca gerekli koordinatlardan geçer. Şekilde her aralık bir çift çizgidir. Her çizgi bir eşitsizliktir. Altı eşitsizliği sağlayan tüm altıgenleri alıyoruz.

GIF


Çakışan aralıklar

Birden fazla aralıktaki altıgenleri bulmanız gerekiyorsa altıgenlerin bir listesini oluşturmadan önce aralıkları kesiştirebilirsiniz.

Bu soruna cebir veya geometri açısından yaklaşabilirsiniz. Cebirsel olarak her alan -N ≤ dx ≤ N formundaki eşitsizlik koşulları olarak ifade edilir ve bu koşulların kesişimini bulmamız gerekir. Geometrik olarak 3B uzayda her bölge bir küptür ve 3B uzayda iki küpü kesiştirerek 3B uzayda bir küboid elde edeceğiz. Daha sonra altıgenler elde etmek için bunu x + y + z = 0 düzlemine geri yansıtıyoruz. Bu problemi cebirsel olarak çözeceğim.

Öncelikle, -N ≤ dx ≤ N koşulunu daha genel bir biçimde x min ≤ x ≤ x max şeklinde yeniden yazıyoruz ve x min = merkez.x - N ve x max = merkez.x + N alıyoruz. Aynısını y ve z için yapalım, böylece önceki bölümdeki kodun genel biçimini elde edelim:

Var sonuçları = her xmin için ≤ x ≤ xmax: her max(ymin, -x-zmax) için ≤ y ≤ min(ymax, -x-zmin): var z = -x-y results.append(Cube(x, y, z))
a ≤ x ≤ b ve c ≤ x ≤ d olmak üzere iki aralığın kesişimi max(a, c) ≤ x ≤ min(b, d) şeklindedir. Altıgenlerin alanı x, y, z üzerindeki aralıklar olarak ifade edildiğinden, x, y, z aralıklarının her birini ayrı ayrı kesebilir ve ardından kesişimdeki altıgenlerin bir listesini oluşturmak için iç içe geçmiş bir döngü kullanabiliriz. Altıgenlerin bir alanı için, y ve z için benzer şekilde x min = H.x - N ve x max = H.x + N alıyoruz. İki altıgen bölgenin kesişimi için, y ve için benzer şekilde x min = max(H1.x - N, H2.x - N) ve x max = min(H1.x + N, H2.x + N) alırız. z. Aynı model üç veya daha fazla alanın kesişiminde de işe yarar.

GIF


Engeller

Engeller varsa en kolay yol mesafe sınırlaması koymaktır (önce genişlik arama). Aşağıdaki şekilde kendimizi dört hareketle sınırlıyoruz. Kodda, saçaklar[k], k adımda ulaşılabilen tüm altıgenlerden oluşan bir dizidir. Ana döngüden her geçtiğimizde, k-1 seviyesini k seviyesine kadar genişletiriz.

Cube_reachable(başlangıç, hareket) işlevi: var ziyaret edilen = set() ziyaret edilene başlangıç ​​ekle var saçaklar = saçaklar.append() her biri için 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

Dönüşler

Bir altıgen vektörü verildiğinde (iki altıgen arasındaki fark), onu diğer altıgeni gösterecek şekilde döndürmemiz gerekebilir. Eğer 1/6 daire dönüşüne sadık kalırsanız, kübik koordinatlarla bunu yapmak kolaydır.

Sağa doğru 60° dönüş, her koordinatı bir konum sağa hareket ettirir:

[ x, y, z]'den [-z, -x, -y]'ye
Sola doğru 60° döndürme, her koordinatı bir konum sola taşır:

[ x, y, z]'den [-y, -z, -x]'e



Diyagramla [orijinal makalede] "oynadıktan" sonra, her dönüşün 60° olduğunu görebilirsiniz. değişiklikler koordinatları işaretler ve fiziksel olarak “döndürür”. 120° dönüşten sonra işaretler tekrar aynı hale gelir. 180° döndürme işaretleri değiştirir, ancak koordinatlar orijinal konumlarına döner.

P konumunun C merkezi konumu etrafında dönüşünün tam sırası burada yeni bir R konumuyla sonuçlanır:

  1. P ve C konumlarını kübik koordinatlara dönüştürün.
  2. Merkezi çıkararak bir vektörün hesaplanması: P_from_C = P - C = Cube(P.x - C.x, P.y - C.y, P.z - C.z) .
  3. P_from_C vektörünü yukarıda açıklandığı gibi döndürün ve son vektöre R_from_C adını atayın.
  4. Merkezi ekleyerek vektörü tekrar konuma dönüştürme: 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. R kübik konumunu istenen koordinat sistemine geri dönüştürür.
Dönüşümün birkaç aşaması vardır, ancak her biri oldukça basittir. Dönüşü doğrudan eksenel koordinatlarda tanımlayarak bu adımlardan bazılarını kısaltmak mümkündür, ancak altıgen vektörler ofset koordinatlarıyla çalışmaz ve ofset koordinatları için adımları nasıl kısaltacağımı bilmiyorum. Rotasyonu hesaplamanın diğer yolları için ayrıca stackexchange hakkındaki tartışmaya bakın.

Yüzükler

Basit yüzük

Belirli bir altıgenin belirli bir yarıçap yarıçapına sahip bir halkaya ait olup olmadığını bulmak için, bu altıgenin merkeze olan mesafesini hesaplamanız ve bunun yarıçapa eşit olup olmadığını bulmanız gerekir. Bu tür altıgenlerin bir listesini almak için merkezden yarıçap adımları atmanız ve ardından halka boyunca yol boyunca döndürülmüş vektörleri takip etmeniz gerekir.

Function cube_ring(center, radius): var results = # bu kod radius == 0 için çalışmıyor; nedenini anlıyor musun? var cube = cube_add(center, cube_scale(cube_direction(4), radius)) her 0 ≤ i için< 6: for each 0 ≤ j < radius: results.append(cube) cube = cube_neighbor(cube, i) return results
Bu kodda küp, diyagramın ortasından köşesine doğru büyük bir okla gösterilen bir halka üzerinde başlar. Başlamak için açı 4'ü seçtim çünkü yön numaralarımın hareket ettiği yolla eşleşiyor. Farklı bir başlangıç ​​açısına ihtiyacınız olabilir. İç döngünün her aşamasında küp, halkanın etrafında bir altıgen hareket ettirir. 6* yarıçaplı adımdan sonra başladığı yere ulaşır.


Sarmal halkalar

Halkaların içinden spiral şeklinde geçerek halkaların iç kısımlarını doldurabiliriz:

Cube_spiral(merkez, yarıçap) işlevi: var sonuçlar = her 1 ≤ k ≤ yarıçap için: sonuçlar = sonuçlar + cube_ring(merkez, k) sonuçları döndürür



Büyük bir altıgenin alanı tüm dairelerin toplamı artı merkez için 1'dir. Alanı hesaplamak için bu formülü kullanın.

Altıgenleri bu şekilde hareket ettirmek, hareket aralığını hesaplamak için de kullanılabilir (yukarıya bakın).

Görünürlük alanı

Belirli bir mesafeden belirli bir konumdan görülebilen ve engellerle kapatılmayan şey nedir? Bunu belirlemenin en basit yolu, belirli bir aralıktaki her altıgene bir çizgi çizmektir. Çizgi duvarlarla buluşmuyorsa altıgen görürsünüz. Bu altıgenlere doğru çizgilerin nasıl çizildiğini ve çizgilerin birleştiği duvarları görmek için farenizi altıgenlerin [orijinal makaledeki diyagramda] üzerine getirin.

Bu algoritma geniş alanlarda yavaş olabilir ancak uygulanması kolaydır, bu yüzden onunla başlamanızı öneririm.

GIF



Görünürlüğün birçok farklı tanımı vardır. Orijinal altıgenin merkezinden başka bir altıgenin merkezini görmek ister misiniz? Orijinal altıgenin merkezinden başka bir altıgenin herhangi bir bölümünü görmek ister misiniz? Belki ilk altıgenin herhangi bir noktasından başka bir altıgenin herhangi bir parçası? Görüşünüzü engelleyen engeller tam altıgenden daha mı küçük? Kapsam, ilk bakışta göründüğünden daha yanıltıcı ve daha çeşitli bir kavramdır. En basit algoritmayla başlayalım, ancak bunun projenizdeki cevabı kesinlikle doğru bir şekilde hesaplamasını bekleyin. Basit bir algoritmanın mantıksız sonuçlar ürettiği durumlar bile vardır.

Gelecekte bu kılavuzu genişletmek istiyorum. Sahibim