Regulāra sešstūra konstrukcija - kā uzzīmēt sešstūri. Kā izveidot regulāru sešstūri Kā uzzīmēt sešstūri ar zīmuli

Vai jūsu tuvumā ir zīmulis? Apskatiet tās sadaļu - tas ir regulārs sešstūris vai, kā to sauc arī, sešstūris. Šāda forma ir arī rieksta, sešstūra šaha lauka, dažu sarežģītu oglekļa molekulu (piemēram, grafīta), sniegpārsliņas, šūnveida un citu priekšmetu šķērsgriezumam. Nesen tika atklāts gigantisks regulārs sešstūris. Vai nešķiet dīvaini, ka daba tik bieži savos darbos izmanto šādas formas struktūras? Apskatīsim tuvāk.

Regulārs sešstūris ir daudzstūris ar sešām vienādām malām un vienādiem leņķiem. No skolas kursa mēs zinām, ka tai ir šādas īpašības:

  • Tās malu garums atbilst ierobežotā apļa rādiusam. No visiem šī īpašība ir tikai parastam sešstūrim.
  • Leņķi ir vienādi viens ar otru, un katra lielums ir 120 °.
  • Sešstūra perimetru var atrast, izmantojot formulu Р=6*R, ja ir zināms ap to apzīmētā riņķa rādiuss, vai Р=4*√(3)*r, ja tajā ir ierakstīts aplis. R un r ir norobežoto un ierakstīto apļu rādiusi.
  • Platību, ko aizņem regulārs sešstūris, nosaka šādi: S=(3*√(3)*R 2)/2. Ja rādiuss nav zināms, mēs tā vietā aizstājam vienas malas garumu - kā zināms, tas atbilst ierobežotā apļa rādiusa garumam.

Regulārajam sešstūrim ir viena interesanta iezīme, kuras dēļ tas ir kļuvis tik plaši izplatīts dabā - tas spēj aizpildīt jebkuru plaknes virsmu bez pārlaidumiem un atstarpēm. Ir pat tā sauktā Pal lemma, saskaņā ar kuru regulārs sešstūris, kura mala ir vienāda ar 1/√(3), ir universāla riepa, tas ir, tā var nosegt jebkuru komplektu ar vienas vienības diametru.

Tagad apsveriet regulāra sešstūra uzbūvi. Ir vairāki veidi, no kuriem vienkāršākais ir izmantot kompasu, zīmuli un lineālu. Vispirms ar kompasu uzzīmējam patvaļīgu apli, pēc tam uz šī apļa uzliekam punktu patvaļīgā vietā. Nemainot kompasa risinājumu, uzliekam galu šajā punktā, atzīmējam nākamo iecirtumu uz apļa, turpinām šādi, līdz iegūstam visus 6 punktus. Tagad atliek tikai savienot tos savā starpā ar taisniem segmentiem, un izrādīsies vēlamā figūra.

Praksē ir gadījumi, kad ir nepieciešams uzzīmēt lielu sešstūri. Piemēram, uz divlīmeņu ģipškartona griestiem, ap centrālās lustras stiprinājuma punktu, apakšējā līmenī ir jāuzstāda sešas mazas lampas. Būs ļoti, ļoti grūti atrast šāda izmēra kompasu. Kā rīkoties šajā gadījumā? Kā uzzīmēt lielu apli? Ļoti vienkārši. Jums jāņem stiprs vajadzīgā garuma pavediens un viens no tā galiem jāpiesien pretī zīmulim. Tagad atliek tikai atrast palīgu, kurš vītnes otro galu piespiestu pie griestiem īstajā vietā. Protams, šajā gadījumā ir iespējamas nelielas kļūdas, taču maz ticams, ka tās vispār būs pamanāmas.

Saturs:

Parastajam sešstūrim, ko sauc arī par perfektu sešstūri, ir sešas vienādas malas un seši vienādi leņķi. Jūs varat uzzīmēt sešstūri ar mērlenti un transportieri, aptuvenu sešstūri ar apaļu priekšmetu un lineālu vai vēl raupjāku sešstūri, izmantojot tikai zīmuli un nelielu intuīciju. Ja vēlaties uzzināt, kā dažādos veidos uzzīmēt sešstūri, vienkārši lasiet tālāk.

Soļi

1 Ar kompasu uzzīmējiet perfektu sešstūri

  1. 1 Uzzīmējiet apli, izmantojot kompasu. Ievietojiet zīmuli kompasā. Izvērsiet kompasu līdz vajadzīgajam apļa rādiusa platumam. Rādiuss var būt no pāris līdz desmitiem centimetru plats. Pēc tam uz papīra uzlieciet kompasu ar zīmuli un uzzīmējiet apli.
    • Dažreiz ir vieglāk vispirms uzzīmēt apļa pusi un pēc tam otru pusi.
  2. 2 Pārvietojiet kompasa adatu uz apļa malu. Ielieciet to apļa augšpusē. Nemainiet kompasa leņķi un pozīciju.
  3. 3 Apļa malā izveidojiet nelielu zīmuļa atzīmi. Padariet to atšķirīgu, bet ne pārāk tumšu, jo vēlāk to izdzēsīsit. Atcerieties saglabāt kompasam iestatīto leņķi.
  4. 4 Pārvietojiet kompasa adatu uz tikko izveidoto atzīmi. Uzstādiet adatu taisni uz atzīmes.
  5. 5 Ar zīmuli izveidojiet vēl vienu atzīmi apļa malā. Tādējādi jūs veiksit otro atzīmi noteiktā attālumā no pirmās atzīmes. Turpiniet kustēties vienā virzienā.
  6. 6 Tādā pašā veidā veiciet vēl četras atzīmes. Jums jāatgriežas pie sākotnējās atzīmes. Ja nē, tad visticamāk ir mainījies leņķis, kādā turējāt kompasu un izdarījāt atzīmes. Varbūt tas notika tāpēc, ka jūs to saspiedāt pārāk stipri vai, gluži pretēji, nedaudz atlaidāt.
  7. 7 Savienojiet atzīmes ar lineālu. Sešas vietas, kur jūsu atzīmes krustojas ar apļa malu, ir sešstūra virsotnes. Izmantojot lineālu un zīmuli, zīmējiet taisnas līnijas, kas savieno blakus esošās zīmes.
  8. 8 Izdzēsiet gan apli, gan atzīmes uz apļa malām, kā arī visas citas atzīmes, ko esat izveidojis. Kad esat izdzēsis visas vadošās līnijas, jūsu ideālajam sešstūrim vajadzētu būt gatavam.

