Təsvir edilən altıbucağı necə çəkmək olar. Bir dairənin ətrafında çəkilmiş müntəzəm çoxbucaqlar yaradır. Mülkiyyət sadə və maraqlıdır

Altıbucaqlı prizmanın müxtəlif mövqelərdə necə təsvir ediləcəyini öyrənəcəyik.

Daimi bir altıbucaq qurmağın, altıbucaqlı rəsmlər çəkməyin, doğru olub olmadığını yoxlamağın müxtəlif yollarını öyrənin. Altıbucaqlılardan altıbucaqlı prizmalar çəkin.

Şəkildəki altıbucaqlı prizmanı nəzərdən keçirin. 3.52 və onun ortogonal proyeksiyaları Şəkildə. 3.53. Düzbucaqlı altıbucaqlar altıbucaqlı prizmanın (altıbucaqlı) bazasında yerləşir, yan üzləri eyni düzbucaqlıdır. Altıbucağı perspektivdə düzgün təsvir etmək üçün əvvəlcə onun əsasını perspektivdə necə düzgün təsvir etməyi öyrənməlisiniz (Şəkil 3.54). Şəkildəki altıbucaqda. 3.55 zirvəsi birdən altıya qədər olan rəqəmlərlə qeyd olunur. 1 və 3, 4 və 6 nöqtələrini şaquli xətlərlə bağlasanız, bu xətlərin dairənin mərkəzi nöqtəsi ilə birlikdə 5 - 2 diametrini dörd bərabər seqmentə böldüyünü görə bilərsiniz (bu seqmentlər qövslə göstərilmişdir). Altıbucağın əks tərəfləri bir -birinə paraleldir və mərkəzindən keçən və iki ucu birləşdirən bir xətt (məsələn, 6 - 1 və 4 - 3 tərəfləri 5 - 2 xəttinə paraleldir). Bu müşahidələr, altıbucağı perspektivdə qurmağınıza və bu konstruksiyanın düzgünlüyünü yoxlamağa kömək edəcək. Təqdimatdan müntəzəm bir altıbucaq qurmağın iki yolu var: dairə əsasında və kvadrat əsasında.

Sınırlanmış dairəyə əsaslanaraq. Ənciri nəzərdən keçirək. 3.56. Normal bir altıbucağın bütün təpələri, radiusu altıbucağın tərəfinə bərabər olan dairəyə aiddir.


Üfüqi altıbucaqlı. Üfüqi, sərbəst bir ellips, yəni perspektivdə dairəvi bir dairə çəkin. İndi altıbucağın zirvələri olan altı nöqtəni tapmalısınız. Verilmiş dairənin istənilən diametrini mərkəzindən keçirin (şəkil 3.57). Çapın ucları - 5 və 2, ellips üzərində uzanır, altıbucağın təpələridir. Qalan təpələri tapmaq üçün bu diametri dörd bərabər seqmentə bölmək lazımdır. Çap artıq dairənin mərkəzi nöqtəsi ilə iki radiusa bölünür, hər radiusu yarıya bölmək qalır. Perspektivli rəsmdə, dörd seqmentin hamısı izləyicidən məsafə ilə bərabər şəkildə azalır (Şəkil 3.58). İndi radiusun orta nöqtələrini - A və B nöqtələrini - 5 - 2 düz xəttinə dik olan düz xətləri çəkin. 5 və 2 nöqtələrində ellipsə olan teğetləri istifadə edərək istiqamətlərini tapa bilərsiniz (Şəkil 3.59). Bu teğetlər 5 - 2 diametrinə dik olacaq və bu teğetlərə paralel olaraq A və B nöqtələrindən çəkilmiş xətlər də 5 - 2 xəttinə dik olacaq. Bu xətlərin ellipslə kəsişməsində əldə edilən nöqtələri 1, 3, 4, 6 (Bax Şəkil 3.60) Bütün altı ucu düz xətlərlə bağlayın (Şəkil 3.61).

Quruluşunuzun düzgünlüyünü müxtəlif yollarla yoxlayın. Konstruksiya düzgündürsə, altıbucağın əks təpələrini birləşdirən xətlər dairənin mərkəzində kəsişir (Şəkil 3.62) və altıbucağın əks tərəfləri müvafiq diametrlərə paraleldir (Şəkil 3.63). Yoxlamağın başqa bir yolu Şek. 3.64.

Şaquli altıbucaqlı. Belə bir altıbucaqda, 7 və 3, b və 4 nöqtələrini birləşdirən düz xətlər, həmçinin 5 və 2 -ci nöqtələrdə işarələnmiş dairəyə teğetlər, şaquli bir istiqamətə malikdir və perspektiv rəsmdə saxlayır. Beləliklə, ellipsə iki şaquli teğet çəkərək 5 və 2 nöqtələrini tapırıq (toxunma nöqtələri). Onları düz bir xətt ilə bağlayın və sonra yaranan diametri 5 - 2 -ni perspektiv kəsiklərini nəzərə alaraq 4 bərabər seqmentə bölün (Şəkil 3.65). A və B nöqtələrindən şaquli xətlər çəkin və onların ellipslə kəsişməsində 1,3,6L4 nöqtələrini tapın. Sonra 1 - 6 nöqtələrini düz xətlərlə ardıcıl olaraq bağlayın (Şəkil 3.66). Altıbucağın qurulmasının düzgünlüyünü əvvəlki nümunədə olduğu kimi yoxlayın.

Altıbucaq qurmağın təsvir edilmiş üsulu, bu rəqəmi verilən nisbətlərin kvadratından daha perspektivdə çəkmək daha asan olan bir dairəyə əsaslanaraq əldə etməyə imkan verir. Buna görə də, altıbucaqlı qurmağın bu üsulu ən dəqiq və çox yönlü görünür. Kvadrat üzərində qurulma üsulu, rəsmdə artıq bir kub olduğu halda, başqa sözlə, kvadratın nisbətləri və tərəflərinin istiqaməti təyin edildikdə altıbucaqlı təsviri asanlaşdırır.

Bir kvadrat əsasında. Ənciri nəzərdən keçirək. 3.67. Üfüqi istiqamətdə 5 - 2 olan bir kvadratda yazılmış altıbucaq kvadratın tərəfinə bərabərdir və şaquli istiqamətdə uzunluğundan azdır.

Şaquli altıbucaqlı. Perspektivdə şaquli bir kvadrat çəkin. Üfüqi tərəflərinə paralel olan diaqonalların kəsişməsindən düz bir xətt çəkin. Yaranan 5 - 2 seqmentini dörd bərabər hissəyə bölün və A və B nöqtələrindən şaquli xətlər çəkin (Şəkil 3.68). Altıbucağın yuxarı və aşağı xətləri meydanın tərəfləri ilə üst -üstə düşmür. Onları kvadratın üfüqi tərəflərindən bir qədər (1114 a) və onlara paralel olaraq çəkin. Bu şəkildə tapılan 1 və 3 nöqtələrini 2 nöqtəsi ilə, 6 və 4 nöqtələrini 5 nöqtəsi ilə birləşdirərək altıbucaqlı oluruq (Şəkil 3.69).

Üfüqi altıbucaq eyni ardıcıllıqla qurulur (Şəkil 3.70 və 3.71).

Bu tikinti üsulu yalnız kifayət qədər açılan altıbucaqlılar üçün uyğundur. Altıbucağın açıqlanması əhəmiyyətsizdirsə, sünnət üsulundan istifadə etmək daha yaxşıdır. Kvadratdan düzəldilmiş altıbucağı sınamaq üçün artıq bildiyiniz üsullardan istifadə edə bilərsiniz.

Bundan əlavə, başqa bir şey var - yaranan altıbucağın ətrafında bir dairə təsvir etmək (rəsminizdə - ellips). Altıbucağın bütün təpələri bu ellipsə aid olmalıdır.

Altıbucaq çəkmə bacarıqlarına yiyələndikdən sonra sərbəst şəkildə altıbucaqlı prizma çəkməyə keçəcəksiniz. Şəkildəki diaqrama yaxından baxın. 3.72, həmçinin dairə daxilində altıbucaqlı prizmaların qurulması sxemləri (Şəkil 3.73; 3.74 və 3.75) və kvadrat əsasında (Şəkil 3.76; 3.77 və 3.78). Şaquli və üfüqi altıbucaqları müxtəlif yollarla çəkin. Şaquli bir altıbucaq şəklində, yan üzlərin uzun tərəfləri bir -birinə dikey düz xətlər ilə paralel olacaq və üfüq xəttindən nə qədər uzaq olarsa, altıbucaq daha açıq olacaq. Üfüqi bir altıbucaq şəklində, yan üzlərin uzun tərəfləri üfüqdə yox olan nöqtədə bir -birinə yaxınlaşacaq və əsas altıbucağın açılması tamaşaçıdan nə qədər uzaq olarsa, o qədər böyük olacaq. Altıbucaqlı təsvir edərkən, hər iki əsasın paralel üzlərinin perspektivdə yaxınlaşdığından əmin olun (Şəkil 3.79; 3.80).