2 Uzzīmējiet aptuvenu sešstūri ar apaļu priekšmetu un lineālu

  1. 1 Apvelciet glāzes malu ar zīmuli. Tādā veidā jūs uzzīmēsit apli. Ir ļoti svarīgi zīmēt ar zīmuli, jo vēlāk vajadzēs izdzēst visas palīglīnijas. Varat arī apvilkt apgrieztu glāzi, burku vai jebko citu, kam ir apaļa pamatne.
  2. 2 Zīmējiet horizontālas līnijas pāri apļa centram. Varat izmantot lineālu, grāmatu, jebko ar taisnu malu. Ja jums ir lineāls, varat atzīmēt vidu, aprēķinot apļa vertikālo garumu un sadalot to uz pusēm.
  3. 3 Uzzīmējiet "X" virs pusapļa, sadalot to sešās vienādās daļās. Tā kā jūs jau esat novilcis līniju cauri apļa vidum, X ir jābūt platākam par tā augstumu, lai daļas būtu vienādas. Iedomājieties, ka jūs sadalāt picu sešās daļās.
  4. 4 No katras sadaļas izveidojiet trīsstūrus. Lai to izdarītu, izmantojiet lineālu, lai zem katras sadaļas izliektās daļas novilktu taisnu līniju, savienojot to ar pārējām divām līnijām, veidojot trīsstūri. Dariet to ar atlikušajām piecām sadaļām. Padomājiet par to kā par garozas veidošanu ap picas šķēlītēm.
  5. 5 Dzēst visas palīgrindas. Vadlīnijās ir iekļauts jūsu aplis, trīs līnijas, kas sadalīja jūsu apli daļās, un visas citas atzīmes, ko esat izdarījis ceļā.

3. Ar vienu zīmuli uzzīmējiet aptuvenu sešstūri

  1. 1 Zīmējiet horizontālu līniju. Lai novilktu taisnu līniju bez lineāla, vienkārši uzzīmējiet horizontālās līnijas sākuma un beigu punktu. Pēc tam novietojiet zīmuli sākuma punktā un pagariniet līniju līdz galam. Šīs līnijas garums var būt tikai pāris centimetri.
  2. 2 No horizontālās līnijas galiem novelciet divas diagonālas līnijas. Kreisajā pusē esošajai diagonālajai līnijai jābūt vērstai uz āru tāpat kā diagonālajai līnijai labajā pusē. Varat iedomāties, ka šīs līnijas veido 120 grādu leņķi attiecībā pret horizontālo līniju.
  3. 3 Uzzīmējiet vēl divas horizontālas līnijas, kas nāk no pirmajām uz iekšu novilktajām horizontālajām līnijām. Tādējādi tiks izveidots pirmo divu diagonālo līniju spoguļattēls. Apakšējai kreisajai līnijai ir jāatspoguļo augšējā kreisā līnija, bet apakšējā labajā - augšējās labās līnijas atspoguļojumā. Augšējām horizontālajām līnijām jābūt vērstām uz āru, bet apakšējām līnijām jābūt vērstām uz iekšpusi pie pamatnes.
  4. 4 Uzzīmējiet vēl vienu horizontālu līniju, savienojot divas apakšējās diagonālās līnijas. Tādā veidā jūs uzzīmēsit sešstūra pamatu. Ideālā gadījumā šai līnijai jābūt paralēlai augšējai horizontālajai līnijai. Šeit jūs esat pabeidzis savu sešstūri.
  • Zīmulim un kompasiem jābūt asiem, lai samazinātu kļūdas no pārāk platām atzīmēm.
  • Izmantojot kompasa metodi, ja savienojat katru atzīmi, nevis visas sešas, jūs iegūstat vienādmalu trīsstūri.

Brīdinājumi

  • Kompass ir diezgan ass priekšmets, esiet ar to ļoti uzmanīgi.

Darbības princips

  • Katra metode palīdzēs uzzīmēt sešstūri, ko veido seši vienādmalu trīsstūri ar rādiusu, kas vienāds ar visu malu garumu. Seši novilktie rādiusi ir vienāda garuma, un visas līnijas, lai izveidotu sešstūri, arī ir vienāda garuma, jo kompasa platums nemainījās. Sakarā ar to, ka seši trīsstūri ir vienādmalu, leņķi starp to virsotnēm ir 60 grādi.

Kas jums būs nepieciešams

  • Papīrs
  • Zīmulis
  • Lineāls
  • Kompasu pāris
  • Kaut ko, ko var likt zem papīra, lai kompasa adata neslīdētu.
  • Dzēšgumija

Regulāru ierobežotu trīsstūri veido šādi(38. attēls). No dotā rādiusa apļa centra R1 uzzīmējiet apli ar rādiusu R2 = 2R1 un sadaliet to trīs vienādās daļās. sadalīšanas punkti A, B, C ir regulāra trijstūra virsotnes, kas norobežotas ap rādiusa apli R1 .

38. attēls

Regulārs ierobežots četrstūris (kvadrāts) var uzbūvēt, izmantojot kompasu un lineālu (39. attēls). Dotajā aplī ir novilkti divi savstarpēji perpendikulāri diametri. Ņemot par centriem diametru krustošanās punktus ar apli, apļa rādiusu R apraksta lokus līdz to savstarpējam krustojumam punktos A, B, C, D . punktus A , B , C , D un ir kvadrāta virsotnes, kas apzīmētas ap doto apli.

39. attēls

Lai izveidotu regulāru ierobežotu sešstūri vispirms ir jāveido aprakstītā kvadrāta virsotnes iepriekš norādītajā veidā (40. attēls, a). Vienlaicīgi ar kvadrāta virsotņu definīciju, dots rādiusa aplis R sadalīts sešās vienādās daļās punktos 1, 2, 3, 4, 5, 6 un uzzīmējiet kvadrāta vertikālās malas. Izejot cauri apļa dalīšanas punktiem 2–5 Un 3–6 taisnas līnijas, līdz tās krustojas ar kvadrāta vertikālajām malām (40. attēls, b), iegūstiet virsotnes A, B, D, E ierobežots regulārs sešstūris.

40. attēls

Citas virsotnes C Un F definēts ar rādiusa apļa loku OA, kuru zīmē līdz krustojas ar dotā apļa vertikālā diametra turpinājumu.
3 PĀROS

Mācīsimies uzzīmēt sešstūra prizmu dažādās pozīcijās.

Apgūstiet dažādus veidus, kā veidot parastu sešstūri, veidojiet sešstūru rasējumus, pārbaudiet to konstrukcijas pareizību. Pamatojoties uz sešstūriem, izveidojiet sešstūra prizmas.