Çoxbucaqlılar mövzusu məktəb proqramında yer alsa da buna yetərincə diqqət yetirilmir. Bu arada maraqlıdır və bu xüsusilə adi altıbucaqlı və ya altıbucaqlılar üçün doğrudur - axı bir çox təbii obyekt bu formaya malikdir. Bunlara bal pətəyi və daha çox daxildir. Bu forma praktikada çox yaxşı tətbiq olunur.

Tərif və tikinti

Daimi bir altıbucaq, altı tərəfi bərabər olan və eyni sayda bərabər bucağa sahib olan bir təyyarə şəklidir.

Çoxbucaqlı bucaqların cəminin düsturunu xatırlayırsınızsa

bu rəqəmdə 720 ° -ə bərabər olduğu ortaya çıxdı. Yaxşı, rəqəmin bütün açıları bərabər olduğundan, hər birinin 120 ° -ə bərabər olduğunu hesablamaq asandır.

Altıbucaq çəkmək çox sadədir, bunun üçün bir pusula və bir hökmdar kifayətdir.

Addım-addım təlimatlar belə olacaq:

İstəyirsinizsə, radiusa bərabər olan beş dairə çəkərək xəttsiz edə bilərsiniz.

Bu şəkildə əldə edilən rəqəm müntəzəm bir altıbucaq olacaq və bunu aşağıda sübut etmək olar.

Mülkiyyət sadə və maraqlıdır

Normal bir altıbucağın xüsusiyyətlərini başa düşmək üçün onu altı üçbucağa bölmək məntiqlidir:

Bu, gələcəkdə xüsusiyyətlərini daha aydın şəkildə göstərməyə kömək edəcək, əsasları bunlardır:

  1. əhatə dairəsinin diametri;
  2. yazılmış dairənin diametri;
  3. kvadrat;
  4. perimetri.

Sınırlı dairə və tikinti ehtimalı

Altıbucağın ətrafında bir dairə təsvir edilə bilər və yalnız bir. Bu rəqəm doğru olduğu üçün bunu olduqca sadə bir şəkildə edə bilərsiniz: bisektorun içərisindəki iki bitişik küncdən çəkin. O nöqtəsində kəsişəcəklər və aralarındakı tərəflə birlikdə üçbucaq meydana gətirəcəklər.

Altıbucağın tərəfi ilə bisektorlar arasındakı açılar hər biri 60 ° olacaq, buna görə də deyə bilərik ki, üçbucaq, məsələn, AOB, isoscelesdir. Üçüncü bucaq da 60 ° -ə bərabər olacağından, o da bərabər tərəflidir. Buradan belə çıxır ki, OA və OB seqmentləri bərabərdir, yəni dairənin radiusu kimi xidmət edə bilərlər.

Bundan sonra, digər tərəfə keçə bilərsiniz və həmçinin bisektoru C nöqtəsindəki bucaqdan çıxara bilərsiniz. Başqa bir bərabər tərəfli üçbucaq alacaqsınız və AB tərəfi ikisi üçün eyni olacaq və OS eyni dairənin keçdiyi növbəti radius olacaq. Ümumilikdə altı belə üçbucaq olacaq və O nöqtəsində ortaq bir zirvəyə sahib olacaqlar. Məlum olur ki, bir dairəni təsvir etmək mümkün olacaq və bu yalnız birdir və radiusu altıbucağın tərəfinə bərabərdir. :

Bu səbəbdən bu rəqəmi bir pusula və bir hökmdarla qurmaq mümkündür.

Yaxşı, bu dairənin sahəsi standart olacaq:

Yazılmış dairə

Yazılan dairənin mərkəzi, yazılan dairənin mərkəzi ilə üst -üstə düşəcək. Bunu yoxlamaq üçün O nöqtəsindən altıbucağın tərəflərinə diklər çəkə bilərsiniz. Altıbucağı təşkil edən üçbucaqların yüksəklikləri olacaqlar. Və bir ikiqat üçbucağın hündürlüyü, dayandığı tərəfə görə medianadır. Beləliklə, bu yüksəklik, yazılmış dairənin radiusu olan dik nöqtədən başqa bir şey deyil.

Bərabər tərəfli üçbucağın hündürlüyü sadəcə hesablanır:

h² = a²- (a / 2) ² = a²3 / 4, h = a (√3) / 2

Və R = a və r = h olduğundan, belə çıxır

r = R (√3) / 2.

Beləliklə, yazılmış dairə müntəzəm altıbucağın tərəflərinin mərkəzlərindən keçir.

Onun sahəsi olacaq:

S = 3πa² / 4,

yəni təsvir edilənin dörddə üçü.

Ətraf və sahə

Perimetrlə hər şey aydındır, bu tərəflərin uzunluqlarının cəmidir:

P = 6a və ya P = 6R

Ancaq sahə altıbucağın bölünə biləcəyi altı üçbucağın cəminə bərabər olacaq. Üçbucağın sahəsi baza və hündürlüyün yarısı qədər hesablandığından:

S = 6 (a / 2) (a (√3) / 2) = 6а² (√3) / 4 = 3а² (√3) / 2 və ya

S = 3R² (√3) / 2

Yazılan dairənin radiusu ilə bu sahəni hesablamaq istəyənlər bu şəkildə edilə bilər:

S = 3 (2r / √3) ² (√3) / 2 = r² (2√3)

Əyləncəli tikililər

Yanları ucları bir -birinə bağlayacaq altıbucaqlı bir üçbucaq yazmaq olar:

Ümumilikdə ikisi olacaq və bir -birlərinin üstündəki mövqeləri Davud ulduzunu verəcək. Bu üçbucaqların hər biri bərabər tərəflidir. Buna əmin olmaq çətin deyil. AC tərəfinə baxsanız, o, eyni anda iki üçbucağa aiddir - BAC və AEC. Birincisində AB = BC və aralarındakı bucaq 120 ° olarsa, qalanların hər biri 30 ° olacaq. Buradan məntiqi nəticələr çıxara bilərik:

  1. B nöqtəsindən ABC hündürlüyü sin30 ° = 1/2 olduğu üçün altıbucağın yarısının yarısı olacaq. Buna əmin olmaq istəyənlərə, Pifaqor teoreminə görə təkrar söyləmələri tövsiyə edilə bilər, bura mükəmməl uyğun gəlir.
  2. AC -nin tərəfi, eyni teoremlə hesablanan yazılmış dairənin iki radiusuna bərabər olacaq. Yəni AC = 2 (a (√3) / 2) = a (√3).
  3. ABC, CDE və AEF üçbucaqları iki tərəfdən və aralarındakı bucaqdan bərabərdir və bu səbəbdən AC, CE və EA tərəflərinin bərabərliyi.

Üçbucaqlar bir -birindən keçərək yeni bir altıbucaq əmələ gətirir və eyni zamanda nizamlıdır. Bu sadəcə sübut olunur:

Beləliklə, rəqəm adi altıbucağın xüsusiyyətlərinə cavab verir - altı bərabər tərəfi və bucağı var. Köşelerdəki üçbucaqların bərabərliyindən yeni altıbucağın tərəfinin uzunluğunu çıxarmaq asandır:

d = a (√3) / 3

Həm də ətrafında təsvir olunan dairənin radiusu olacaq. Yazılan radius, ABC üçbucağını nəzərdən keçirərkən sübut edilmiş böyük altıbucağın yarısı olacaq. Hündürlüyü tərəfin tam yarısıdır, buna görə ikinci yarısı kiçik altıbucağa yazılmış dairənin radiusudur:

r₂ = a / 2

S = (3 (√3) / 2) (a (√3) / 3) ² = a (√3) / 2

Davidin ulduzunun içindəki altıbucağın sahəsi, ulduzun yazıldığı böyükdən üç dəfə az olduğu ortaya çıxdı.

Nəzəriyyədən praktikaya

Altıbucağın xüsusiyyətləri həm təbiətdə, həm də insan fəaliyyətinin müxtəlif sahələrində çox fəal şəkildə istifadə olunur. Hər şeydən əvvəl, bu, boltlar və qoz -fındıqlara aiddir - birincinin və ikincisinin qapaqları, pərçimləri nəzərə almasanız, düzgün altıbucaqdan başqa bir şey deyil. Açarların ölçüsü yazılmış dairənin diametrinə - yəni qarşı tərəflər arasındakı məsafəyə uyğundur.

Altıbucaqlı plitələr də tətbiqini tapdı. Dördbucaqlıdan daha az yaygındır, ancaq onu qoymaq daha rahatdır: üç plitələr bir nöqtədə deyil, dörd deyil. Kompozisiyalar çox maraqlı ola bilər:

Beton səki plitələri də istehsal olunur.

Altıbucağın təbiətdə yayılması asanlıqla izah edilə bilər. Beləliklə, dairələri və topları eyni diametrə malik olduqda bir təyyarəyə möhkəm bağlamaq ən asandır. Bu səbəbdən, bal pətəyi belə bir forma sahibdir.