Apsveriet sešstūra prizmu attēlā. 3.52 un tā ortogonālās projekcijas att. 3.53. Sešstūra prizmas (heksaedra) pamatnē ir regulāri sešstūri, sānu malas ir identiski taisnstūri. Lai pareizi attēlotu sešstūri perspektīvā, vispirms jāiemācās pareizi attēlot tā pamatni perspektīvā (3.54. att.). Sešstūrī attēlā. 3.55 virsotnes ir numurētas no viena līdz sešām. Ja savienojat punktus 1 un 3, 4 un 6 ar vertikālām līnijām, pamanīsit, ka šīs līnijas kopā ar apļa centra punktu sadala diametru 5 - 2 četros vienādos segmentos (šie segmenti ir apzīmēti ar lokiem ). Sešstūra pretējās malas ir paralēlas viena otrai un taisna līnija, kas iet caur tā centru un savieno divas virsotnes (piemēram, malas 6 - 1 un 4 - 3 ir paralēlas līnijai 5 - 2). Šie novērojumi palīdzēs jums izveidot sešstūri perspektīvā un arī pārbaudīt šīs konstrukcijas pareizību. Ir divi veidi, kā no attēlojuma izveidot regulāru sešstūri: pamatojoties uz ierobežotu apli un pamatojoties uz kvadrātu.

Pamatojoties uz ierobežoto apli. Apsveriet att. 3.56. Visas regulāra sešstūra virsotnes pieder ierobežotam riņķim, kura rādiuss ir vienāds ar sešstūra malu.


Horizontālais sešstūris. Uzzīmējiet horizontālu elipsi ar patvaļīgu atvērumu, tas ir, perspektīvā ierobežotu apli. Tagad uz tā jāatrod seši punkti, kas ir sešstūra virsotnes. Caur tā centru izvelciet jebkuru dotā apļa diametru (3.57. att.). Diametra galējie punkti - 5 un 2, kas atrodas uz elipses, ir sešstūra virsotnes. Lai atrastu atlikušās virsotnes, šis diametrs ir jāsadala četros identiskos segmentos. Diametrs jau ir sadalīts ar apļa centra punktu divos rādiusos, atliek katru rādiusu sadalīt uz pusēm. Perspektīvā zīmējumā visi četri segmenti vienmērīgi saraujas, attālinoties no skatītāja (3.58. att.). Tagad velciet cauri rādiusu viduspunktiem - punkti A un B - taisnes, kas ir perpendikulāras taisnei 5 - 2. To virzienu varat atrast, izmantojot elipses pieskares 5. un 2. punktos (3.59. att.). Šīs pieskares būs perpendikulāras diametram 5 - 2, un līnijas, kas novilktas caur punktiem A un B, kas ir paralēlas šīm pieskarēm, būs arī perpendikulāras taisnei 5 - 2. Apzīmējiet punktus, kas iegūti šo līniju krustpunktā ar elipsi kā 1, 3, 4, 6 (3.60. att.). Savieno visas sešas virsotnes ar taisnēm (3.61. att.).

Pārbaudiet savas konstrukcijas pareizību dažādos veidos. Ja konstrukcija ir pareiza, tad taisnes, kas savieno sešstūra pretējās virsotnes, krustojas apļa centrā (3.62. att.), un sešstūra pretējās malas ir paralēlas atbilstošajiem diametriem (3.63. att.). Cita pārbaudes metode ir parādīta attēlā. 3.64.

Vertikāls sešstūris. Šādā sešstūrī līnijas, kas savieno punktus 7 un 3, b un 4, kā arī ierobežotā apļa pieskares punktos 5 un 2, ir vertikālā virzienā un saglabā to perspektīvas zīmējumā. Tādējādi, zīmējot divas elipses vertikālās pieskares, mēs atrodam punktus 5 un 2 (pieskāriena punkti). Savienojiet tos ar taisnu līniju un pēc tam sadaliet iegūto diametru 5 - 2 4 vienādos segmentos, ņemot vērā to perspektīvos griezumus (3.65. att.). Novelciet vertikālas līnijas caur punktiem A un B, un to krustpunktā ar elipsi atrodiet punktus 1,3,6l4. Pēc tam secīgi savienojiet punktus 1 - 6 ar taisnām līnijām (3.66. att.). Pārbaudiet sešstūra konstrukcijas pareizību tāpat kā iepriekšējā piemērā.

Aprakstītā sešstūra konstruēšanas metode ļauj iegūt šo skaitli, pamatojoties uz apli, kuru ir vieglāk attēlot perspektīvā nekā kvadrātu ar noteiktām proporcijām. Tāpēc šī sešstūra konstruēšanas metode šķiet visprecīzākā un universālākā. Kvadrātveida konstrukcijas metode ļauj viegli uzzīmēt sešstūri, kad attēlā jau ir kubs, citiem vārdiem sakot, kad ir noteiktas kvadrāta proporcijas un tā malu virziens.

Kvadrātveida. Apsveriet att. 3.67. Sešstūris, kas ierakstīts kvadrātā horizontālā virzienā 5 - 2, ir vienāds ar kvadrāta malu un vertikāli mazāks par tā garumu.

Vertikāls sešstūris. Uzzīmējiet vertikālu kvadrātu perspektīvā. Novelciet taisnu līniju caur diagonāļu krustpunktu, paralēli tās horizontālajām malām. Sadaliet iegūto segmentu 5 - 2 četrās vienādās daļās un novelciet vertikālas līnijas caur punktiem A un B (3.68. att.). Līnijas, kas ierobežo sešstūri no augšas un apakšas, nesakrīt ar kvadrāta malām. Zīmējiet tos noteiktā attālumā (1114 a) no kvadrāta horizontālajām malām un paralēli tām. Savienojot šādā veidā atrastos punktus 1 un 3 ar punktu 2, bet punktus 6 un 4 ar punktu 5, iegūstam sešstūri (3.69. att.).

Horizontālais sešstūris ir uzbūvēts tādā pašā secībā (3.70. un 3.71. att.).

Šī konstrukcijas metode ir piemērota tikai sešstūriem ar pietiekamu atvērumu. Ja sešstūra atvērums ir nenozīmīgs, labāk ir izmantot metodi, kuras pamatā ir ierobežots aplis. Lai pārbaudītu sešstūri, kas uzbūvēts caur kvadrātu, varat izmantot jums jau zināmās metodes.

Turklāt ir vēl viens - lai aprakstītu apli ap iegūto sešstūri (jūsu attēlā - elipse). Visām sešstūra virsotnēm ir jāpieder šai elipsei.

Apgūstot sešstūra zīmēšanas prasmes, jūs brīvi pāriesit uz sešstūra prizmas zīmēšanu. Uzmanīgi apskatiet diagrammu attēlā. 3.72, kā arī shēmas sešstūra prizmu konstruēšanai, pamatojoties uz apli (3.73. att.; 3.74. un 3.75.) un uz kvadrāta bāzes (3.76. att.; 3.77. un 3.78.). Zīmējiet vertikālos un horizontālos sešstūrus dažādos veidos. Vertikālā sešstūra zīmējumā sānu virsmu garās malas būs vertikālas līnijas, kas ir paralēlas viena otrai, un pamata sešstūris būs atvērtāks, jo tālāk tas atrodas no horizonta līnijas. Horizontālā sešstūra zīmējumā sānu skaldņu garās malas saplūdīs pazušanas punktā pie horizonta, un pamata sešstūra atvērums būs jo lielāks, jo tālāk tas atrodas no skatītāja. Attēlojot sešstūri, arī jāpārliecinās, ka abu pamatu paralēlās skaldnes perspektīvā saplūst (3.79. att.; 3.80.).