Altıbucaqlı ızgaralar (altıbucaqlı ızgaralar) bəzi oyunlarda istifadə olunur, lakin düzbucaqlı ızgaralar qədər sadə və ümumi deyillər. Təxminən 20 ildir ki, altıbucaqlı ızgaralarda mənbələr toplayıram və bu təlimatı ən sadə kodda ən zərif yanaşmalardan bəziləri üçün yazmışam. Bu məqalədə tez -tez Charles Fu və Clark Verbrugge dərslərindən istifadə olunur. Altıbucaqlı mesh yaratmağın müxtəlif yollarını, necə əlaqələndirdiklərini və ən çox yayılmış alqoritmləri təsvir edəcəyəm. Bu məqalənin bir çox hissəsi interaktivdir: bir grid növü seçmək müvafiq sxemləri, kodu və mətnləri dəyişdirir. (Təxminən. Lane: bu yalnız orijinala aiddir, onu öyrənməyi məsləhət görürəm. Tərcümədə orijinalın bütün məlumatları qorunur, lakin interaktivlik olmadan.).

Bu məqalədəki kod nümunələri pseudocode ilə yazılmışdır, buna görə də öz tətbiqinizi yazmaq üçün oxumaq və başa düşmək daha asandır.

Həndəsə

Altıbucaqlar altıbucaqlı çoxbucaqlıdır. Daimi altıbucaqlıların bütün tərəfləri (üzləri) eyni uzunluğa malikdir. Yalnız müntəzəm altıbucaqlar ilə işləyəcəyik. Tipik olaraq, altıbucaqlı ızgaralar üfüqi (ucu yuxarı) və şaquli (düz üst) istiqamətlərdən istifadə edir.


Düz (sol) və uclu (sağ) üst altıbucaqlar

Altıbucaqlıların 6 üzü var. Hər üz iki altıbucaqlıdır. Altıbucaqlıların 6 künc nöqtəsi var. Hər bir künc nöqtəsi üçbucaqlı ilə paylaşılır. Mesh hissələri (kvadratlar, altıbucaqlar və üçbucaqlar) haqqında yazımda mərkəzlər, kənarlar və künc nöqtələri haqqında daha çox oxuya bilərsiniz.

Künclər

Normal bir altıbucaqlı vəziyyətdə, daxili açılar 120 ° -dir. Hər biri 60 ° daxili açıları olan bərabər tərəfli üçbucaq olan altı "takoz" var. Künc nöqtəsi i(60 ° * i) + 30 ° aralığındadır, ölçü vahidləri mərkəzdən. Kodda:

Hex_corner funksiyası (mərkəz, ölçü, 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) )
Altıbucağı doldurmaq üçün çoxbucağın zirvələrini hex_cornerdən (..., 0) hex_cornerə (..., 5) almalısınız. Altıbucağın konturunu çəkmək üçün bu təpələrdən istifadə edin və sonra hex_corner -də yenidən xətt çəkin (..., 0).

İki istiqamət arasındakı fərq, x və y-nin yerləri dəyişdirməsidir, bu da bucaqların dəyişməsinə səbəb olur: düz altıbucaqlıların açıları 0 °, 60 °, 120 °, 180 °, 240 °, 300 ° və iti altıbucaqlar 30 °, 90 °, 150 °, 210 °, 270 °, 330 ° -dir.


Düz və kəskin üst altıbucaqlıların açıları

Ölçüsü və yeri

İndi bir neçə altıbucağı birlikdə yerləşdirmək istəyirik. Üfüqi bir istiqamətdə, altıbucağın hündürlüyü boy = ölçü * 2 -dir. Bitişik altıbucaqlar arasındakı şaquli məsafə vert = hündürlük * 3/4.

Altıbucağın eni eni = sqrt (3) / 2 * yüksəklikdir. Bitişik altıbucaqlar arasındakı üfüqi məsafə üfüq = eni.

Bəzi oyunlar, altıbucaqlar üçün adi altıbucaqlara tam uyğun gəlməyən piksel sənətindən istifadə edir. Bu bölmədə təsvir olunan bucaq və mövqe düsturları bu altıbucaqların ölçülərinə uyğun gəlmir. Altıbucaqlı şəbəkə alqoritmlərini izah edən məqalənin qalan hissəsi, altıbucaqlar bir qədər uzanmış və ya sıxılmış olsa belə tətbiq olunur.



Koordinat sistemləri

Altıbucaqları bir ızgaraya yığmağa başlayaq. Kvadratların ızgaraları vəziyyətində, yığılmağın yalnız bir açıq yolu var. Altıbucaqlar üçün bir çox yanaşma var. Əsas təqdimat olaraq kub koordinatlarından istifadə etməyi məsləhət görürəm. Eksen koordinatları və ya ofset koordinatları istifadəçilər üçün xəritələri saxlamaq və koordinatları göstərmək üçün istifadə edilməlidir.

Ofset koordinatları

Ən ümumi yanaşma hər bir sonrakı sütunu və ya satırı əvəz etməkdir. Sütunlar col və ya q olaraq təyin olunur. Satırlar satır və ya r olaraq təyin olunur. Tək və ya hətta sütunlar / satırlar ofset edilə bilər, buna görə üfüqi və şaquli altıbucaqların iki seçimi var.


Odd-r üfüqi düzeni


Even-r üfüqi tənzimləmə


Odd-q şaquli tənzimləmə


Even-q şaquli tənzimləmə

Kubik koordinatlar

Altıbucaqlı ızgaralara baxmağın başqa bir yolu, onları görməkdir üçəsas baltalar, yox iki meydanların ızgaralarında olduğu kimi. Zərif simmetriya nümayiş etdirirlər.

Bir küp kub götürün və biçmək x + y + z = 0 -da diaqonal düzlük. Bu qəribə bir fikirdir, ancaq altıbucaqlı alqoritmləri sadələşdirməyimizə kömək edəcək. Xüsusilə, Kartezyen koordinatlardan standart əməliyyatlardan istifadə edə biləcəyik: koordinatların toplanması və çıxarılması, skalyar ilə vurma və bölmə, eləcə də məsafələr.

Küplər ızgarasındakı üç böyük oxa və onların altı ilə əlaqəsinə diqqət yetirin. diaqonal altıbucaqlı şəbəkənin istiqamətləri. Şəbəkənin diaqonal oxları, altıbucaqlı ızgaranın əsas istiqamətinə uyğundur.


Altıbucaqlar


Kuba

Artıq kvadratlar və kublar ızgaraları üçün alqoritmlərimiz olduğundan, kub koordinatlarından istifadə etməklə bu alqoritmləri altıbucaqlı ızgaralara uyğunlaşdırmağa imkan verir. Məqalədəki əksər alqoritmlər üçün bu sistemdən istifadə edəcəyəm. Fərqli bir koordinat sistemi olan alqoritmlərdən istifadə etmək üçün kub koordinatlarını çevirirəm, alqoritmi işə salıram və sonra geri çevirirəm.

Altıbucaqlar şəbəkəsi üçün kub koordinatlarının necə işlədiyini araşdırın. Altıbucaqları seçdiyiniz zaman üç oxa uyğun olan kub koordinatları vurgulanır.

  1. Kublar ızgarasının hər istiqaməti uyğun gəlir xətlər altıbucaqlar şəbəkəsində. Əlaqəni görmək üçün z, 0, 1, 2, 3 -ə bərabər olan altıbucaqlı seçməyə çalışın. Xətt mavi rənglə işarələnmişdir. Eyni şeyi x (yaşıl) və y (bənövşəyi) üçün də sınayın.
  2. Hər altıbucaqlı şəbəkə istiqaməti iki kub ızgara istiqamətinin birləşməsidir. Məsələn, altıbucaqlı şəbəkənin şimalı + y ilə -z arasındadır, buna görə şimaldakı hər addım y -ni 1 artırır və z -ni 1 azaldır.
Altıbucaqlı koordinat sistemi üçün kubik koordinatlar ağıllı bir seçimdir. Şərt x + y + z = 0 olduğu üçün alqoritmlərdə qorunmalıdır. Bu şərt, hər altıbucaq üçün hər zaman kanonik bir koordinatın olmasını təmin edir.

Kublar və altıbucaqlar üçün bir çox fərqli koordinat sistemi var. Bəzilərində şərt x + y + z = 0 -dan fərqlənir. Bir çox sistemdən yalnız birini göstərdim. X-y, y-z, z-x ilə öz maraqlı xüsusiyyətlər dəstinə sahib olan kub koordinatları da yarada bilərsiniz, amma bunları burada əhatə etməyəcəyəm.

Ancaq xəritəni bu şəkildə necə saxlamağı bilmədiyiniz üçün koordinatlar üçün 3 ədəd saxlamaq istəmədiyinizi iddia edə bilərsiniz.

Eksenel koordinatlar

Bəzən "trapezoidal" koordinat sistemi adlandırılan bir eksenel koordinat sistemi bir kub koordinat sistemindən iki və ya üç koordinatdan qurulur. X + y + z = 0 şərtimiz olduğu üçün üçüncü koordinata ehtiyac yoxdur. Eksen koordinatları xəritələri saxlamaq və koordinatları istifadəçiyə göstərmək üçün faydalıdır. Kub koordinatlarında olduğu kimi, standart Kartezyen toplama, toplama, vurma və bölmə əməliyyatlarından istifadə edə bilərsiniz.

Bir çox kub koordinat sistemi və bir çox eksenli sistem var. Bu təlimatda bütün birləşmələri əhatə etməyəcəyəm. İki dəyişən seçəcəyəm, q (sütun) və r (satır). Bu məqalənin diaqramlarında q x -ə, r isə z -yə uyğundur, lakin bu yazışma ixtiyardır, çünki fərqli yazışmalar əldə edərək diaqramları döndərə və döndərə bilərsiniz.

Bu sistemin yerdəyişmə şəbəkələrindən üstünlüyü, alqoritmlərin daha anlaşıqlı olmasıdır. Sistemin dezavantajı, düzbucaqlı bir xəritənin saxlanmasının bir qədər qəribə olmasıdır; xəritələrin saxlanması bölməsinə baxın. Bəzi alqoritmlər kubik koordinatlarda daha aydındır, lakin x + y + z = 0 şərtimiz olduğuna görə üçüncü nəzərdə tutulan koordinatı hesablayıb bu alqoritmlərdə istifadə edə bilərik. Layihələrimdə baltaları q, r, s adlandırıram, buna görə şərt q + r + s = 0 kimi görünür və lazım olduqda s = -q - r hesablaya bilərəm.

Akslar

Kvadrat ızgaralar üçün istifadə olunan standart Kartezyen koordinatları ilə eyni olduğu üçün ofset koordinatları əksər insanların düşündükləri ilk şeydir. Təəssüf ki, iki baltadan biri taxılın əleyhinə getməlidir və nəticədə işləri çətinləşdirir. Kübik və eksenel sistemlər taxıl boyunca gedir və daha sadə alqoritmlərə malikdir, lakin xəritələrin saxlanması bir az daha mürəkkəbdir. "Alternativ" və ya "ikiqat" adlı başqa bir sistem var, amma biz bunu burada nəzərdən keçirməyəcəyik; bəziləri ilə işləmək kub və ya ekseneldən daha asan olur.


Ofset koordinatları, kub və eksenel

Axis müvafiq koordinatın artırıldığı istiqamətdir. Eksenə dik, koordinatın sabit qaldığı xəttdir. Yuxarıdakı şəbəkə diaqramları dik xətləri göstərir.

Koordinat çevrilməsi

Çox güman ki, layihənizdə eksenel koordinatlardan və ya ofset koordinatlarından istifadə edəcəksiniz, lakin bir çox alqoritmi kub koordinatlarında ifadə etmək daha asandır. Buna görə də sistemlər arasındakı koordinatları çevirə bilməliyik.

Eksenel koordinatlar kub koordinatları ilə yaxından əlaqəlidir, buna görə çevrilmə sadədir:

# kubu eksenel koordinatlara çevir q = x r = z # eksenelini kub koordinatlarına çevir x = q z = r y = -x -z
Kodda bu iki funksiya aşağıdakı kimi yazıla bilər:

Cube_to_hex (h) funksiyası: # axial var q = hx var r = hz return Hex (q, r) funksiyası hex_to_cube (h): # kub var x = hq var z = hr var y = -xz qayıt Cube (x, y , z)
Ofset koordinatları olduqca çətindir:

Bitişik altıbucaqlar

Bir altıbucaq verildikdə, hansı altıbucaqlı bitişikdir? Gözlədiyiniz kimi, cavab kub koordinatlarında ən asandır, eksenel koordinatlarda olduqca sadədir və ofset koordinatlarında bir az daha mürəkkəbdir. Altı "diaqonal" altıbucaqlı hesablamaq da lazım ola bilər.

Kubik koordinatlar

Altıbucaqlıların koordinatlarında bir boşluğun hərəkət etməsi üç kub koordinatından birini +1, digərini -1 ilə dəyişir (cəm 0 -a bərabər olmalıdır). Üç mümkün koordinat +1, qalan ikisi -1 ilə dəyişdirilə bilər. Bu, bizə altı mümkün dəyişiklik verir. Hər biri altıbucağın istiqamətlərindən birinə uyğundur. Ən sadə və sürətli yol, dəyişiklikləri əvvəlcədən hesablamaq və tərtib edərkən Cube (dx, dy, dz) cədvəlinə yerləşdirməkdir:

Müxtəlif istiqamətlər = [Cube (+1, -1, 0), Cube (+1, 0, -1), Cube (0, +1, -1), Cube (-1, +1, 0), Cube ( -1, 0, +1), Cube (0, -1, +1)] funksiyası cube_direction (istiqamət): istiqamətləri qaytarmaq cube_neighbor (hex, istiqamət): cube_add (hex, cube_direction (istiqamət))

Eksenel koordinatlar

Əvvəlki kimi, kub sistemindən başlayırıq. Cube masasını (dx, dy, dz) götürün və Hex cədvəlinə (dq, dr) çevirin:

Müxtəlif istiqamətlər = [Hex (+1, 0), Hex (+1, -1), Hex (0, -1), Hex (-1, 0), Hex (-1, +1), Hex (0, +1)] funksiyası hex_direction (istiqamət): istiqamətləri qaytarmaq hex_neighbor (hex, istiqamət): var dir = hex_direction (istiqamət) return Hex (hex.q + dir.q, hex.r + dir.r)

Ofset koordinatları

Eksenel koordinatlarda, griddə olduğumuz yerdən asılı olaraq dəyişikliklər edirik. Bir sütun / satır ofsetindəyiksə, qayda ofset olmayan bir sütun / satır vəziyyətindən fərqlənir.

Əvvəlki kimi, col və cərgəyə əlavə etmək üçün ədədlər cədvəli yaradırıq. Ancaq bu dəfə iki sütuna sahib olacağıq: biri tək sütun / satır, digəri cüt olanlar üçün. Yuxarıdakı cədvəl xəritəsindəki (1,1) -ə baxın və altı istiqamətin hər birində hərəkət edərkən kolun və satırın necə dəyişdiyinə diqqət yetirin. İndi (2,2) üçün prosesi təkrar edirik. Cədvəllər və kod dörd növ yerdəyişmə ızgarasının hər biri üçün fərqli olacaq, burada hər bir şəbəkə növü üçün müvafiq kod var.

Qəribə r
var istiqamətləri = [[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)]] funksiyası ofset_neighbor (hex, istiqamət): var parity = hex.row & 1 var dir = istiqamətlər Hex (hex.col + dir.col, hex.row + dir.row)


Hətta-r
var istiqamətləri = [[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)]] funksiyası ofset_neighbor (hex, istiqamət): var parity = hex.row & 1 var dir = istiqamətlər Hex (hex.col + dir.col, hex.row + dir.row)


Cüt (EVEN) və tək (ODD) satırlar üçün şəbəkə

Tək-q
var istiqamətləri = [[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)]] funksiyası ofset_neighbor (hex, istiqamət): var parity = hex.col & 1 var dir = istiqamətlər Hex (hex.col + dir.col, hex.row + dir.row)


Hətta-q
var istiqamətləri = [[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)]] funksiyası ofset_neighbor (hex, istiqamət): var parity = hex.col & 1 var dir = istiqamətlər Hex (hex.col + dir.col, hex.row + dir.row)


Cüt (EVEN) və tək (ODD) sütunlar üçün şəbəkə

Çaprazlar

Altıbucaqlıların koordinatlarında "diaqonal" məkanda hərəkət etməklə üç kub koordinatından birini ± 2, digər ikisini ∓1 (cəmi 0 -a bərabər qalmalıdır) dəyişir.

Müxtəlif diaqonallar = [Cube (+2, -1, -1), Cube (+1, +1, -2), Cube (-1, +2, -1), Cube (-2, +1, +1) ), Cube (-1, -1, +2), Cube (+1, -2, +1)] funksiyası cube_diagonal_neighbor (hex, istiqamət): cube_add (hex, diaqonallar) qaytar
Əvvəlki kimi, nəticələri hesabladıqdan sonra bu koordinatları üç koordinatdan birini ataraq eksenel koordinatlara və ya ofset koordinatlarına çevirə bilərik.


Məsafələr

Kubik koordinatlar

Bir kub koordinat sistemində hər altıbucaq üç ölçüdə bir kubdur. Bitişik altıbucaqlar altıbucaqlı ızgarada 1, lakin kub ızgarasında 2 ədəddir. Bu, məsafələrin hesablanmasını asanlaşdırır. Kvadratlar şəbəkəsində Manhattan məsafələri abs (dx) + abs (dy) dir. Küplər şəbəkəsində Manhattan məsafələri abs (dx) + abs (dy) + abs (dz) -dir. Altıbucaqlar şəbəkəsindəki məsafə onların yarısına bərabərdir:

Cube_distance funksiyası (a, b): qayıt (abs (a.x - b.x) + abs (a.y - b.y) + abs (a.z - b.z)) / 2
Bu işarənin ekvivalenti, üç koordinatdan birinin digər ikisinin cəmi olması lazım olduğunu ifadə etmək və sonra məsafə olaraq əldə etmək olardı. Aşağıdakı biseksiya formasını və ya maksimum dəyər formasını seçə bilərsiniz, ancaq eyni nəticəni verirlər:

Cube_distance (a, b) funksiyası: max max (abs (a.x - b.x), abs (a.y - b.y), abs (a.z - b.z))
Şəkildə maksimum dəyərlər rənglə vurğulanmışdır. Hər rəngin altı "diaqonal" istiqamətdən birini təmsil etdiyinə də diqqət yetirin.