Dažās spēlēs tiek izmantoti sešstūru režģi (sešstūra režģi), taču tie nav tik vienkārši un izplatīti kā taisnstūru režģi. Jau gandrīz 20 gadus esmu apkopojis resursus par sešstūra režģiem, un esmu uzrakstījis šo rokasgrāmatu par elegantākajām pieejām, kas ieviestas vienkāršākajā kodā. Rakstā bieži tiek izmantotas Charles Fu un Clark Verbrugge rokasgrāmatas. Es aprakstīšu dažādus sešstūra režģu veidošanas veidus, to attiecības, kā arī izplatītākos algoritmus. Daudzas šī raksta daļas ir interaktīvas: izvēloties režģa veidu, tiek mainītas atbilstošās diagrammas, kods un teksti. (Piezīme par .: tas attiecas tikai uz oriģinālu, iesaku to izpētīt. Tulkojumā tiek saglabāta visa oriģināla informācija, bet bez interaktivitātes.).

Rakstā iekļautie kodu piemēri ir rakstīti pseidokodā, tāpēc tos ir vieglāk lasīt un saprast, lai varētu izveidot savu implementāciju.

Ģeometrija

Sešstūri ir sešstūra daudzstūri. Parastajiem sešstūriem visas malas (virsmas) ir vienāda garuma. Mēs strādāsim tikai ar parastajiem sešstūriem. Parasti sešstūra režģos tiek izmantota horizontāla (asa augšdaļa) un vertikāla (līdzena augšdaļa) orientācija.


Plakani (pa kreisi) un asi (pa labi) ar augšējo sešstūri

Sešstūriem ir 6 skaldnes. Katru seju dala divi sešstūri. Sešstūriem ir 6 stūra punkti. Katru stūra punktu dala trīs sešstūri. Vairāk par centriem, malām un stūra punktiem varat lasīt manā rakstā par sieta daļām (kvadrātiem, sešstūriem un trīsstūriem).

stūriem

Parastā sešstūrī iekšējie leņķi ir 120°. Ir seši "ķīļi", no kuriem katrs ir vienādmalu trīsstūris ar iekšējiem leņķiem 60°. stūra punkts i ir (60° * i) + 30° , izmēra vienības no centra . Kodā:

Funkcija hex_corner(center, size, i): var leņķis_deg = 60 * i + 30 var leņķis_rad = PI / 180 * leņķis_grāds return Point(centrs.x + izmērs * cos(leņķis_rad), centrs.y + izmērs * sin(leņķa_rad) )
Lai aizpildītu sešstūri, jums jāiegūst daudzstūra virsotnes no hex_corner(…, 0) līdz hex_corner(…, 5). Lai uzzīmētu sešstūra kontūru, jāizmanto šīs virsotnes un pēc tam vēlreiz jānovelk līnija hex_corner(…, 0) .

Atšķirība starp abām orientācijām ir tāda, ka x un y tiek apmainīti, kā rezultātā mainās leņķi: plakaniem augšējiem sešstūriem ir 0°, 60°, 120°, 180°, 240°, 300° leņķi, savukārt asiem augšējiem sešstūriem ir leņķi. 30°, 90°, 150°, 210°, 270°, 330°.


Sešstūra stūri ar plakanu un asu augšdaļu

Izmērs un atrašanās vieta

Tagad mēs vēlamies vairākus sešstūrus sakārtot kopā. Ainavas orientācijā sešstūra augstums ir augstums = izmērs * 2 . Vertikālais attālums starp blakus esošajiem sešstūriem ir vert = augstums * 3/4.

Sešstūra platums ir platums = sqrt(3)/2 * augstums. Horizontālais attālums starp blakus esošajiem sešstūriem horiz = platums .

Dažās spēlēs sešstūriem tiek izmantots pikseļu attēls, kas precīzi neatbilst pareizajiem sešstūriem. Šajā sadaļā aprakstītās leņķa un pozīcijas formulas nesakritīs ar šādu sešstūru izmēriem. Pārējā raksta daļa, kurā aprakstīti sešstūra režģa algoritmi, attiecas pat tad, ja sešstūri ir nedaudz izstiepti vai saspiesti.



Koordinātu sistēmas

Sāksim sešstūru salikšanu režģī. Kvadrātu režģu gadījumā ir tikai viens acīmredzams montāžas veids. Sešstūriem ir daudz pieeju. Kā primāro attēlojumu iesaku izmantot kubiskās koordinātas. Aksiālās koordinātas vai nobīdes koordinātas ir jāizmanto, lai saglabātu kartes un parādītu koordinātas lietotājam.

Nobīdes koordinātas

Visizplatītākā pieeja ir kompensēt katru nākamo kolonnu vai rindu. Kolonnas apzīmē ar kolonnu vai q . Rindas tiek apzīmētas ar rindu vai r . Varat nobīdīt nepāra vai pāra kolonnas/rindas, tāpēc horizontālajiem un vertikālajiem sešstūriem ir divas iespējas.


Horizontāls izvietojums "nepāra-r"


Horizontāls izvietojums "vienmērīgs-r"


Vertikālais izvietojums "nepāra-q"


Vertikālais izvietojums "vienmērīgs-q"

Kubiskās koordinātas

Vēl viens veids, kā aplūkot sešstūru režģus, ir redzēt tajos trīs galvenās asis, nevis divi, tāpat kā kvadrātu režģos. Tie parāda elegantu simetriju.

Ņem kubu režģi un izgriezt diagonālā plakne pie x + y + z = 0 . Šī ir dīvaina ideja, taču tā mums palīdzēs vienkāršot sešstūra režģa algoritmus. Jo īpaši varēsim izmantot standarta darbības no Dekarta koordinātām: koordinātu summēšanu un atņemšanu, reizināšanu un dalīšanu ar skalāru vērtību, kā arī attālumus.

Ievērojiet trīs galvenās asis kubu režģī un to saistību ar sešām diagonāli sešstūru režģa virzieni. Režģa diagonālās asis atbilst sešstūru režģa galvenajam virzienam.


Sešstūri


Kuba

Tā kā mums jau ir algoritmi kvadrātu un kubu režģiem, kubisko koordinātu izmantošana ļauj pielāgot šos algoritmus sešstūru režģiem. Es izmantošu šo sistēmu lielākajai daļai raksta algoritmu. Lai izmantotu algoritmus ar atšķirīgu koordinātu sistēmu, es pārveidošu kubiskās koordinātas, palaidīšu algoritmu un pēc tam pārveidoju tās atpakaļ.