GIF


Eksenel koordinatlar

Eksenel sistemdə üçüncü koordinat dolayı olaraq ifadə edilir. Məsafəni hesablamaq üçün ekseneldən kub halına keçirək:

Hex_distance (a, b) funksiyası: var ac = hex_to_cube (a) var bc = hex_to_cube (b) cube_distance qayıt (ac, bc)
Sizin vəziyyətinizdəki tərtibçi hex_to_cube və cube_distance daxilindədirsə, o zaman aşağıdakı kodu yaradacaq:

Hex_distance (a, b) funksiyası: qaytar (abs (a.q - b.q) + abs (a.q + a.r - b.q - b.r) + abs (a.r - b.r)) / 2
Altıbucaqlar arasındakı məsafələri eksenel koordinatlarda yazmağın bir çox fərqli yolu var, ancaq yazma üsulundan asılı olmayaraq eksenel sistemdəki altıbucaqlar arasındakı məsafə, kub sistemindəki Manhetten məsafəsindən çıxarılır... Məsələn, təsvir edilən "fərqlər fərqi" a.q + a.r - b.q - b.r olaraq a.q - b.q + a.r - b.r olaraq yazılmaqla və cube_distance biseksiya forması əvəzinə maksimum dəyər forması istifadə edilməklə əldə edilir. Kub koordinatları ilə əlaqəni görürsən, hamısı oxşardır.

Ofset koordinatları

Eksenel koordinatlarda olduğu kimi, ofset koordinatlarını kub koordinatlarına çeviririk və sonra kub məsafəsini istifadə edirik.

Ofset_distance (a, b) funksiyası: var ac = offset_to_cube (a) var bc = offset_to_cube (b) cube_distance qayıt (ac, bc)
Eyni modeli bir çox alqoritm üçün istifadə edəcəyik: altıbucaqlardan kublara çevirmək, alqoritmin kub versiyasını işə salmaq və kub nəticələrini hex koordinatlarına çevirmək (eksenel və ya ofset koordinatları).

Xətlər çəkmək

Bir altıbucaqdan digərinə necə bir xətt çəkə bilərəm? Xətt çəkmək üçün xətti interpolasiyadan istifadə edirəm. Xətt N + 1 nöqtələrində vahid şəkildə nümunələnir və bu nümunələrin hansı altıbucaqlarda yerləşdiyi hesablanır.

GIF


  1. Əvvəlcə son nöqtələr arasındakı altıbucaqlı məsafə olacaq N hesablayırıq.
  2. Sonra A və B nöqtələri arasında N + 1 nöqtələrini vahid şəkildə nümunə götürürük. Xətti interpolasiyadan istifadə edərək, 0 -dan N -ə qədər olan dəyərlər üçün hər nöqtənin A + (B - A) * 1.0 / N * olacağını təyin edirik. i. Şəkildə bu nəzarət nöqtələri mavi rəngdə göstərilmişdir. Nəticə üzən nöqtə koordinatlarıdır.
  3. Hər nəzarət nöqtəsini (üzmək) altıbucaqlılara (int) çevirin. Alqoritmə cube_round deyilir (aşağıya baxın).
Hamısını birləşdirərək A -dan B -yə bir xətt çəkin:

Lerp (a, b, t) funksiyası: // float qaytarılması üçün a + (b - a) * t funksiyası cube_lerp (a, b, t): // altıbucaqlılar üçün Cube (lerp (ax, bx, t), lerp (ay, by, t), lerp (az, bz, t)) funksiyası cube_linedraw (a, b): var N = cube_distance (a, b) var results = hər 0 ≤ i ≤ N: results.append ( cube_round (cube_lerp (a, b, 1.0 / N * i))) nəticələri qaytarın
Qeydlər:

  • Bəzən cube_lerp iki altıbucaq arasındakı kənarda bir nöqtəni qaytarır. Sonra cube_round onu bu və ya digər şəkildə dəyişir. Eyni istiqamətdə hərəkət edərkən xətlər daha yaxşı görünür. Bu, döngəyə başlamazdan əvvəl son nöqtələrdən birinə və ya hər ikisinə bir epsilon altıbucaqlı kub (1e-6, 1e-6, -2e-6) əlavə etməklə edilə bilər. Bu, xətti kənar sərhədlərə vurmamaq üçün bir istiqamətə "itələyəcək".
  • Kvadrat ızgaralardakı DDA xətti alqoritmi N hər ox boyunca maksimum məsafəyə bərabərdir. Altıbucaqlı bir şəbəkədəki məsafəyə bənzəyən kubik məkanda da eyni şeyi edirik.
  • Cube_lerp funksiyası, floatdakı koordinatları olan bir kubu qaytarmalıdır. Statik olaraq yazılmış bir dildə proqramlaşdırırsınızsa, Cube növündən istifadə edə bilməzsiniz. Bunun əvəzinə, FloatCube növünü təyin edə bilərsiniz və ya başqa bir növ təyin etmək istəmirsinizsə, xətt çəkmə kodunuzda bir funksiya daxil edə bilərsiniz.
  • Inline cube_lerp və sonra loop xaricində B.x-A.x, B.x-A.y və 1.0 / N hesablayaraq kodunuzu optimallaşdıra bilərsiniz. Çarpma təkrarlanan cəmləməyə çevrilə bilər. Nəticə DDA xətti alqoritmi kimi bir şey olacaq.
  • Xətlər çəkmək üçün eksenel və ya kub koordinatlarından istifadə edirəm, ancaq ofset koordinatları ilə işləmək istəyirsinizsə, öyrənin.
  • Xətt çəkmək üçün bir çox variant var. Bəzən üst örtük tələb olunur. Altıbucaqlı örtüklü xətlər çəkmək üçün kodu mənə göndərdilər, amma hələ baxmadım.

Səyahət diapazonu

Koordinat aralığı

Altıbucağın verilmiş bir mərkəzi və N aralığında, altıbucaqlılar N addımlar daxilindədirmi?

Altıbucaqlılar arasındakı məsafə = max (abs (dx), abs (dy), abs (dz)) düsturundan tərs iş görə bilərik. N daxilində bütün altıbucaqları tapmaq üçün max (abs (dx), abs (dy), abs (dz)) ≤ N lazımdır. Bu o deməkdir ki, hər üç dəyərə ehtiyac var: abs (dx) ≤ N və abs (dy) ≤ N və abs (dz) ≤ N. Mütləq dəyəri silməklə -N ≤ dx ≤ N və -N ≤ dy ≤ N və -N ≤ dz ≤ N alırıq. Kodda, bu iç içə bir döngə olacaq:

Var nəticələri = hər üçün -N ≤ dx ≤ N: hər üçün -N ≤ dy ≤ N: hər üçün -N ≤ dz ≤ N: əgər dx + dy + dz = 0 olarsa: results.append (cube_add (center, Cube (dx) , dy, dz)))
Bu döngə işləyəcək, amma olduqca təsirsiz olacaq. Döngədə təkrarladığımız bütün dz dəyərlərindən yalnız biri dx + dy + dz = 0 şərtlərini təmin edir. Bunun əvəzinə, şərti təmin edən dz dəyərini birbaşa hesablayacağıq:

Var nəticələri = hər üçün -N ≤ dx ≤ N: hər max üçün (-N, -dx -N) ≤ dy ≤ min (N, -dx + N): var dz = -dx -dy nəticələri.append (cube_add ( mərkəz, Küp (dx, dy, dz)))
Bu dövr yalnız lazımi koordinatlar boyunca hərəkət edir. Şəkildə hər bir aralıq bir cüt xəttdir. Hər bir xətt bərabərsizlikdir. Altı bərabərsizliyi təmin edən altıbucaqları götürürük.

GIF


Üst -üstə düşən silsilələr

Birdən çox diapazonda olan altıbucaqlar tapmaq lazımdırsa, altıbucaqlıların siyahısını yaratmadan əvvəl silsilələri keçə bilərsiniz.

Bu problemə cəbr və ya həndəsə baxımından yaxınlaşa bilərsiniz. Cəbri olaraq hər bir bölgə -N ≤ dx ≤ N şəklində bərabərsizlik şərtləri ilə ifadə edilir və bu şərtlərin kəsişməsini tapmalıyıq. Həndəsi olaraq, hər bir sahə üç ölçülü məkanda bir kubdur və üç ölçülü məkanda düzbucaqlı bir paralelepiped əldə etmək üçün üç ölçülü məkanda iki kubu kəsəcəyik. Altıbucaqları əldə etmək üçün onu yenidən x + y + z = 0 müstəvisinə yuvarlayırıq. Bu problemi cəbrlə həll edəcəyəm.

Əvvəlcə -N ≤ dx ≤ N şərtini daha ümumi formada x min ≤ x ≤ x max olaraq yenidən yazırıq və x min = center.x - N və x max = center.x + N götürürük. Y və z üçün də eyni şeyi edək, nəticədə əvvəlki hissədəki kodun ümumi görünüşü yaranır:

Var nəticələri = hər xmin üçün ≤ x ≤ xmax: hər max üçün (ymin, -x -zmax) ≤ y ≤ min (ymax, -x -zmin): var z = -xy nəticələri.append (Cube (x, y, z))
A ≤ x ≤ b və c ≤ x ≤ d aralığının kəsişməsi maksimum (a, c) ≤ x ≤ min (b, d) dir. Altıbucaqların sahəsi x, y, z -dən çox olan silsilələrlə ifadə edildiyindən, x, y, z aralığının hər birini ayrı -ayrılıqda kəsə bilərik və sonra kəsişmədə altıbucaqlıların siyahısını yaratmaq üçün içəri döngədən istifadə edə bilərik. Altıbucaqlıların bir sahəsi üçün x min = H.x - N və x max = H.x + N götürürük, eynilə y və z üçün. Altıbucaqlıların iki bölgəsinin kəsişməsi üçün x min = max (H1.x - N, H2.x - N) və x max = min (H1.x + N, H2.x + N) götürürük, eynilə y üçün və z. Eyni model üç və ya daha çox bölgənin kəsişməsində işləyir.

GIF


Maneələr

Maneələr varsa, məhdud bir məsafə ilə doldurmaq ən asandır (Genişlik İlk Axtarış). Aşağıdakı şəkildə dörd hərəkətlə məhdudlaşırıq. Kodda, saçaqlar [k], k addımları ilə əldə edilə bilən bütün altıbucaqlılardan ibarətdir. Əsas döngədən keçən hər dəfə k-1 səviyyəsini k səviyyəsinə qədər genişləndiririk.

Cube_reachable funksiyası (başlanğıc, hərəkət): var ziyarət edildi = set () hər 1 üçün ziyarət edilənlərə başlanğıc əlavə edin var fringes = fringes.append ()< 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ür

Verilmiş bir altıbucaqlı vektor üçün (iki altıbucaqlı arasındakı fərq), başqa bir altıbucağa işarə edəcək şəkildə döndərməyimiz lazım ola bilər. Bir dairənin 1/6 hissəsində fırlanmağa davam etsəniz, kub koordinatları ilə bunu etmək asandır.

60 ° sağa döndükdə hər bir koordinatı bir mövqe sağa dəyişir:

[x, y, z] -[-z, -x, -y]
60 ° sola döndükdə hər bir koordinatı bir mövqe sola dəyişir:

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



Sxemlə "orijinal məqalədə" oynayaraq, hər döngənin 60 ° döndüyünü görəcəksiniz dəyişikliklər işarələr qoyur və fiziki olaraq koordinatları "döndürür". 120 ° döndükdən sonra işarələr yenə eynidir. 180 ° dönmə işarələri dəyişir, lakin koordinatlar ilkin vəziyyətinə qaytarılır.

Yeni bir R mövqeyi ilə nəticələnən P mövqeyini mərkəz C mövqeyi ətrafında döndərməyin tam ardıcıllığı budur:

  1. P və C mövqelərini kub koordinatlarına çevirin.
  2. Mərkəzdən çıxaraq vektoru hesablayın: P_from_C = P - C = Cube (P.x - C.x, P.y - C.y, P.z - C.z).
  3. P_from_C vektorunu yuxarıda göstərildiyi kimi döndərin və yaranan vektoru R_from_C təyin edin.
  4. Mərkəz əlavə edərək vektoru yenidən mövqeyə çevirin: 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. K kub mövqeyini yenidən istədiyiniz koordinat sisteminə çevirin.
Çevrilmənin bir neçə mərhələsi var, lakin hər biri olduqca sadədir. Dönüşü birbaşa ox koordinatlarında təyin edərək bu addımların bəzilərini qısaltmaq mümkündür, lakin hex vektorları ofset koordinatları ilə işləmir və ofset koordinatları üçün addımları necə qısaltmağı bilmirəm. Pivot hesablamağın digər yollarının stackexchange müzakirəsinə də baxın.

Üzüklər

Sadə üzük

Verilmiş bir altıbucağın müəyyən bir radius halqasına aid olub olmadığını öyrənmək üçün bu altıbucaqdan mərkəzə olan məsafəni hesablamalı və radiusa bərabər olub olmadığını öyrənməlisiniz. Bütün bu altıbucaqlıların siyahısını əldə etmək üçün mərkəzdən radius addımlar atın və sonra halqa boyunca gedən yol boyunca dönmüş vektorları izləyin.

Cube_ring (mərkəz, radius) funksiyası: var results = # bu kod radius üçün işləmir == 0; niyə başa düşürsən? var cube = cube_add (mərkəz, cube_scale (cube_direction (4), radius)) hər 0 ≤ i üçün< 6: for each 0 ≤ j < radius: results.append(cube) cube = cube_neighbor(cube, i) return results
Bu kodda, kub, mərkəzdən diaqramın küncünə qədər böyük bir ox ilə göstərilən halqadan başlayır. Başlamaq üçün 4 -cü bucağı seçdim, çünki istiqamət nömrələrimin hərəkət etdiyi yola uyğun gəlir. Fərqli bir başlanğıc açısına ehtiyacınız ola bilər. Daxili döngənin hər addımında, kub halqa ətrafında bir altıbucaqlı hərəkət edir. 6 * radius addımdan sonra başladığı yerdə bitir.


Spiral üzüklər

Üzükləri spiral şəklində keçərək, üzüklərin daxili hissələrini doldura bilərik:

Cube_spiral funksiyası (mərkəz, radius): var nəticələri = hər 1 ≤ k ≤ radius üçün: nəticələr = nəticələr + cube_ring (mərkəz, k) nəticələrini qaytarır



Böyük altıbucağın sahəsi bütün dairələrin cəmidir və mərkəz üçün 1 -dir. Sahəni hesablamaq üçün bu düsturdan istifadə edin.

Altıbucaqların bu şəkildə hərəkət etməsi hərəkət aralığını hesablamaq üçün də istifadə edilə bilər (yuxarıya bax).

Görmə sahəsi

Verilmiş məsafədən verilən mövqedən nə görünür və maneələrlə mane olmur? Bunu müəyyən etməyin ən sadə yolu, hər altıbucağa müəyyən bir diapazonda bir xətt çəkməkdir. Xətt divarlara uyğun gəlmirsə, onda altıbucaq görürsünüz. Bu altıbucaqlılara və xətlərin birləşdiyi divarlara baxmaq üçün siçanı altıbucaqların üzərinə [orijinal məqalədəki diaqramda] keçirin.

Bu alqoritm böyük ərazilərdə yavaş ola bilər, amma həyata keçirmək asandır, ona görə də ondan başlamağı məsləhət görürəm.

GIF



Görünüşün bir çox fərqli tərifi var. Başlanğıcın mərkəzindən başqa bir altıbucağın mərkəzini görmək istəyirsiniz? Başlanğıcın mərkəzindən digər altıbucağın hər hansı bir hissəsini görmək istəyirsinizmi? Bəlkə hər hansı bir başlanğıc nöqtəsindən başqa bir altıbucağın bir hissəsi? Maneələr tam altıbucaqdan kiçikdirmi? Kapsam, gözlə göründüyündən daha hiyləgər və daha müxtəlif bir anlayışdır. Ən sadə alqoritmlə başlayaq, ancaq layihənizdə cavabı mütləq düzgün hesablayacağını gözləyin. Sadə bir alqoritmin məntiqsiz nəticələr verdiyi hallar da var.

Bu dərsliyi daha da genişləndirmək istəyirəm. mənim varımdır

Həndəsi konstruksiyalar təlimin əsas hissələrindən biridir. Fəza və məntiqi təfəkkürü formalaşdırırlar, həm də ibtidai və təbii həndəsi mülahizələri anlamağa imkan verirlər. Konstruksiyalar bir kompas və bir hökmdar istifadə edərək təyyarədə aparılır. Bu vasitələrə çox sayda həndəsi fiqur qurmağa icazə verilir. Eyni zamanda olduqca çətin görünən bir çox rəqəm ən sadə qaydalarla qurulmuşdur. Məsələn, düzgün altıbucağı necə qurmaq olar, hər birini bir neçə sözlə təsvir etməyə icazə verilir.

Sizə lazım olacaq

  • Pusula, hökmdar, qələm, kağız vərəqi.

Təlimatlar

1. Bir dairə çəkin. Pusulanın ayaqları arasında bir az məsafə qoyun. Bu məsafə dairənin radiusu olacaq. Dairəni çəkmək olduqca rahat olacaq şəkildə radiusu seçin. Dairə tamamilə kağız vərəqinə uyğun olmalıdır. Pusulanın ayaqları arasında çox böyük və ya çox kiçik bir məsafə çəkərkən onun dəyişməsinə səbəb ola bilər. Optimal məsafə, kompasın ayaqları arasındakı bucağın 15-30 dərəcə olmasıdır.

2. Düzgün altıbucağın künclərinin uc nöqtələrini çəkin. İğnənin sabit olduğu kompasın ayağını dairənin istənilən nöqtəsinə qoyun. İğne çəkilmiş xətti deşməlidir. Pusula nə qədər düzgün qurulsa, konstruksiya bir o qədər düzgün olar. Daha əvvəl çəkilmiş dairəni kəsəcək şəkildə dairəvi bir qövs çəkin. Pusulanın iynəsini dairə ilə çəkdiyiniz qövsün kəsişməsinə aparın. Dairəni kəsən başqa bir qövs çəkin. Pusula iynəsini qövs və dairənin kəsişdiyi yerə yerləşdirin və qövsü yenidən çəkin. Dairənin ətrafında bir istiqamətdə hərəkət edərək bu hərəkəti daha üç dəfə təkrarlayın. Hər birinin altı qövs və altı kəsişmə nöqtəsi olmalıdır.

3. Müsbət bir altıbucaq qurun. İlk olaraq çəkilmiş dairə ilə qövslərin kəsişdiyi bütün altı nöqtəni addımlarla birləşdirin. Nöqtələri bir hökmdar və qələmlə çəkilmiş düz xətlərlə bağlayın. Daha sonra yerinə yetirilən hərəkətlər bir dairədə yazılmış düzgün altıbucağı alacaq.

Altıbucaqlı altı köşeli və altı tərəfli çoxbucaqlı hesab olunur. Çoxbucaqlar ya qabarıq, ya da içbükeydir. Bir qabarıq altıbucaqlı üçün bütün daxili açılar kəsikdir; içbükey bir üçün bir və ya daha çox açılar kəskindir. Altıbucağın qurulması olduqca asandır. Bu bir neçə addımda edilir.

Sizə lazım olacaq

  • Qələm, kağız vərəqi, hökmdar

Təlimatlar

1. Bir kağız vərəqi götürülür və üzərində 6 -cı şəkil göstərildiyi kimi qeyd olunur. 1.

2. Daha sonra, nöqtələr işarələndikdən sonra bir hökmdar, qələm alınır və onların köməyi ilə nöqtələr Şəkildə göründüyü kimi bir -birinin ardınca bağlanır. 2

Əlaqədar videolar

Qeyd!
Altıbucağın bütün daxili açılarının cəmi 720 dərəcədir.

Altıbucaqlı Altı guşəsi olan çoxbucaqlıdır. Özbaşına bir altıbucaq çəkmək üçün hər 2 hərəkəti etməlisiniz.

Sizə lazım olacaq

  • Qələm, hökmdar, kağız vərəqi.

Təlimatlar

1. Əlinizə bir qələm götürüb vərəqdə 6 ixtiyari nöqtəni qeyd etməlisiniz. Gələcəkdə bu nöqtələr altıbucaqlı açılar rolunu oynayacaq. (şəkil 1)

2. Bir hökmdar götürün və bu nöqtələrə görə əvvəllər çəkilmiş nöqtələrə görə bir -birinə bağlanacaq 6 seqment çəkin (Şəkil 2)

Əlaqədar videolar

Qeyd!
Altıbucağın xüsusi bir növü müsbət altıbucaqlıdır. Bütün tərəfləri və açıları bir -birinə bərabər olduğu üçün belə adlandırılmışdır. Belə bir altıbucaq ətrafında bir dairəni təsvir etməyə və ya yazmağa icazə verilir. Yazılmış dairəyə və altıbucağın yanlarına toxunaraq əldə edilən nöqtələrdə, müsbət altıbucağın tərəflərinin yarıya endirildiyini qeyd etmək lazımdır.

Faydalı məsləhətlər
Təbiətdə müsbət altıbucaqlar çox populyardır. Məsələn, bütün bal pətəyi müsbət altıbucaqlı bir forma malikdir. Ya da qrafenin kristal qəfəsi (karbonun modifikasiyası) həm də müsbət altıbucaqlı formasına malikdir.

Bir və ya digərini necə qurmaq olar enjeksiyon Böyük sualdır. Ancaq bəzi açılar üçün vəzifə görünməz şəkildə sadələşdirilir. Bu açılardan biri budur enjeksiyon 30 dərəcə. Bu, bərabərdir? Bu tikintiyə kömək edir.

Sizə lazım olacaq

  • dirsək, kvadrat, pusula, hökmdar

Təlimatlar

1. Başlamaq üçün əlinizdə bir dirsək olanda xüsusilə ibtidai bir mühit görək. Sonra 30 dərəcə bir açı ilə düz bir xətt onun dəstəyi ilə asanlıqla təxirə salına bilər.

2. İletkiyə əlavə olaraq var enjeksiyon künclərindən biri 30 dərəcə olan niks. Sonra başqa enjeksiyon enjeksiyon ləqəb 60 dərəcəyə bərabər olacaq, yəni vizual olaraq daha kiçik olmalıdır enjeksiyon lazım olan düz xətti qurmaq.

3. İndi 30 dərəcə bir açı qurmağın mənasız yollarına keçək. Bildiyiniz kimi, 30 dərəcə bir açının sinusu 1/2 -dir. Onu qurmaq üçün birbaşa tikməliyik enjeksiyon ny tre enjeksiyon Ləqəb. Bəlkə də iki dik xətt qura bilərik. Ancaq 30 dərəcə teğet irrasional bir rəqəmdir, buna görə yalnız ayaqlar arasındakı nisbəti təxminən hesablaya bilərik (yalnız kalkulyator yoxdursa) və buna görə də qura bilərik. enjeksiyon təxminən 30 dərəcə.

4. Bu vəziyyətdə, dəqiq bir tikinti etməyə icazə verilir. Yenə ayaqlarının birbaşa yerləşəcəyi iki dik düz xətt quraq enjeksiyon yeni tre enjeksiyon nik Bir kompas dəstəyi ilə BC uzunluğunda bir düz ayağı kənara qoyun (B - düz enjeksiyon). Bundan sonra, pusulanın ayaqları arasındakı uzunluğu elementar olan 2 dəfə artıracağıq. Bu uzunluq radiusu ilə C nöqtəsində mərkəzləşdirilmiş bir dairə çəkərək, dairənin başqa bir düz xətt ilə kəsişmə nöqtəsini tapırıq. Bu nöqtə düz A nöqtəsi olacaq enjeksiyon yeni tre enjeksiyon ləqəbi ABC və enjeksiyon A 30 dərəcəyə bərabər olacaq.

5. Dik enjeksiyon 30 dərəcəyə icazə verilir və dairənin dəstəyi ilə bərabər olduğunu tətbiq edərək? / 6. OB radiuslu bir dairə quraq. Nəzəriyyəsinə nəzər salaq enjeksiyon nik, burada OA = OB = R dairənin radiusudur, burada enjeksiyon OAB = 30 dərəcə. OE bu ikili bərabərliyin hündürlüyü olsun enjeksiyon nika və buna görə də onun biseksiya və medianıdır. Sonra enjeksiyon AOE = 15 dərəcə və yarım açı düsturundan istifadə edərək sin (15o) = (sqrt (3) -1) / (2 * sqrt (2)). Buna görə də AE = R * sin (15o). Buradan AB = 2AE = 2R * sin (15o). B nöqtəsində mərkəzləşdirilmiş BA radiuslu bir dairə quraraq, bu dairənin A ilə kəsişmə nöqtəsini birincisi ilə tapırıq. AOB 30 dərəcə olacaq.

6. Qövslərin uzunluğunu bir şəkildə təyin edə bilsək, o zaman uzunluq qövsünü kənara qoyaq? * R / 6, biz də enjeksiyon 30 dərəcə.

Qeyd!
Yadda saxlamaq lazımdır ki, 5 -ci nöqtədə yalnız təxminən bucaq qura bilərik, çünki hesablamalarda irrasional ədədlər görünəcək.

Altıbucaqlıçoxbucaqlı xüsusi bir vəziyyət deyilir - bir təyyarənin çox nöqtəsindən əmələ gəlmiş, qapalı bir polyline ilə sərhədlənmiş bir rəqəm. Müsbət bir altıbucaq (altıbucaq) da öz növbəsində xüsusi bir haldır - altı bərabər tərəfli və bərabər açılı bir çoxbucaqlıdır. Bu rəqəm, bütün tərəflərinin uzunluğunun rəqəm ətrafında təsvir olunan dairənin radiusuna bərabər olması baxımından əhəmiyyətlidir.

Sizə lazım olacaq

  • - kompas;
  • - hökmdar;
  • - qələm;
  • - kağız.

Təlimatlar

1. Altıbucağın tərəfinin uzunluğunu seçin. Bir kompas götürün və ayaqlarından birində yerləşən iynənin ucu ilə digər ayağında yerləşən qələmin ucu arasındakı məsafəni çəkilmiş fiqurun tərəfinin uzunluğuna bərabər olaraq təyin edin. Bunu etmək üçün bir hökmdardan istifadə etməyə və ya məqam əhəmiyyətsiz olduqda təsadüfi bir məsafəyə üstünlük verməyə icazə verilir. Mümkünsə kompasın ayaqlarını vida ilə düzəldin.

2. Pusula ilə bir dairə çəkin. Ayaqlar arasındakı seçilmiş məsafə dairənin radiusu olacaq.

3. Nöqtələri olan dairəni altı bərabər hissəyə bölün. Bu nöqtələr altıbucağın künclərinin təpələri və buna görə də tərəflərini təmsil edən seqmentlərin ucları olacaq.