Uzziniet, kā darbojas kubiskās koordinātas sešstūru režģim. Izvēloties sešstūrus, tiek izceltas kubiskās koordinātas, kas atbilst trim asīm.

  1. Katrs kubu režģa virziens atbilst līnijas uz sešstūru režģa. Mēģiniet atlasīt sešstūri ar z, kas vienāds ar 0, 1, 2, 3, lai redzētu savienojumu. Līnija ir atzīmēta zilā krāsā. Izmēģiniet to pašu ar x (zaļš) un y (violeta).
  2. Katrs sešstūra režģa virziens ir divu kuba režģa virzienu kombinācija. Piemēram, sešstūra režģa "ziemeļi" atrodas starp +y un -z , tāpēc katrs solis uz "ziemeļiem" palielina y par 1 un samazina z par 1.
Kubiskās koordinātas ir saprātīga izvēle sešstūra režģa koordinātu sistēmai. Nosacījums ir x + y + z = 0 , tāpēc tas ir jāsaglabā algoritmos. Nosacījums arī nodrošina, ka katram sešstūrim vienmēr būs kanoniskā koordināte.

Ir daudz dažādu koordinātu sistēmu kubiem un sešstūriem. Dažos no tiem nosacījums atšķiras no x + y + z = 0 . Es parādīju tikai vienu no daudzajām sistēmām. Varat arī izveidot kubiskās koordinātas ar x-y , y-z , z-x , kurām būs savs interesantu īpašību kopums, bet es tos šeit neaptvēru.

Bet jūs varētu iebilst, ka nevēlaties saglabāt 3 koordinātu skaitļus, jo jūs nezināt, kā saglabāt šādu karti.

Aksiālās koordinātas

Aksiālā koordinātu sistēma, ko dažreiz sauc par "trapecveida", ir veidota, pamatojoties uz divām vai trim koordinātām no kubisko koordinātu sistēmas. Tā kā mums ir nosacījums x + y + z = 0 , trešā koordināta nav vajadzīga. Aksiālās koordinātas ir noderīgas karšu saglabāšanai un koordinātu parādīšanai lietotājam. Tāpat kā ar kubiskām koordinātām, ar tām varat izmantot standarta summēšanas, atņemšanas, reizināšanas un dalīšanas darbības ar Dekarta koordinātām.

Ir daudz kubisko koordinātu sistēmu un daudzas aksiālās. Šajā rokasgrāmatā es neapskatīšu visas kombinācijas. Es izvēlēšos divus mainīgos, q (kolonna) un r (rinda). Šī raksta shēmās q atbilst x un r atbilst z , taču šī kartēšana ir patvaļīga, jo varat pagriezt un pagriezt ķēdes, lai iegūtu dažādus kartējumus.

Šīs sistēmas priekšrocība salīdzinājumā ar pārvietošanas režģiem ir lielāka algoritmu skaidrība. Sistēmas mīnuss ir tāds, ka taisnstūrveida kartes glabāšana ir nedaudz dīvaina; skatiet sadaļu par karšu saglabāšanu. Daži algoritmi ir vēl skaidrāki kubiskajās koordinātēs, taču, tā kā mums ir nosacījums x + y + z = 0 , mēs varam aprēķināt trešo implicēto koordinātu un izmantot to šajos algoritmos. Savos projektos es saucu asis q , r , s , tāpēc nosacījums izskatās kā q + r + s = 0, un vajadzības gadījumā varu aprēķināt s = -q - r.

cirvji

Nobīdes koordinātas ir pirmā lieta, par ko cilvēki domā, jo tās ir tādas pašas kā standarta Dekarta koordinātas, ko izmanto kvadrātveida režģiem. Diemžēl vienai no abām asīm ir jāiet pret graudiem, un tas līdz ar to visu sarežģī. Cube un Axial ir nedaudz piemēroti, un tiem ir vienkāršāki algoritmi, taču karšu glabāšana ir nedaudz sarežģītāka. Ir vēl viena sistēma, ko sauc par "starplapu" vai "dubulto", bet mēs to šeit neapskatīsim; dažiem ir vieglāk strādāt nekā ar kubisku vai aksiālu.


Nobīdes koordinātas, kubiskās un aksiālās

Ass ir virziens, kurā tiek palielināta atbilstošā koordināte. Perpendikulārs asij ir līnija, uz kuras koordinātas paliek nemainīgas. Iepriekš redzamās režģa diagrammas parāda perpendikulāras līnijas.

Koordinātu transformācija

Visticamāk, ka savā projektā izmantosit aksiālās vai nobīdes koordinātas, taču daudzi algoritmi ir vieglāk izteikti kubiskajās koordinātēs. Tāpēc mums ir jāspēj konvertēt koordinātas starp sistēmām.

Aksiālās koordinātas ir cieši saistītas ar kubiskajām koordinātām, tāpēc pārveidošana ir vienkārša:

# pārvērst kubiskās koordinātas aksiālās koordinātes q = x r = z # konvertēt aksiālās koordinātas kubiskās koordinātes x = q z = r y = -x-z
Kodā šīs divas funkcijas var uzrakstīt šādi:

Funkcija cube_to_hex(h): # aksiālā var q = h.x var r = h.z return Hex(q, r) funkcija hex_to_cube(h): # cube var x = h.q var z = h.r var y = -x-z return Cube(x, y) ,z)
Nobīdes koordinātas ir nedaudz sarežģītākas:

Kaimiņos esošie sešstūri

Ja ir dots viens sešstūris, kādi seši sešstūri atrodas tam blakus? Kā jūs varētu gaidīt, atbilde ir visvieglākā kubiskajās koordinātēs, diezgan vienkārša ar aksiālajām koordinātām un nedaudz sarežģīta nobīdes koordinātām. Jums var būt nepieciešams arī aprēķināt sešus "diagonālos" sešstūrus.

Kubiskās koordinātas

Pārvietojot vienu atstarpi hex koordinātēs, viena no trim kubiskajām koordinātām mainās par +1 un otra par -1 (summai jāpaliek 0). Trīs iespējamās koordinātas var mainīties par +1, bet atlikušās divas var mainīties par -1. Tas dod mums sešas iespējamās izmaiņas. Katrs atbilst vienam no sešstūra virzieniem. Vienkāršākais un ātrākais veids ir iepriekš aprēķināt izmaiņas un kompilēšanas laikā ievietot tās Cube(dx, dy, dz) kubisko koordinātu tabulā:

Var virzieni = [ Kubs(+1, -1, 0), Kubs(+1, 0, -1), Kubs(0, +1, -1), Kubs(-1, +1, 0), Kubs( -1, 0, +1), Cube(0, -1, +1) ] funkcija cube_direction(direction): atgriešanās virzieni funkcija cube_neighbor(hex, direction): return cube_add(hex, cube_direction(direction))