4. Pusulanın ayağını iynə ilə müəyyən edilmiş dairənin xəttində yerləşən ixtiyari bir nöqtəyə qoyun. İğne xətti düzgün deşməlidir. Konstruksiyaların dəqiqliyi birbaşa kompas ayarının düzgünlüyündən asılıdır. Pusula ilə bir qövs çəkin ki, əvvəlcə çəkilmiş dairəni 2 nöqtədə keçsin.

5. Pusula ayağını iynə ilə çəkilmiş qövsün orijinal dairəsi ilə kəsişmə nöqtələrindən birinə aparın. Dairəni 2 nöqtədə kəsərək başqa bir qövs çəkin (onlardan biri pusula iynəsinin əvvəlki yerinin nöqtəsi ilə üst -üstə düşəcək).

6. Eyni şəkildə, pusulanın iynəsini yenidən düzəldin və daha dörd dəfə qövs çəkin. Pusulanın ayağını iynə ilə dairənin ətrafında bir istiqamətdə hərəkət etdirin (həmişə saat əqrəbi və ya saat əqrəbinin əksinə). Nəticədə, qövslərin əvvəlcə qurulmuş dairə ilə kəsişməsinin altı nöqtəsi müəyyən edilməlidir.

7. Müsbət bir altıbucaq çəkin. Əvvəlki addımda əldə edilən altı nöqtəni addım -addım cütləşdirin. Qələm və hökmdarla xətlərin hissələrini çəkin. Nəticədə düzgün altıbucaq əldə ediləcək. Daha sonra, tikinti köməkçi elementləri (qövs və dairələr) silməyə icazə verilir.

Qeyd!
Kompasın ayaqları arasında belə bir məsafə seçmək yaxşıdır ki, aralarındakı bucaq 15-30 dərəcəyə bərabər olsun, əksinə tikərkən bu məsafə asanlıqla itirə bilər.

Ev dizayn planları qurarkən və ya inkişaf etdirərkən, tez -tez tikmək tələb olunur enjeksiyon, daha yaxın olana bərabərdir. Nümunələr və məktəb həndəsəsi bacarıqları dəstəyə gəlir.

Təlimatlar

1. Bir nöqtədən başlayaraq iki düz xətt meydana gəlir. Bu nöqtə küncün zirvəsi adlanacaq və xətlər küncün tərəfləri olacaq.

2. Küncləri göstərmək üçün üç hərfdən istifadə edin: biri yuxarıda, ikisi yan tərəfdə. Cağırılır enjeksiyon, bir tərəfdə dayanan hərflə başlayaraq, yuxarıda duran hərf, sonra isə digər tərəfdəki hərf deyilir. Bunun əksinə daha rahatsınızsa, bucaqları işarələmək üçün başqa üsullardan istifadə edin. Bəzən yuxarıda dayanan yalnız bir hərf deyilir. Yunan hərfləri ilə açıları təyin etməyə icazə verilir, məsələn, α, β, γ.

3. Çəkmək lazım olduğu vəziyyətlər var enjeksiyon verilmiş bucağa daha yaxın olması üçün. Bir rəsm qurarkən bir iletkeni istifadə etmək ehtimalı yoxdursa, yalnız bir hökmdar və pusula ilə etməyə icazə verilir. Mümkündür, MN hərfləri ilə rəsmdə qeyd olunan düz xəttin üzərində ucaltmaq lazımdır enjeksiyon K nöqtəsində, B açısına bərabərdir. Yəni K nöqtəsindən MN xətti ilə düz bir xətt çəkmək lazımdır. enjeksiyon, B bucağına bərabər olacaq.

4. Başlanğıcda, bu küncün bütün tərəfindəki bir nöqtəni, məsələn, A və C nöqtələrini süpürün, sonra C və A nöqtələrini düz bir xətt ilə birləşdirin. Tre alın enjeksiyon Nik ABC.

5. İndi eyni üç MN xəttini qurun enjeksiyon bir ləqəbdir ki, B nöqtəsi K nöqtəsindədir. Ağac tikmək üçün qaydanı istifadə edin enjeksiyonüç tərəfdən nika. K nöqtəsindən KL seqmentini kənara qoyun. BC seqmentinə bərabər olmalıdır. L nöqtəsi alın.

6. K nöqtəsindən radiusu BA seqmentinə bərabər olan bir dairə çəkin. CA radiuslu L -dən bir dairə çəkin. 2 dairənin K ilə kəsişməsinin əldə edilmiş nöqtəsini (P) birləşdirin. enjeksiyon ləqəbi KPL, üçə bərabər olacaq enjeksiyon Nik ABC. Beləliklə, əldə edirsən enjeksiyon K. B bucağına bərabər olacaq. Bu konstruksiyanı daha rahat və daha sürətli etmək üçün, ayaqlarını hərəkət etdirmədən, bir kompas həllindən istifadə edərək, B -nin yuxarı hissəsindən bərabər seqmentləri ayırın, nöqtədən eyni radiuslu bir dairəni təsvir edin. K.

Əlaqədar videolar

Qeyd!
Pusulanın ayaqları arasındakı məsafənin təsadüfən metamorfozundan çəkinin. Bu vəziyyətdə altıbucağın səhv olduğu ortaya çıxa bilər.

Faydalı məsləhətlər
Mükəmməl itilənmiş qurğuşunla kompas istifadə edərək konstruksiyalar qurmaqda ustadır. Bu, konstruksiyaları xüsusilə dəqiq edəcək.

Yaxınlığınızda qələm varmı? Bölməsinə bir nəzər yetirin - bu müntəzəm bir altıbucaq və ya adlandığı kimi altıbucaqlıdır. Bir qozun, altıbucaqlı şahmat sahəsinin, bəzi kompleks karbon molekullarının (məsələn, qrafit), bir qar uçqununun, bir bal pətəyinin və digər cisimlərin də bu forması vardır. Bu yaxınlarda nəhəng bir müntəzəm altıbucaq kəşf edildi Daha yaxından nəzər salaq.

Normal bir altıbucaq, altı bərabər tərəfi və bərabər açısı olan çoxbucaqlıdır. Məktəb kursundan bilirik ki, aşağıdakı xüsusiyyətlərə malikdir:

  • Yanlarının uzunluğu, dairə ilə əhatə olunmuş dairənin radiusuna uyğundur. Ümumiyyətlə, yalnız müntəzəm bir altıbucaq bu xüsusiyyətə malikdir.
  • Bucaqlar bir -birinə bərabərdir və hər birinin böyüklüyü 120 ° -dir.
  • Altıbucağın perimetri P = 6 * R düsturu ilə tapıla bilər, əgər ətrafındakı işarələnmiş dairənin radiusu məlumdursa və ya dairə yazılıbsa P = 4 * √ (3) * r. R və r, dairənin və dairənin radiuslarıdır.
  • Daimi bir altıbucağın tutduğu sahə belə müəyyən edilir: S = (3 * √ (3) * R 2) / 2. Radius bilinmirsə, bunun əvəzinə tərəflərdən birinin uzunluğunu əvəz edirik - bildiyiniz kimi, dairəvi dairənin radiusunun uzunluğuna uyğundur.

Daimi altıbucağın təbiətdə çox yayılmış bir maraqlı xüsusiyyəti var - təyyarənin istənilən səthini üst -üstə düşmədən və boşluqlar olmadan doldurmaq qabiliyyətinə malikdir. Hətta sözdə Pal lemması var, buna görə tərəfi 1 / √ (3) bərabər olan altıbucaqlı universal bir örtükdür, yəni diametri bir vahid olan hər hansı bir dəsti əhatə edə bilər.

İndi adi bir altıbucaq qurmağa baxaq. Bir neçə yol var ki, bunlardan ən sadə üsulu kompas, qələm və hökmdardan istifadə etməkdir. Əvvəlcə pusula ilə ixtiyari bir dairə çəkirik, sonra bu dairənin ixtiyari bir yerində bir nöqtə qoyuruq. Pusulanın həllini dəyişdirmədən, ucunu bu nöqtəyə qoyuruq, dairənin növbəti hissəsini qeyd edirik, bütün 6 nöqtəni alana qədər bu şəkildə davam edirik. İndi onları düz seqmentlərlə birləşdirmək qalır və istədiyiniz rəqəmi alacaqsınız.

Praktikada böyük bir altıbucaq çəkmək lazım olduğu vaxtlar olur. Məsələn, iki səviyyəli alçıpan tavanında, mərkəzi çilçırağın montaj nöqtəsinin ətrafında, alt səviyyəyə altı kiçik lampa quraşdırmalısınız. Bu ölçülü bir kompas tapmaq çox çətin olacaq. Bu vəziyyətdə nə etməli? Ümumiyyətlə necə böyük bir dairə çəkirsiniz? Çox sadə. Lazım olan uzunluqda güclü bir ip götürməlisiniz və uclarından birini qələmin əksinə bağlamalısınız. İndi ipin ikinci ucunu istədiyiniz nöqtədə tavana basacaq bir köməkçi tapmaq qalır. Əlbəttə ki, bu vəziyyətdə xırda səhvlər mümkündür, lakin heç kimin kənar adam üçün nəzərə çarpması ehtimalı azdır.



Oxşar nəşrlər