Aksiālās koordinātas

Tāpat kā iepriekš, mēs sākam izmantot kubisko sistēmu. Ņemsim tabulu Cube(dx, dy, dz) un pārveidosim to par Hex(dq, dr) tabulu:

Var virzieni = [ Hex(+1, 0), Hex(+1, -1), Hex(0, -1), Hex(-1, 0), Hex(-1, +1), Hex(0, +1) ] funkcija hex_direction(direction): atgriešanās virzieni funkcija hex_neighbor(hex, direction): var dir = hex_direction(direction) return Hex(hex.q + dir.q, hex.r + dir.r)

Nobīdes koordinātas

Aksiālās koordinātās mēs veicam izmaiņas atkarībā no tā, kur mēs atrodamies režģī. Ja atrodamies nobīdes kolonnā/rindā, tad noteikums atšķiras no kolonnas/rindas bez nobīdes gadījuma.

Tāpat kā iepriekš, mēs izveidojam skaitļu tabulu, ko pievienot kolonnai un rindai . Tomēr šoreiz mums būs divi masīvi, viens nepāra kolonnām/rindām un otrs pāra kolonnām/rindām. Apskatiet (1,1) iepriekš redzamajā režģa kartē un ievērojiet, kā mainās kolonna un rinda, pārvietojoties katrā no sešiem virzieniem. Tagad atkārtosim procesu ar (2,2) . Katram no četriem pārvietošanas režģu veidiem tabulas un kods būs atšķirīgi, šeit ir katram režģa veidam atbilstošais kods.

nepāra-r
vari virzieni = [ [ 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) ] ] funkcija offset_neighbor(hex, direction): var parity = hex.row & 1 var dir = virzieni return Hex(hex.col + dir.col, hex.row + dir.row)


Even-r
vari virzieni = [ [ 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) ] ] funkcija offset_neighbor(hex, direction): var parity = hex.row & 1 var dir = virzieni return Hex(hex.col + dir.col, hex.row + dir.row)


Režģis pāra (PĀRĀ) un nepāra (ODD) rindām

nepāra-q
vari virzieni = [ [ 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) ] ] funkcija offset_neighbor(hex, direction): var parity = hex.col & 1 var dir = virzieni return Hex(hex.col + dir.col, hex.row + dir.row)


Pat-q
vari virzieni = [ [ 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) ] ] funkcija offset_neighbor(hex, direction): var parity = hex.col & 1 var dir = virzieni return Hex(hex.col + dir.col, hex.row + dir.row)


Režģis pāra (PĀRĀ) un nepāra (ODD) kolonnām

Diagonāles

Pārvietojoties "diagonālajā" telpā sešstūra koordinātēs, viena no trim kubiskajām koordinātām mainās par ±2 un pārējās divas par ∓1 (summai jāpaliek 0).

Var diagonāles = [ Kubs(+2, -1, -1), Kubs(+1, +1, -2), Kubs(-1, +2, -1), Kubs(-2, +1, +1 ), Cube(-1, -1, +2), Cube(+1, -2, +1) ] funkcija cube_diagonal_neighbor(hex, direction): return cube_add(hex, diagonals)
Tāpat kā iepriekš, mēs varam pārvērst šīs koordinātas par aksiālām koordinātām, nometot vienu no trim koordinātām, vai pārveidot par nobīdes koordinātām, iepriekš aprēķinot rezultātus.


Attālumi

Kubiskās koordinātas

Kubiskajā koordinātu sistēmā katrs sešstūris ir kubs 3D telpā. Blakus esošie sešstūri atrodas 1 attālumā viens no otra sešstūra režģī, bet 2 attālumā viens no otra kuba režģī. Tas padara attāluma aprēķināšanu vienkāršu. Kvadrātu režģī Manhetenas attālumi ir abs(dx) + abs(dy) . Kubu režģī Manhetenas attālumi ir abs(dx) + abs(dy) + abs(dz) . Attālums sešstūru režģī ir vienāds ar pusi no tiem:

Funkcija cube_distance(a, b): atgriešanās (abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z)) / 2
Šī apzīmējuma ekvivalents būtu teikt, ka vienai no trim koordinātām ir jābūt pārējo divu summu summai, un pēc tam iegūt to kā attālumu. Tālāk varat izvēlēties bisekcijas formu vai maksimālās vērtības formu, taču tās dod tādu pašu rezultātu:

Funkcija cube_distance(a, b): atgriešanās maks.(abs(a.x - b.x), abs(a.y - b.y), abs(a.z - b.z))
Attēlā maksimālās vērtības ir izceltas krāsā. Ņemiet vērā arī to, ka katra krāsa ir viens no sešiem "diagonāles" virzieniem.

gif


Aksiālās koordinātas

Aksiālajā sistēmā trešā koordināta ir izteikta netieši. Pārveidosim no aksiālas uz kubisku, lai aprēķinātu attālumu:

Funkcija hex_distance(a, b): var ac = hex_to_cube(a) var bc = hex_to_cube(b) return cube_distance(ac, bc)
Ja jūsu gadījumā kompilators ieguls (iekļauts) hex_to_cube un cube_distance , tas ģenerēs šādu kodu:

Funkcija hex_distance(a, b): atgriešanās (abs(a.q - b.q) + abs(a.q + a.r - b.q - b.r) + abs(a.r - b.r)) / 2
Ir daudz dažādu veidu, kā aksiālās koordinātēs ierakstīt attālumus starp sešstūriem, taču neatkarīgi no rakstīšanas veida attālums starp sešstūriem aksiālajā sistēmā ir iegūts no Manhetenas attāluma kubiskajā sistēmā. Piemēram, aprakstīto "atšķirību starpību" iegūst, rakstot a.q + a.r - b.q - b.r kā a.q - b.q + a.r - b.r un sadalīšanas formas kuba_attālums vietā izmantojot maksimālās vērtības formu. Visi tie ir līdzīgi, ja redzat saikni ar kubiskām koordinātām.

Nobīdes koordinātas

Tāpat kā ar aksiālajām koordinātām, mēs pārvēršam nobīdes koordinātas par kubiskām koordinātām un pēc tam izmantojam kubisko attālumu.

Funkcija offset_distance(a, b): var ac = nobīde_uz kubu(a) var bc = nobīde_kubam(b) return cube_distance(ac, bc)
Mēs izmantosim to pašu modeli daudziem algoritmiem: pārveidosim no sešstūriem kubos, palaidīsim algoritma kubisko versiju un pārveidosim kubā sadalītos rezultātus sešstūra koordinātēs (aksiālās vai nobīdes koordinātēs).

Līniju zīmēšana

Kā novilkt līniju no viena sešstūra uz otru? Es izmantoju lineāro interpolāciju, lai zīmētu līnijas. Līniju vienmērīgi ņem paraugus N+1 punktos un aprēķina, kuros sešstūros šie paraugi atrodas.

gif


  1. Vispirms mēs aprēķinām N , kas būs attālums sešstūros starp gala punktiem.
  2. Tad mēs vienmērīgi paraugam N+1 punktu starp punktiem A un B. Izmantojot lineāro interpolāciju, mēs nosakām, ka i vērtībām no 0 līdz N , ieskaitot tās, katrs punkts būs A + (B - A) * 1,0/N * es . Attēlā šie kontroles punkti ir parādīti zilā krāsā. Rezultāts ir peldošā punkta koordinātas.
  3. Pārvērtiet katru kontrolpunktu (pludiņu) atpakaļ sešstūros (int). Algoritmu sauc par cube_round (skat. zemāk).
Savienojiet visu kopā, lai novilktu līniju no A līdz B:

Funkcija lerp(a, b, t): // pludiņiem atgriež a + (b - a) * t funkcija cube_lerp(a, b, t): // sešstūriem atgriež Cube(lerp(a.x, b.x, t), lerp(a.y, b.y, t), lerp(a.z, b.z, t)) funkcija cube_linedraw(a, b): var N = cube_distance(a, b) var rezultāti = katram 0 ≤ i ≤ N: results.append( cube_round(cube_lerp(a, b, 1.0/N * i))) atgriež rezultātus
Piezīmes:

  • Ir reizes, kad cube_lerp atgriež punktu tieši uz malas starp diviem sešstūriem. Tad cube_round pārvieto to uz vienu vai otru pusi. Līnijas izskatās labāk, ja tās ir nobīdītas vienā virzienā. To var izdarīt, pievienojot "epsilon" hex Cube (1e-6, 1e-6, -2e-6) vienam vai abiem galapunktiem pirms cilpas sākšanas. Tas "nobīdīs" līniju vienā virzienā, lai tā nesaskartos ar malu robežām.
  • DDA līnijas algoritms kvadrātu režģos pielīdzina N maksimālajam attālumam pa katru no asīm. Mēs darām to pašu kubiskajā telpā, kas ir analogs attālumam sešstūru režģī.
  • Funkcijai cube_lerp ir jāatgriež kubs ar peldošās koordinātām. Ja programmējat statiski drukātā valodā, nevarēsit izmantot Cube tipu. Tā vietā varat definēt FloatCube tipu vai iekļaut (inline) funkciju savā līnijas zīmēšanas kodā, ja nevēlaties definēt vēl vienu veidu.
  • Varat optimizēt kodu, iekļaujot (inline) cube_lerp un pēc tam aprēķinot B.x-A.x , B.x-A.y un 1.0/N ārpus cilpas. Reizināšanu var pārvērst par atkārtotu summēšanu. Rezultāts ir kaut kas līdzīgs DDA līnijas algoritmam.
  • Es izmantoju aksiālās vai kuba koordinātas līniju zīmēšanai, bet, ja vēlaties strādāt ar nobīdes koordinātām, pārbaudiet .
  • Līniju zīmēšanai ir daudz iespēju. Dažreiz ir nepieciešama "pārklāšana". Man ir nosūtīts kods pārkrāsotu līniju zīmēšanai sešstūros, bet es to vēl neesmu izskatījis.

ceļojumu diapazons

Koordinātu diapazons

Kuri sešstūri atrodas N soļu rādiusā, ņemot vērā sešstūra centru un diapazonu N?

Mēs varam strādāt atpakaļ no sešstūra attāluma formulas distance = max(abs(dx), abs(dy), abs(dz)) . Lai atrastu visus sešstūrus N robežās, mums ir nepieciešams max(abs(dx), abs(dy), abs(dz)) ≤ N . Tas nozīmē, ka ir vajadzīgas visas trīs vērtības: abs(dx) ≤ N un abs(dy) ≤ N un abs(dz) ≤ N . Noņemot absolūto vērtību, iegūst -N ≤ dx ≤ N un -N ≤ dy ≤ N un -N ≤ dz ≤ N . Kodā tā būs ligzdota cilpa:

Var rezultāti = katram -N ≤ dx ≤ N: katram -N ≤ dy ≤ N: katram -N ≤ dz ≤ N: ja dx + dy + dz = 0: rezultāti.append(cube_add(centrs, Cube(dx) , dy, dz)))
Šī cilpa darbosies, taču būs diezgan neefektīva. No visām dz vērtībām, kurām mēs cilpa cauri, tikai viena faktiski atbilst kubu dx + dy + dz = 0 nosacījumam. Tā vietā mēs tieši aprēķināsim dz vērtību, kas atbilst nosacījumam:

var rezultāti = katram -N ≤ dx ≤ N: katram max(-N, -dx-N) ≤ dy ≤ min(N, -dx+N): var dz = -dx-dy rezultāti.append(cube_add( centrs, kubs(dx, dy, dz)))
Šī cilpa iet cauri tikai nepieciešamajām koordinātām. Attēlā katrs diapazons ir līniju pāris. Katra rinda ir nevienlīdzība. Mēs ņemam visus sešstūrus, kas apmierina sešas nevienādības.

gif


Diapazoni, kas pārklājas

Ja jums ir jāatrod sešstūri, kas atrodas vairākos diapazonos, pirms sešstūru saraksta izveides varat šķērsot diapazonus.

Šai problēmai var pieiet no algebras vai ģeometrijas viedokļa. Algebriski katrs laukums tiek izteikts kā nevienlīdzības nosacījumi formā -N ≤ dx ≤ N , un mums jāatrod šo nosacījumu krustpunkts. Ģeometriski katrs laukums ir kubs 3D telpā, un mēs krustosim divus kubus 3D telpā, lai iegūtu kuboīdu 3D telpā. Pēc tam mēs to projicējam atpakaļ uz x + y + z = 0 plakni, lai iegūtu sešstūrus. Es atrisināšu šo uzdevumu algebriski.

Vispirms mēs pārrakstām nosacījumu -N ≤ dx ≤ N vispārīgākā formā x min ≤ x ≤ x max , un ņemam x min = centrs.x - N un x max = centrs.x + N . Darīsim to pašu ar y un z , iegūstot vispārīgu iepriekšējās sadaļas koda skatu:

Var rezultāti = katram xmin ≤ x ≤ xmax: katram max(ymin, -x-zmax) ≤ y ≤ min(ymax, -x-zmin): var z = -x-y rezultāti.append(Cube(x, y, z))
Divu diapazonu a ≤ x ≤ b un c ≤ x ≤ d krustpunkts ir max(a, c) ≤ x ≤ min(b, d) . Tā kā sešstūru laukums ir izteikts kā diapazoni virs x , y , z , mēs varam atsevišķi krustot katru no diapazoniem x , y , z un pēc tam izmantot ligzdotu cilpu, lai krustpunktā izveidotu sešstūru sarakstu. Vienam sešstūru laukumam mēs ņemam x min = H.x - N un x max = H.x + N , līdzīgi y un z . Divu sešstūra laukumu krustojumam ņemam x min = max(H1.x - N, H2.x - N) un x max = min(H1.x + N, H2.x + N), līdzīgi y un z . Tas pats modelis darbojas trīs vai vairāku reģionu krustojumos.

gif


Šķēršļi

Šķēršļu klātbūtnē visvieglāk ir aizpildīt ar attāluma ierobežojumu (meklēšana pēc platuma). Zemāk redzamajā attēlā mēs aprobežojamies ar četrām kustībām. Kodā bārkstis[k] ir visu sešstūru masīvs, ko var sasniegt ar k soļiem. Katrā izejā caur galveno cilpu mēs paplašinām līmeni k-1 par līmeni k .

Funkcija cube_reachable(sākums, kustība): var apmeklētais = set() pievienot sākumu apmeklētajam var fringes = fringes.append() katram 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

pagriezienus

Noteiktam sešstūra vektoram (atšķirība starp diviem sešstūriem) mums var būt nepieciešams to pagriezt, lai norādītu uz citu sešstūri. To ir viegli izdarīt ar kubiskām koordinātām, ja pieturaties pie 1/6 rotācijas.

Pagriežot par 60° pa labi, katra koordināta tiek nobīdīta par vienu pozīciju pa labi:

[x, y, z] līdz [-z, -x, -y]
Pagriežot par 60° pa kreisi, katra koordināta tiek nobīdīta par vienu pozīciju pa kreisi:

[x, y, z] līdz [-y, -z, -x]



"Spēlējot" [sākotnējā rakstā] ar diagrammu, jūs varat redzēt, ka katrs pagrieziens par 60 ° izmaiņas zīmes un fiziski "pagriezt" koordinātas. Pēc 120° pagriešanas zīmes atkal ir tās pašas. Pagriežot par 180°, zīmes tiek apgrieztas, bet koordinātas tiek pagrieztas sākotnējā stāvoklī.

Šeit ir pilna secība, kurā tiek pagriezta pozīcija P ap centrālo pozīciju C, kā rezultātā tiek iegūta jauna pozīcija R:

  1. Pārvērtiet P un C pozīcijas kubiskās koordinātēs.
  2. Vektora aprēķināšana, atņemot centru: P_no_C = P - C = Kubs(P.x - C.x, P.y - C.y, P.z - C.z) .
  3. Pagriežot vektoru P_from_C, kā aprakstīts iepriekš, un iegūtajam vektoram piešķirot apzīmējumu R_from_C .
  4. Vektora konvertēšana atpakaļ pozīcijā, pievienojot centru: R = R_no_C + C = Kubs(R_no_C.x + C.x, R_no_C.y + C.y, R_no_C.z + C.z) .
  5. Kubiskā stāvokļa R pārvēršana atpakaļ vēlamajā koordinātu sistēmā.
Ir vairāki transformāciju posmi, taču katrs no tiem ir diezgan vienkāršs. Dažas no šīm darbībām ir iespējams saīsināt, definējot rotāciju tieši aksiālās koordinātēs, taču sešstūra vektori nedarbojas ar nobīdes koordinātām, un es nezinu, kā saīsināt nobīdes koordinātu soļus. Skatiet arī diskusiju par citiem veidiem, kā aprēķināt rotāciju stackexchange.

Gredzeni

vienkāršs gredzens

Lai noskaidrotu, vai dotais sešstūris pieder gredzenam ar noteiktu rādiusa rādiusu, jāaprēķina attālums no šī sešstūra līdz centram un jānoskaidro, vai tas ir vienāds ar rādiusu. Lai iegūtu visu šādu sešstūru sarakstu, jums jāveic rādiusa soļi no centra un pēc tam jāseko pagrieztajiem vektoriem pa ceļu gar gredzenu.

Funkcija cube_ring(centrs, rādiuss): var rezultāti = # šis kods nedarbojas rādiusam == 0; saproti kāpēc? var kubs = kubs_pievienot(centrs, kuba_mērogs(kuba_virziens(4), rādiuss)) katram 0 ≤ i< 6: for each 0 ≤ j < radius: results.append(cube) cube = cube_neighbor(cube, i) return results
Šajā kodā kubs sākas ar gredzenu, kas parādīts kā liela bultiņa no diagrammas centra līdz stūrim. Sākumā es izvēlējos 4. leņķi, jo tas atbilst ceļam, pa kuru pārvietojas mani virzienu numuri. Jums var būt nepieciešams cits sākuma leņķis. Katrā iekšējās cilpas posmā kubs pārvieto vienu sešstūri ap gredzenu. Pēc 6 * rādiusa soļiem viņš nonāk tur, kur sāka.


spirālveida gredzeni

Ejot cauri gredzeniem spirālveida veidā, varam aizpildīt gredzenu iekšpusi:

Funkcija cube_spiral(centrs, rādiuss): var rezultāti = katram 1 ≤ k ≤ rādiuss: rezultāti = rezultāti + cube_ring(centrs, k) atgriež rezultātus



Lielā sešstūra laukums ir vienāds ar visu apļu summu plus 1 centram. Izmantojiet šo formulu, lai aprēķinātu laukumu.

Sešstūru šķērsošanu šādā veidā var izmantot arī kustības diapazona aprēķināšanai (skatīt iepriekš).

Redzamības zona

Kas ir redzams no noteiktas pozīcijas noteiktā attālumā un nav bloķēts ar šķēršļiem? Vienkāršākais veids, kā to noteikt, ir novilkt līniju katram sešstūrim dotajā diapazonā. Ja līnija nesaskaras ar sienām, jūs redzat sešstūri. Pārvietojiet peles kursoru virs sešstūriem [sākotnējā raksta diagrammā], lai redzētu līnijas, kas tiek novilktas uz šiem sešstūriem, un sienas, ar kurām līnijas saskaras.

Šis algoritms var būt lēns lielos apgabalos, taču to ir viegli ieviest, tāpēc iesaku sākt ar to.

gif



Ir daudz dažādu redzamības definīciju. Vai vēlaties redzēt cita sešstūra centru no sākotnējā sešstūra centra? Vai vēlaties redzēt kādu cita sešstūra daļu no sākotnējā sešstūra centra? Varbūt kāda cita sešstūra daļa no jebkura sākuma punkta? Vai šķēršļi ir mazāki par pilnu sešstūri? Darbības joma ir sarežģītāks un daudzveidīgāks jēdziens, nekā šķiet. Sāksim ar vienkāršāko algoritmu, taču sagaidiet, ka tas pareizi aprēķinās atbildi jūsu projektā. Ir pat gadījumi, kad vienkāršs algoritms dod neloģiskus rezultātus.

Es vēlos paplašināt šo rokasgrāmatu. man ir