å
è§åœ¢ãããïŒå
è§åœ¢ãããïŒã¯äžéšã®ã²ãŒã ã§äœ¿çšãããŠããŸãããé·æ¹åœ¢ã®ãããã»ã©åçŽã§äžè¬çã§ã¯ãããŸããã ç§ã¯ã»ãŒ20幎é
å
è§åœ¢ã®ã°ãªããã§
ãªãœãŒã¹ãåéããŠããŸãããããã®ã¬ã€ãã¯æãåçŽãªã³ãŒãã§å®è£
ãããæããšã¬ã¬ã³ããªã¢ãããŒãã«ã€ããŠæžããŠããŸãã Charles FuãšClark Verbruggeã®ã¬ã€ãã¯ãèšäºå
šäœã§ãã䜿çšãããŸãã å
è§åœ¢ã°ãªãããäœæããããŸããŸãªæ¹æ³ããããã®é¢ä¿ãããã³æãäžè¬çãªã¢ã«ãŽãªãºã ã«ã€ããŠèª¬æããŸãã ãã®èšäºã®å€ãã®éšåã¯ã€ã³ã¿ã©ã¯ãã£ãã§ããã°ãªããã®ã¿ã€ããéžæãããšã察å¿ãããã¿ãŒã³ãã³ãŒããããã¹ããå€æŽãããŸãã
ïŒæ³šã¬ãŒã³ïŒããã¯ãªãªãžãã«ã«ã®ã¿é©çšãããŸããå匷ããããšããå§ãããŸãã翻蚳ã§ã¯ããªãªãžãã«ã®ãã¹ãŠã®æ
å ±ãä¿åãããŸããã察話æ§ã¯ãããŸãããïŒãã®èšäºã®ã³ãŒãäŸã¯ç䌌ã³ãŒãã§æžãããŠãããããå®è£
ãäœæããããã«èªã¿ããããç解ããããã§ãã
幟äœåŠ
å
è§åœ¢ã¯å
è§åœ¢ã®å€è§åœ¢ã§ãã éåžžã®å
è§åœ¢ã§ã¯ããã¹ãŠã®èŸºïŒé¢ïŒã®é·ããåãã§ãã éåžžã®å
è§åœ¢ã§ã®ã¿åäœããŸãã éåžžãå
è§åœ¢ã®ã°ãªããã¯ãæ°Žå¹³æ¹åïŒéãäžéšïŒãšåçŽæ¹åïŒå¹³åŠãªäžéšïŒã䜿çšããŸãã
å¹³ããªïŒå·ŠïŒãšéãïŒå³ïŒäžéšã®å
è§åœ¢å
è§åœ¢ã«ã¯6ã€ã®é¢ããããŸãã åé¢ã¯2ã€ã®å
è§åœ¢ã«å
±éã§ãã å
è§åœ¢ã«ã¯6ã€ã®ã³ãŒããŒãã€ã³ãããããŸãã åã³ãŒããŒãã€ã³ãã¯3ã€ã®å
è§åœ¢ã«å
±éã§ãã
ã¡ãã·ã¥ã®äžéš ïŒæ£æ¹åœ¢ãå
è§åœ¢ãäžè§åœ¢ïŒ
ã«ã€ããŠã®ç§ã®èšäºã§ ãäžå¿ç¹ãé¢ãã³ãŒããŒãã€ã³ãã«ã€ããŠè©³ããèªãããšãã§ããŸãã
è§åºŠ
éåžžã®å
è§åœ¢ã§ã¯ãå
è§ã¯120°ã§ãã 6ã€ã®ãããã³ãããããããããã60°ã®å
è§ãæã€æ£äžè§åœ¢ã§ãã ã³ãŒããŒãã€ã³ã
iã¯ã
(60° * i) + 30°
è·é¢ã§ãäžå¿ã®
center
ãã
size
åäœã§ãã ã³ãŒãå
ïŒ
function hex_corner(center, size, i): var angle_deg = 60 * i + 30 var angle_rad = PI / 180 * angle_deg return Point(center.x + size * cos(angle_rad), center.y + size * sin(angle_rad))
å
è§åœ¢ãå¡ãã€ã¶ãã«ã¯ã
hex_corner(âŠ, 0)
ãã
hex_corner(âŠ, 5)
å€è§åœ¢ã®é ç¹ãååŸããå¿
èŠããããŸãã å
è§åœ¢ã®ã¢ãŠãã©ã€ã³ãæç»ããã«ã¯ããããã®é ç¹ã䜿çšããŠããã
hex_corner(âŠ, 0)
å床ç·ãæç»ããå¿
èŠããããŸãã
2ã€ã®æ¹åã®éãã¯ãxãšyãå Žæãå€ããããšã§ãè§åºŠãå€åããããšã§ãïŒå¹³ããªäžéšã®å
è§åœ¢ã®è§åºŠã¯0°ã60°ã120°ã180°ã240°ã300°ãããã³éãäžéš-30 °ã90°ã150°ã210°ã270°ã330°ã
å¹³ãã§å°ã£ãå
è§åœ¢ã®è§åºŠãµã€ãºãšå Žæ
ããã§ãããã€ãã®å
è§åœ¢ãäžç·ã«é
眮ããããšæããŸãã æ°Žå¹³æ¹åã§ã¯ãå
è§åœ¢ã®
height = size * 2
ã¯
height = size * 2
ã§ãã é£æ¥ããå
è§åœ¢éã®åçŽè·é¢
vert = height * 3/4
ã
å
è§åœ¢ã®
width = sqrt(3)/2 * height
ã é£æ¥ããå
è§åœ¢éã®æ°Žå¹³è·é¢
horiz = width
ã
äžéšã®å
è§åœ¢ã²ãŒã ã¯ãéåžžã®å
è§åœ¢ãšæ£ç¢ºã«äžèŽããªããã¯ã»ã«ã¢ãŒãã䜿çšããŸãã ãã®ã»ã¯ã·ã§ã³ã§èª¬æããè§åºŠãšäœçœ®ã®åŒã¯ããã®ãããªå
è§åœ¢ã®å¯žæ³ãšäžèŽããŸããã å
è§åœ¢ã®ã¡ãã·ã¥ã¢ã«ãŽãªãºã ã«ã€ããŠèª¬æããŠããæ®ãã®èšäºã¯ãå
è§åœ¢ããããã«äŒžçž®ããŠããå Žåã§ãé©çšã§ããŸãã
座æšç³»
å
è§åœ¢ãã°ãªããã«çµã¿ç«ãŠå§ããŸãããã æ£æ¹åœ¢ã°ãªããã®å Žåãæ§ç¯ããæãããªæ¹æ³ã¯1ã€ã ãã§ãã å
è§åœ¢ã«ã¯ãå€ãã®ã¢ãããŒãããããŸãã äžæ¬¡è¡šçŸãšããŠç«æ¹åº§æšã䜿çšããããšããå§ãããŸãã 軞座æšãŸãã¯ãªãã»ãã座æšã䜿çšããŠãããããä¿åãããŠãŒã¶ãŒã«åº§æšã衚瀺ããå¿
èŠããããŸãã
ãªãã»ãã座æš
æãäžè¬çãªã¢ãããŒãã¯ãåŸç¶ã®ååãŸãã¯è¡ããªãã»ããããããšã§ãã åã¯
col
ãŸãã¯
q
瀺ãããŸãã è¡ã¯
row
ãŸãã¯
r
瀺ãããŸãã å¥æ°ãŸãã¯å¶æ°ã®å/è¡ããªãã»ããã§ãããããæ°Žå¹³ããã³åçŽã®å
è§åœ¢ã«ã¯2ã€ã®ãªãã·ã§ã³ããããŸãã
æ°Žå¹³é
眮ãodd-rãæ°Žå¹³é
眮ãå¶æ°-rã瞊é
眮ãodd-qã瞊é
眮ãå¶æ°-qãç«æ¹åº§æš
å
è§åœ¢ã®ã°ãªãããèŠããã1ã€ã®æ¹æ³ã¯ãæ£æ¹åœ¢ã®ã°ãªããã®ããã«
2ã€ã§ã¯ãªã
3ã€ã®äž»è»žãèŠãããšã§ãã ãããã¯ãšã¬ã¬ã³ããªå¯Ÿç§°æ§ã瀺ããŠããŸãã
ç«æ¹äœã®ã°ãªãããåãã
x + y + z = 0
ã§å¯Ÿè§å¹³é¢ã
åãåã x + y + z = 0
ã ããã¯å¥åŠãªèãã§ãããå
è§åœ¢ã°ãªããã®ã¢ã«ãŽãªãºã ãç°¡çŽ åããã®ã«åœ¹ç«ã¡ãŸãã ç¹ã«ããã«ã«ã座æšã®æšæºæäœã䜿çšã§ããŸãã座æšã®å ç®ãšæžç®ãã¹ã«ã©ãŒå€ã«ããä¹ç®ãšé€ç®ãããã³è·é¢ã
ç«æ¹äœã®ã°ãªããäžã®3ã€ã®äž»è»žãšãå
è§åœ¢ã®ã°ãªããã®6ã€ã®
察è§ç·æ¹åãšã®é¢ä¿ã«æ³šç®ããŠãã ããã ã°ãªããã®å¯Ÿè§è»žã¯ãå
è§åœ¢ã®ã°ãªããã®äž»æ¹åã«å¯Ÿå¿ããŠããŸãã
å
è§åœ¢ãã¥ãŒãæ£æ¹åœ¢ãšç«æ¹äœã®ã°ãªããã®ã¢ã«ãŽãªãºã ã¯ãã§ã«ãããããç«æ¹åº§æšã䜿çšãããšããããã®ã¢ã«ãŽãªãºã ãå
è§åœ¢ã®ã°ãªããã«é©åãããããšãã§ããŸãã ã»ãšãã©ã®èšäºã®ã¢ã«ãŽãªãºã ã«ãã®ã·ã¹ãã ã䜿çšããŸãã ç°ãªã座æšç³»ã®ã¢ã«ãŽãªãºã ã䜿çšããã«ã¯ã3次座æšãå€æããã¢ã«ãŽãªãºã ãå®è¡ããŠããå
ã«æ»ããŸãã
å
è§åœ¢ã®ã°ãªããã«å¯ŸããŠç«æ¹åº§æšãã©ã®ããã«æ©èœããããåŠã³ãŸãã å
è§åœ¢ãéžæãããšã3ã€ã®è»žã«å¯Ÿå¿ããç«æ¹äœåº§æšãéžæãããŸãã
- ç«æ¹äœã®ã°ãªããã®åæ¹åã¯ãå
è§åœ¢ã®ã°ãªããäžã®ç·ã«å¯Ÿå¿ããŠããŸãã
z
ã0ã1ã2ã3ã«çããå
è§åœ¢ãéžæããŠãæ¥ç¶ã確èªããŠãã ããã ç·ã¯éã§ããŒã¯ãããŠããŸãã x
ïŒç·ïŒãšy
ïŒã©ã€ã©ãã¯ïŒã«ã€ããŠãåãããšãè©ŠããŠãã ããã
- å
è§åœ¢ã°ãªããã®åæ¹åã¯ãç«æ¹äœã®ã°ãªããã®2ã€ã®æ¹åã®çµã¿åããã§ãã ããšãã°ãå
è§åœ¢ã°ãªããã®ãåãã¯
+y
ãš-z
éã«ããããããåããžã®åã¹ãããã¯y
ã1å¢å ããã z
ã1æžå°ãããŸãã
ç«æ¹äœåº§æšã¯ãå
è§åœ¢ã®ã°ãªãã座æšç³»ã®è³¢ãéžæã§ãã æ¡ä»¶ã¯
x + y + z = 0
ãããã¢ã«ãŽãªãºã ã§ä¿åããå¿
èŠããããŸãã ãŸãããã®æ¡ä»¶ã«ãããåå
è§åœ¢ã«åžžã«æšæºåº§æšãååšããããšãä¿èšŒãããŸãã
ç«æ¹äœãšå
è§åœ¢ã«ã¯å€ãã®ç°ãªã座æšç³»ããããŸãã ãããã®ããã€ãã§ã¯ãæ¡ä»¶ã¯
x + y + z = 0
ãšã¯ç°ãªã
x + y + z = 0
ã å€ãã®ã·ã¹ãã ã®1ã€ã ãã瀺ããŸããã ãŸãã
xy
ã
yz
ã
zx
ã䜿çšããŠ3次座æšãäœæããããšãã§ããŸããããããã«ã¯ç¬èªã®èå³æ·±ãããããã£ã®ã»ããããããŸãããããã§ã¯èæ
®ããŸããã
ãã ãããã®åœ¢åŒã§å°å³ãä¿åããæ¹æ³ãããããªãããã座æšã«3ã€ã®æ°åãä¿åããããªããšèããããšãã§ããŸãã
軞座æš
ãå°åœ¢ããšãåŒã°ãã軞座æšç³»ã¯ã3次座æšç³»ã®2ã€ãŸãã¯3ã€ã®åº§æšã«åºã¥ããŠæ§ç¯ãããŸãã æ¡ä»¶
x + y + z = 0
ããã3çªç®ã®åº§æšã¯å¿
èŠãããŸããã 軞座æšã¯ãããããä¿åãããŠãŒã¶ãŒã«åº§æšã衚瀺ããã®ã«åœ¹ç«ã¡ãŸãã 3次座æšã®å Žåãšåæ§ã«ããã«ã«ã座æšã§ã®å ç®ãæžç®ãä¹ç®ãé€ç®ã®æšæºæäœã䜿çšã§ããŸãã
å€ãã®ç«æ¹åº§æšç³»ãšå€ãã®è»žããããŸãã ãã®ã¬ã€ãã§ã¯ããã¹ãŠã®çµã¿åãããæ±ããŸããã 2ã€ã®å€æ°ã
q
ïŒåïŒãš
r
ïŒè¡ïŒãéžæããŸãã ãã®èšäºã®ã¹ããŒã ã§ã¯ã
q
ã¯
x
ã«å¯Ÿå¿ãã
r
ã¯
z
ã«å¯Ÿå¿ããŸãããããŸããŸãªå¯Ÿå¿ãååŸããŠåè·¯ãå転ããã³å転ãããããšãã§ããããããã®ãããªå¯Ÿå¿ã¯ä»»æã§ãã
å€äœã°ãªãããè¶
ãããã®ã·ã¹ãã ã®å©ç¹ã¯ãã¢ã«ãŽãªãºã ã®ç解床ãé«ãããšã§ãã ãã®ã·ã¹ãã ã®æ¬ ç¹ã¯ãé·æ¹åœ¢ã®ã«ãŒããä¿ç®¡ããã®ãå°ãããããããšã§ãã ãããã®ä¿åã«é¢ããã»ã¯ã·ã§ã³ãåç
§ããŠãã ããã äžéšã®ã¢ã«ãŽãªãºã ã¯3次座æšã§ã¯ããã«æ確ã§ãããæ¡ä»¶
x + y + z = 0
ãããããã3çªç®ã®æé»ã®åº§æšãèšç®ãããããã®ã¢ã«ãŽãªãºã ã§äœ¿çšã§ããŸãã ç§ã®ãããžã§ã¯ãã§ã¯ã
q
ã
r
ã
s
軞ãåŒã³åºããããæ¡ä»¶ã¯
q + r + s = 0
ã«ãªããå¿
èŠã«å¿ããŠ
s = -q - r
èšç®ã§ããŸãã
軞
å€äœåº§æšã¯ãæ£æ¹åœ¢ã°ãªããã«äœ¿çšãããæšæºã®ãã«ã«ã座æšãšäžèŽãããããã»ãšãã©ã®äººãæåã«èãããã®ã§ãã æ®å¿µãªããã2ã€ã®è»žã®ãã¡ã®1ã€ããã³ãŒãã«éãããå¿
èŠããããçµæãšããŠãã¹ãŠãè€éã«ãªããŸãã ãã¥ãŒããã¯ããã³ã¢ãã·ã£ã«ã·ã¹ãã ã¯ããŠãŒã«ã«æ²¿ã£ãŠã移åããã¢ã«ãŽãªãºã ã¯åçŽã§ãããã«ãŒãã®ä¿ç®¡ã¯ããå°ãè€éã§ãã ã亀äºããŸãã¯ãäºéããšåŒã°ããå¥ã®ã·ã¹ãã ããããŸãããããã§ã¯ãããèæ
®ããŸããã ãã¥ãŒããã¯ãã¢ãã·ã£ã«ãããäœæ¥ãããã人ãããŸãã
å€äœåº§æšãç«æ¹ããã³è»žè»žã¯ã察å¿ãã座æšãå¢å ããæ¹åã§ãã 軞ã«åçŽãªã®ã¯ã座æšãäžå®ã®ãŸãŸã§ããç·ã§ãã äžèšã®ã°ãªããå³ã¯ãåç·ã瀺ããŠããŸãã
座æšå€æ
ãããžã§ã¯ãã§è»žåº§æšãŸãã¯å€äœåº§æšã䜿çšããå¯èœæ§ããããŸãããå€ãã®ã¢ã«ãŽãªãºã ã¯ç«æ¹åº§æšã§ããç°¡åã«è¡šçŸã§ããŸãã ãããã£ãŠãã·ã¹ãã éã§åº§æšãå€æã§ããå¿
èŠããããŸãã
軞座æšã¯ç«æ¹äœãšå¯æ¥ã«é¢é£ããŠãããããå€æã¯ç°¡åã§ãã
# q = x r = z # x = q z = r y = -xz
ã³ãŒãã§ã¯ããããã®2ã€ã®é¢æ°ã¯æ¬¡ã®ããã«èšè¿°ã§ããŸãã
function cube_to_hex(h): # var q = hx var r = hz return Hex(q, r) function hex_to_cube(h): # var x = hq var z = hr var y = -xz return Cube(x, y, z)
ãªãã»ãã座æšã¯ããªãè€éã§ãïŒ
# -q col = x row = z + (x + (x&1)) / 2 # -q x = col z = row - (col + (col&1)) / 2 y = -xz # -q col = x row = z + (x - (x&1)) / 2 # -q x = col z = row - (col - (col&1)) / 2 y = -xz # -r col = x + (z + (z&1)) / 2 row = z # -r x = col - (row + (row&1)) / 2 z = row y = -xz # -r col = x + (z - (z&1)) / 2 row = z # -r x = col - (row - (row&1)) / 2 z = row y = -xz
å®è£
äžã®æ³šæïŒæ°å€ãå¶æ°ïŒ0ïŒãå¥æ°ïŒ1ïŒããå€æããããã«ãaïŒ
2ïŒ
å°äœã«ããé€ç® ïŒã®ä»£ããã«ïŒ1ïŒ
ãããåäœã®ãANDã ïŒã䜿çšããŸãã 詳现ãªèª¬æã«ã€ããŠ
ã¯ãå®è£
ã®ã¡ã¢ããŒãžãåç
§
ããŠãã ãã ã
é£æ¥ããå
è§åœ¢
1ã€ã®å
è§åœ¢ãæå®ãããŠããŸããã次ã®6ã€ã®å
è§åœ¢ã¯ã©ãã§ããïŒ ãæ³åã®ãšãããçããæãç°¡åãªæ¹æ³ã¯ã3次座æšã§ã軞座æšã§ããªãåçŽã§ãå€äœåº§æšã§å°ãé£ããã§ãã 6ã€ã®ã察è§ãå
è§åœ¢ãèšç®ããå¿
èŠãããå ŽåããããŸãã
ç«æ¹åº§æš
å
è§åœ¢ã®åº§æšã§1ã€ã®ã¹ããŒã¹ã移åãããšã3ã€ã®ç«æ¹äœåº§æšã®1ã€ã+1å€åãããã1ã€ã-1å€åããŸãïŒåèšã¯0ã®ãŸãŸã§ãªããã°ãªããŸããïŒã 3ã€ã®å¯èœãªåº§æšã¯+1å€åããæ®ãã®2ã€ã®åº§æšã¯-1å€åããŸãã ããã«ããã6ã€ã®å€æŽãå¯èœã«ãªããŸãã ãããããå
è§åœ¢ã®æ¹åã®1ã€ã«å¯Ÿå¿ããŸãã æãç°¡åã§æéã®æ¹æ³ã¯ãã³ã³ãã€ã«æã«å€æŽãäºåã«èšç®ãã
Cube(dx, dy, dz)
3次座æšããŒãã«
Cube(dx, dy, dz)
ã«é
眮ããããšã§ãã
var directions = [ Cube(+1, -1, 0), Cube(+1, 0, -1), Cube( 0, +1, -1), Cube(-1, +1, 0), Cube(-1, 0, +1), Cube( 0, -1, +1) ] function cube_direction(direction): return directions[direction] function cube_neighbor(hex, direction): return cube_add(hex, cube_direction(direction))
軞座æš
åãšåæ§ã«ãæåã«ãã¥ãŒããã¯ã·ã¹ãã ã䜿çšããŸãã
Cube(dx, dy, dz)
ããŒãã«
Cube(dx, dy, dz)
ã
Cube(dx, dy, dz)
ãã
Hex(dq, dr)
ããŒãã«
Hex(dq, dr)
å€æããŸãã
var directions = [ Hex(+1, 0), Hex(+1, -1), Hex( 0, -1), Hex(-1, 0), Hex(-1, +1), Hex( 0, +1) ] function hex_direction(direction): return directions[direction] function hex_neighbor(hex, direction): var dir = hex_direction(direction) return Hex(hex.q + dir.q, hex.r + dir.r)
ãªãã»ãã座æš
軞座æšã§ã¯ãã°ãªããã®ã©ãã«ãããã«å¿ããŠå€æŽãå ããŸãã å/è¡ã®ãªãã»ããã«ããå Žåãã«ãŒã«ã¯ãªãã»ããã®ãªãå/è¡ã®å Žåãšã¯ç°ãªããŸãã
åãšåæ§ã«ã
col
ããã³
row
è¿œå ããæ°å€ã®ããŒãã«ãäœæããŸãã ãã ããä»åã¯2ã€ã®é
åããããŸãã1ã€ã¯å¥æ°å/è¡çšã§ããã1ã€ã¯å¶æ°å/è¡çšã§ãã äžèšã®ã°ãªãããããã§
(1,1)
èŠãŠã6ã€ã®åæ¹åã«ç§»åãããšãã«
col
ãš
row
ã©ã®ããã«å€åãããã確èªããŠãã ããã ããã§
(2,2)
ããã»ã¹ãç¹°ãè¿ããŸãã ããŒãã«ãšã³ãŒãã¯ã4çš®é¡ã®ãªãã»ããã°ãªããããšã«ç°ãªããŸããããããã®çš®é¡ã®ã°ãªããã«å¯Ÿå¿ããã³ãŒãã瀺ããŸãã
å¥æ° var directions = [ [ Hex(+1, 0), Hex( 0, -1), Hex(-1, -1), Hex(-1, 0), Hex(-1, +1), Hex( 0, +1) ], [ Hex(+1, 0), Hex(+1, -1), Hex( 0, -1), Hex(-1, 0), Hex( 0, +1), Hex(+1, +1) ] ] function offset_neighbor(hex, direction): var parity = hex.row & 1 var dir = directions[parity][direction] return Hex(hex.col + dir.col, hex.row + dir.row)
å¶æ°ïŒEVENïŒããã³å¥æ°ïŒODDïŒè¡ã®ã°ãªããã§ãr var directions = [ [ 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) ] ] function offset_neighbor(hex, direction): var parity = hex.row & 1 var dir = directions[parity][direction] return Hex(hex.col + dir.col, hex.row + dir.row)
å¶æ°ïŒEVENïŒããã³å¥æ°ïŒODDïŒè¡ã®ã°ãªããå¥æ° var directions = [ [ Hex(+1, 0), Hex(+1, -1), Hex( 0, -1), Hex(-1, -1), Hex(-1, 0), Hex( 0, +1) ], [ Hex(+1, +1), Hex(+1, 0), Hex( 0, -1), Hex(-1, 0), Hex(-1, +1), Hex( 0, +1) ] ] function offset_neighbor(hex, direction): var parity = hex.col & 1 var dir = directions[parity][direction] return Hex(hex.col + dir.col, hex.row + dir.row)
å¶æ°ïŒEVENïŒããã³å¥æ°ïŒODDïŒåã®ã°ãªããã§ãq var directions = [ [ 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) ] ] function offset_neighbor(hex, direction): var parity = hex.col & 1 var dir = directions[parity][direction] return Hex(hex.col + dir.col, hex.row + dir.row)
å¶æ°ïŒEVENïŒããã³å¥æ°ïŒODDïŒåã®ã°ãªããäžèšã®ã«ãã¯ã¢ããããŒãã«ã䜿çšããããšãããã€ããŒãèšç®ããæãç°¡åãªæ¹æ³ã§ãã èå³ãããå Žåã¯ã
ãããã®æ°å€ã®æœåºã«ã€ããŠãèªãããšãã§ã
ãŸã ã
察è§ç·
å
è§åœ¢ã®åº§æšã®ã察è§ã空éã移åãããšã3ã€ã®ç«æ¹äœåº§æšã®1ã€ã±2å€åããä»ã®2ã€ãâ1å€åããŸãïŒåèšã¯0ã®ãŸãŸã§ãªããã°ãªããŸããïŒã
var diagonals = [ Cube(+2, -1, -1), Cube(+1, +1, -2), Cube(-1, +2, -1), Cube(-2, +1, +1), Cube(-1, -1, +2), Cube(+1, -2, +1) ] function cube_diagonal_neighbor(hex, direction): return cube_add(hex, diagonals[direction])
åãšåæ§ã«ãçµæãèšç®ããåŸã3ã€ã®åº§æšã®ãããããæãç³ãããšã«ããããããã®åº§æšã軞ã«å€æãããããªãã»ãã座æšã«å€æã§ããŸãã
è·é¢
ç«æ¹åº§æš
ç«æ¹äœåº§æšç³»ã§ã¯ãåå
è§åœ¢ã¯3次å
空éã®ç«æ¹äœã§ãã é£æ¥ããå
è§åœ¢ã¯ãäºãã«1ã®è·é¢ã«ããå
è§åœ¢ã®ã°ãªããã«ãããŸãããç«æ¹äœã®ã°ãªããã«ã¯2ã®è·é¢ã«ãããŸãã ããã«ãããè·é¢ã®èšç®ãç°¡åã«ãªããŸãã æ£æ¹åœ¢ã®ã°ãªããã§ã¯ã
ãã³ããã¿ã³è·é¢ã¯
abs(dx) + abs(dy)
ã§ãã ç«æ¹äœã®ã°ãªããã§ã¯ããã³ããã¿ã³è·é¢ã¯
abs(dx) + abs(dy) + abs(dz)
ã§ãã å
è§åœ¢ã®ã°ãªããã®è·é¢ã¯ããã®ååã«çãããªããŸãã
function cube_distance(a, b): return (abs(ax - bx) + abs(ay - by) + abs(az - bz)) / 2
ãã®ãšã³ããªã«çžåœããã®ã¯ã3ã€ã®åº§æšã®1ã€ãä»ã®2ã€ã®åº§æšã®åèšã§ãªããã°ãªããããããè·é¢ãšããŠååŸãããšããåŒã§ãã 以äžã®ååã®åœ¢åŒãŸãã¯æ倧å€ã®åœ¢åŒãéžæã§ããŸãããåãçµæãåŸãããŸãã
function cube_distance(a, b): return max(abs(ax - bx), abs(ay - by), abs(az - bz))
å³ã§ã¯ãæ倧å€ãè²ã§åŒ·èª¿è¡šç€ºãããŠããŸãã ãŸããåè²ã¯6ã€ã®ã察è§ç·ãæ¹åã®1ã€ãè¡šããŠããããšã«æ³šæããŠãã ããã
軞座æš
ã¢ãã·ã£ã«ã·ã¹ãã ã§ã¯ã3çªç®ã®åº§æšã¯æé»çã«è¡šçŸãããŸãã è·é¢ãèšç®ããããã«ã¢ãã·ã£ã«ãããã¥ãŒããã¯ã·ã¹ãã ã«
å€æããŸãããïŒ
function hex_distance(a, b): var ac = hex_to_cube(a) var bc = hex_to_cube(b) return cube_distance(ac, bc)
ããªãã®ã±ãŒã¹ã®ã³ã³ãã€ã©ã
hex_to_cube
ãš
cube_distance
ïŒã€ã³ã©ã€ã³ã§ïŒåã蟌ãå Žåã次ã®ã³ãŒããçæããŸãïŒ
function hex_distance(a, b): return (abs(aq - bq) + abs(aq + ar - bq - br) + abs(ar - br)) / 2
軞座æšã®å
è§åœ¢éã®è·é¢ãèšé²ããå€ãã®ç°ãªãæ¹æ³ããããŸãããèšé²æ¹æ³ã«é¢ä¿ãªã
ã軞ã·ã¹ãã ã®å
è§åœ¢éã®è·é¢ã¯ç«æ¹ã·ã¹ãã ã®ãã³ããã¿ã³è·é¢ããæœåºãããŸã ã ããšãã°ã
ããã§èª¬æ
ãã ãå·®åã®å·®ãã¯ã
aq + ar - bq - br
ãšããè¡šèšãã
aq - bq + ar - br
ãšããŠååŸããã
cube_distance
äºå
cube_distance
ã§ã¯ãªãæ倧å€åœ¢åŒã䜿çšããŸãã 3次座æšãšã®é¢ä¿ãèŠããšããããã¯ãã¹ãŠé¡äŒŒããŠããŸãã
ãªãã»ãã座æš
軞座æšãšåæ§ã«ãå€äœã®åº§æšã3次座æšã«å€æãã3次ã·ã¹ãã ã®è·é¢ã䜿çšããŸãã
function offset_distance(a, b): var ac = offset_to_cube(a) var bc = offset_to_cube(b) return cube_distance(ac, bc)
å€ãã®ã¢ã«ãŽãªãºã ã§åããã³ãã¬ãŒãã䜿çšããŸããå
è§åœ¢ããç«æ¹äœãžã®å€æãã¢ã«ãŽãªãºã ã®ç«æ¹äœããŒãžã§ã³ã®å®è¡ãç«æ¹äœã®çµæã®å
è§åœ¢ã®åº§æšïŒè»žåº§æšãŸãã¯ãªãã»ãã座æšïŒãžã®å€æã
ç·ç»
ããå
è§åœ¢ããå¥ã®å
è§åœ¢ã«ç·ãåŒãæ¹æ³ã¯ïŒ
ç·åœ¢è£éã䜿çšããŠ
ç·ãæç»ããŸã ã ã©ã€ã³ã¯
N+1
ãã€ã³ãã§åçã«ãµã³ããªã³ã°ããããããã®ãµã³ãã«ãã©ã®å
è§åœ¢ã§ããããèšç®ãããŸãã
- æåã«ã端ç¹éã®å
è§åœ¢ã®è·é¢ã§ãã
N
ãèšç®ããŸãã - 次ã«ããã€ã³ãAãšBã®éã§
N+1
ãã€ã³ããåçã«ãµã³ããªã³ã°ããŸããç·åœ¢è£éã䜿çšããŠã 0
ããN
ãŸã§ã®å€i
ããããå«ãïŒã«ã€ããŠãåãã€ã³ããA + (B - A) * 1.0/N * i
ãŸãã å³ã§ã¯ããããã®å¶åŸ¡ç¹ã¯éã§ç€ºãããŠããŸãã çµæã¯æµ®åå°æ°ç¹åº§æšã§ãã - åå¶åŸ¡ç¹ïŒæµ®åïŒãå
è§åœ¢ïŒintïŒã«å€æããŸãã ãã®ã¢ã«ãŽãªãºã ã¯
cube_round
ãšåŒã°ãcube_round
ïŒä»¥äžãåç
§ïŒã
ãã¹ãŠããŸãšããŠAããBã«ç·ãåŒããŸãã
function lerp(a, b, t):
泚ïŒ
cube_lerp
ã2ã€ã®å
è§åœ¢ã®éã®å¢çäžã®ç¹ãè¿ãå ŽåããããŸãã 次ã«ã cube_round
ãããããæ¹åãŸãã¯å¥ã®æ¹åã«ã·ããããŸãã ç·ãåãæ¹åã«åãããšãç·ããããããã«èŠããŸãã ããã¯ããµã€ã¯ã«ãéå§ããåã«ãã€ãã·ãã³å
è§åœ¢Cube(1e-6, 1e-6, -2e-6)
ãäžæ¹ãŸãã¯äž¡æ¹ã®ãšã³ããã€ã³ãã«è¿œå ããããšã§å®è¡ã§ããŸãã ããã«ãããç·ãäžæ¹åã«ãæŒãåºããããé¢ã®å¢çã«èœã¡ãªãããã«ãªããŸãã- æ£æ¹åœ¢ã°ãªããã®DDAã©ã€ã³ã¢ã«ãŽãªãºã ã¯ã
N
ãå軞ã«æ²¿ã£ãæ倧è·é¢ã«çžåœããŸãã å
è§åœ¢ã®ã°ãªããã§ã®è·é¢ã«äŒŒãŠããç«æ¹äœç©ºéã§ãåãããšãè¡ããŸãã cube_lerp
é¢æ°ã¯ãfloatã®åº§æšãæã€ãã¥ãŒããè¿ãå¿
èŠããããŸãã éçåä»ãã䜿çšããèšèªã§ããã°ã©ãã³ã°ããå Žåã Cube
åã¯äœ¿çšã§ããŸããã 代ããã«ã FloatCube
ã®ã¿ã€ããå®çŸ©ããããå¥ã®ã¿ã€ããå®çŸ©ããããªãå Žåã¯ãã©ã€ã³ã¬ã³ããªã³ã°ã³ãŒãã«é¢æ°ãåã蟌ãïŒã€ã³ã©ã€ã³ïŒããšãã§ããŸãã- ïŒã€ã³ã©ã€ã³ïŒ
cube_lerp
ãåã蟌ã¿ãã«ãŒãå€ã§Bx-Ax
ã Bx-Ay
ããã³1.0/N
èšç®ããããšã«ãããã³ãŒããæé©åã§ããŸãã ä¹ç®ã¯ãç¹°ãè¿ãã®åèšã«å€æã§ããŸãã çµæã¯ãDDAã©ã€ã³ã¢ã«ãŽãªãºã ã®ãããªãã®ã§ãã - ç·ãæç»ããã«ã¯ã軞座æšãŸãã¯3次座æšã䜿çšããŸããããªãã»ãã座æšã䜿çšããå Žåã¯ã ãã®èšäºãåç
§ããŠãã ãã ã
- ç·ãæãããã®å€ãã®ãªãã·ã§ã³ããããŸãã ããªãŒããŒã³ãŒãã£ã³ã°ããå¿
èŠã«ãªãå ŽåããããŸãã å
è§åœ¢ã®ã¹ãŒããŒã³ãŒãã£ã³ã°ãããç·ãæãããã®ã³ãŒããéãããŸãããããŸã å匷ããŠããŸããã
å¯åç¯å²
座æšç¯å²
ç¹å®ã®å
è§åœ¢ã®äžå¿ãšç¯å²
N
ã©ã®å
è§åœ¢ããã®
N
ã¹ããã以å
ã«ãããŸããïŒ
å
è§åœ¢éã®è·é¢ã®åŒã®éã®äœæ¥ãè¡ãããšãã§ããŸã
distance = max(abs(dx), abs(dy), abs(dz))
ã
N
å
ã®ãã¹ãŠã®å
è§åœ¢ãèŠã€ããã«ã¯ã
max(abs(dx), abs(dy), abs(dz)) †N
ããã¯ã
abs(dx) †N
ããã³
abs(dy) †N
ããã³
abs(dz) †N
3ã€ã®å€ããã¹ãŠå¿
èŠã§ããããšãæå³ããŸã
abs(dz) †N
絶察å€ãåé€ãããšã
-N †dy †N
ããã³
-N †dy †N
ããã³
-N †dy †N
åŸãããŸã
-N †dz †N
ã³ãŒãã§ã¯ãããã¯ãã¹ããããã«ãŒãã«ãªããŸãã
var results = [] for each -N †dx †N: for each -N †dy †N: for each -N †dz †N: if dx + dy + dz = 0: results.append(cube_add(center, Cube(dx, dy, dz)))
ãã®ã«ãŒãã¯æ©èœããŸãããéåžžã«éå¹ççã§ãã ã«ãŒãã§å埩åŠçãããã¹ãŠã®
dz
å€ã®ãã¡ãå®éã«ãã¥ãŒãæ¡ä»¶
dx + dy + dz = 0
æºããã®ã¯1ã€ã ãã§ãã
代ããã«ãdz
æ¡ä»¶ãæºè¶³ããå€ãçŽæ¥èšç®ããŸãã var results = [] for each -N †dx †N: for each max(-N, -dx-N) †dy †min(N, -dx+N): var dz = -dx-dy results.append(cube_add(center, Cube(dx, dy, dz)))
ãã®ãµã€ã¯ã«ã¯ãå¿
èŠãªåº§æšã«ã®ã¿æ²¿ã£ãŠããŸããå³ã§ã¯ãåç¯å²ã¯è¡ã®ãã¢ã§ããåè¡ã¯äžçåŒã§ãã6ã€ã®äžçåŒãæºãããã¹ãŠã®å
è§åœ¢ãåããŸãã亀差ããç¯å²
è€æ°ã®ç¯å²ã«ããå
è§åœ¢ãèŠã€ããå¿
èŠãããå Žåã¯ãå
è§åœ¢ã®ãªã¹ããçæããåã«ç¯å²ã暪æã§ããŸãã代æ°ãŸãã¯å¹ŸäœåŠã®èŠ³ç¹ãããã®åé¡ã«ã¢ãããŒãã§ããŸãã代æ°çã«ã¯ãåé åã¯ã®åœ¢åŒã§äžçåŒã®æ¡ä»¶ãšããŠè¡šãã-N †dx †N
ããããã®æ¡ä»¶ã®å
±ééšåãèŠã€ããå¿
èŠããããŸãã幟äœåŠçã«ã¯ãåé åã¯3次å
空éã®ç«æ¹äœã§ããã3次å
空éã§2ã€ã®ç«æ¹äœã亀差ãããŠã3次å
空éã§çŽæ¹äœãååŸããŸãã次ã«ãå¹³é¢x + y + z = 0
ã«æ圱ããŠå
è§åœ¢ãååŸããŸãããã®åé¡ã代æ°çã«è§£æ±ºããŸãã第äžã«ãæã
ã¯æ¡ä»¶ãæžãæã-N †dx †N
ãããäžè¬çãªåœ¢ã§ããã€åããšãåãããšãããŸãããx min †x †x max
x min = center.x - N
x max = center.x + N
y
ãããŠz
ããã®çµæãåã®ã»ã¯ã·ã§ã³ããã³ãŒãã®äžè¬çãªãã¥ãŒãååŸããŸãïŒ var results = [] for each xmin †x †xmax: for each max(ymin, -x-zmax) †y †min(ymax, -x-zmin): var z = -xy results.append(Cube(x, y, z))
2ã®äº€ç¹ãç¯å²a †x †b
ãšc †x †d
ãããŸãmax(a, c) †x †min(b, d)
ãå
è§åœ¢ã®é åã¯ã®ç¯å²ãšããŠè¡šçŸããã®ã§x
ãy
ãz
æã
ã¯ãåã
ã®ãã³ãã®ããããã暪æããããšãã§ãx
ãy
ãz
ããã®åŸäº€å·®ç¹ã«ãããå
è§åœ¢ã®ãªã¹ããçæããããã«ããã¹ããããã«ãŒãã䜿çšããŸããäžæ¹ã®é åã®ããã«æã
ã¯å
è§åœ¢ãåããšãã«é¡äŒŒãããšãå
è§åœ¢ã®äºã€ã®é åã®äº€ç¹ã«ãæã
ã¯åãå
¥ãããšæ倧=åïŒH1.x + Nã H2.x + NïŒã¯ã åæ§ã§ãããšãåããã¿ãŒã³ã¯ã3ã€ä»¥äžã®é åã亀差ãããããã«æ©èœããŸããx min = Hx - N
x max = Hx + N
y
z
x min = max(H1.x - N, H2.x - N)
x
y
z
é害ç©
é害ç©ãããå Žåã¯ãè·é¢å¶éãåããã®ãæãç°¡åã§ãïŒã¯ã€ãæ€çŽ¢ïŒã次ã®å³ã§ã¯ã4ã€ã®åãã«å¶éãããŠããŸããã³ãŒãã§ã¯fringes[k]
ãããã¯k
ã¹ãããã§éæã§ãããã¹ãŠã®å
è§åœ¢ã®é
åã§ããã¡ã€ã³ãµã€ã¯ã«ãééãããã³ã«ãã¬ãã«k-1
ãlevelã«æ¡åŒµããŸãk
ã function cube_reachable(start, movement): var visited = set() add start to visited var fringes = [] fringes.append([start]) for each 1 < k †movement: fringes.append([]) for each cube in fringes[k-1]: 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
ã¿ãŒã³
ç¹å®ã®å
è§åœ¢ãã¯ãã«ïŒ2ã€ã®å
è§åœ¢ã®å·®ïŒã«å¯ŸããŠãå¥ã®å
è§åœ¢ãæãããã«å転ããå¿
èŠãããå ŽåããããŸããããã¯ã1/6ãµãŒã¯ã«ã¿ãŒã³ã«åºå·ããå Žåã3次座æšã§ç°¡åã«å®è¡ã§ããŸããå³ã«60°å転ãããšãå座æšãå³ã«1ããžã·ã§ã³ç§»åããŸãã [ x, y, z] to [-z, -x, -y]
å·Šã«60°å転ãããšãå座æšãå·Šã«1ããžã·ã§ã³ç§»åããŸãã [ x, y, z] to [-y, -z, -x]
[å
ã®èšäºã§]ã¹ããŒã ããåçããããšã60°å転ããããšã«ç¬Šå·ãå€åãã座æšãç©ççã«ãå転ãããããšãããããŸãã120°å転ãããšãèšå·ã¯åã³åãã«ãªããŸãã180床å転ãããšç¬Šå·ãå€ãããŸããã座æšã¯å
ã®äœçœ®ã«å転ããŸããäœçœ®Pãäžå¿äœçœ®Cãäžå¿ã«å転ããæ°ããäœçœ®Rã«è³ãå®å
šãªã·ãŒã±ã³ã¹ã次ã«ç€ºããŸãã- Pããã³Cã®äœçœ®ã3次座æšã«å€æããŸãã
- ïŒæžç®ããããšã«ãããã»ã³ã¿ãŒãã¯ãã«ç®åº
P_from_C = P - C = Cube(Px - Cx, Py - Cy, Pz - Cz)
ã P_from_C
äžèšã®ããã«ãã¯ãã«ãå転ããæçµçãªãã¯ãã«ã«æå®ãå²ãåœãŠR_from_C
ãŸãã- 圢質転æãã¯ã¿ãŒã¯ãè¿œå ã®äžå¿äœçœ®ã«æ»ããŸãïŒ
R = R_from_C + C = Cube(R_from_C.x + Cx, R_from_C.y + Cy, R_from_C.z + Cz)
ã - Rã®3次äœçœ®ãç®çã®åº§æšç³»ã«å€æããŸãã
å€æã«ã¯ããã€ãã®æ®µéããããŸããããããããéåžžã«åçŽã§ãã軞座æšã§çŽæ¥å転ãå®çŸ©ããããšã§ãããã®ã¹ãããã®äžéšãççž®ã§ããŸãããå
è§åœ¢ãã¯ãã«ã¯ãªãã»ãã座æšã§ã¯æ©èœããããªãã»ãã座æšã®ã¹ããããççž®ããæ¹æ³ãããããŸãããstackexchangeã§ããŒããŒã·ã§ã³ãèšç®ããä»ã®æ¹æ³ã®èª¬æãåç
§ããŠãã ãããæ茪
ã·ã³ãã«ãªãªã³ã°
ç¹å®ã®å
è§åœ¢ãç¹å®ã®ååŸã®ãªã³ã°ã«å±ããŠãããã©ããã調ã¹ãã«ã¯ãradius
ãã®å
è§åœ¢ããäžå¿ãŸã§ã®è·é¢ãèšç®ããçãããã©ããã調ã¹ãå¿
èŠããããŸãradius
ããã®ãããªãã¹ãŠã®å
è§åœ¢ã®ãªã¹ããååŸããã«radius
ã¯ãäžå¿ããã¹ããããèžã¿ããªã³ã°ã«æ²¿ã£ããã¹ã«æ²¿ã£ãŠå転ãããã¯ãã«ã«åŸãå¿
èŠããããŸãã function cube_ring(center, radius): var results = [] # radius == 0; , ? var cube = cube_add(center, cube_scale(cube_direction(4), radius)) for each 0 †i < 6: for each 0 †j < radius: results.append(cube) cube = cube_neighbor(cube, i) return results
ãã®ã³ãŒãcube
ã¯ãå³ã®äžå¿ããè§ã«åãã倧ããªç¢å°ã§ç€ºããããªã³ã°ããå§ãŸããŸãããŸããè§åºŠ4ãéžæããŸãããããã¯ãæ¹åçªå·ã移åãããã¹ã«å¯Ÿå¿ããŠããããã§ããå¥ã®éå§è§åºŠãå¿
èŠãªå ŽåããããŸããå
åŽã®ãµã€ã¯ã«ã®å段éã§cube
ããªã³ã°ã«æ²¿ã£ãŠ1ã€ã®å
è§åœ¢ã移åããŸããã¹ã«ãŒ6 * radius
å§ããå Žæã®æé ã¯å®äºããŸããã¹ãã€ã©ã«ãªã³ã°
ããããã¿ãŒã³ã«æ²¿ã£ãŠãªã³ã°ã«æ²¿ã£ãŠééãããšããªã³ã°ã®å
åŽã®éšåãåããããšãã§ããŸãã function cube_spiral(center, radius): var results = [center] for each 1 †k †radius: results = results + cube_ring(center, k) return results
倧ããªå
è§åœ¢ã®é¢ç©ã¯ããã¹ãŠã®åã®åèšã«äžå¿ã®1ãå ãããã®ã§ããé¢ç©ãèšç®ããã«ã¯ã次ã®åŒã䜿çšããŸãããã®æ¹æ³ã§å
è§åœ¢ããã€ãã¹ããããšã¯ã移åç¯å²ã®èšç®ã«ã䜿çšã§ããŸãïŒäžèšãåç
§ïŒãç¯å²
äžããããè·é¢ã§äžããããäœçœ®ããèŠãããã®ã¯äœã§ãé害ç©ã«ãã£ãŠãããã¯ãããŠããŸãããïŒãããå€æããæãç°¡åãªæ¹æ³ã¯ãç¹å®ã®ç¯å²å
ã®åå
è§åœ¢ã«ç·ãåŒãããšã§ããç·ãå£ã«åããªãå Žåã¯ãå
è§åœ¢ã衚瀺ãããŸãã[å
ã®èšäºã®å³]ã®å
è§åœ¢ã«æ²¿ã£ãŠããŠã¹ã移åãããšããããã®å
è§åœ¢ãžã®ç·ã®æç»ãšãç·ã亀ããå£ã衚瀺ãããŸãããã®ã¢ã«ãŽãªãºã ã¯åºãç¯å²ã§äœéã«ãªãå¯èœæ§ããããŸãããå®è£
ã¯ç°¡åãªã®ã§ãæåããå§ããããšããå§ãããŸããå¯èŠæ§ã«ã¯ããŸããŸãªå®çŸ©ããããŸããã€ãã·ã£ã«ã®äžå¿ããå¥ã®å
è§åœ¢ã®äžå¿ãèŠããã§ããïŒã¹ã¿ãŒãã®äžå¿ããå¥ã®å
è§åœ¢ã®äžéšãèŠããã§ããïŒãã¶ããéå§ç¹ã®ã©ãããã§ãå¥ã®å
è§åœ¢ã®äžéšã§ããïŒå®å
šãªå
è§åœ¢ãããå°ãªããã¥ãŒãžã®é害ïŒã¹ã³ãŒãã¯ãäžèŠæããããããunningã§å€æ§ãªæŠå¿µã§ããæãåçŽãªã¢ã«ãŽãªãºã ããå§ããŸãããããã ãããããžã§ã¯ãã®çããæ£ããèšç®ãããããšãæåŸ
ããŠãã ãããåçŽãªã¢ã«ãŽãªãºã ã§éè«ççãªçµæãåŸãããå ŽåããããŸããã§ã¯ã©ãŒã¯Verbruggeããã¥ã¢ã«ç¯å²ãèšç®ããããã®ã¢ã«ãŽãªãºã ã説æãããäžå€®ããéå§ããŠå€åŽã«ç§»åããŸãããGithubã«ããDueloãããžã§ã¯ããåç
§ããŠãã ãããéé ãå«ãç¯å²ã®ãªã³ã©ã€ã³ãã¢ããŸãã2Då¯èŠæ§ã®èšç®ã«é¢ããç§ã®èšäºãèªãããšãã§ããŸããããã«ã¯ãå
è§åœ¢ãå«ãå€è§åœ¢ã§åäœããã¢ã«ãŽãªãºã ããããŸããããŒã°ã©ã€ã¯ãã¡ã³ã³ãã¥ããã£ã«ã¯ãæ£æ¹åœ¢ã°ãªããçšã®åªããã¢ã«ãŽãªãºã ã»ããããããŸãïŒãã¡ãããã¡ãããã¡ããã芧ãã ããïŒããããã®ããã€ãã¯ãå
è§åœ¢ã®ã°ãªããã«é©å¿ãããããšãã§ããŸããå
è§åœ¢ãããã¯ã»ã«
å
è§åœ¢ãããã¯ã»ã«ã«å€æããã«ã¯ãããžãªã¡ããªãã»ã¯ã·ã§ã³ã«ç€ºãããŠãããµã€ãºãšå Žæã®ã¹ããŒã ã調ã¹ããšäŸ¿å©ã§ãã軞座æšã®å Žåãå
è§åœ¢ãããã¯ã»ã«ãžã®å€æã¯ãåºåºãã¯ãã«ãèæ
®ããŠã¢ãããŒãããå¿
èŠããããŸããå³ã§ã¯ãç¢å°AâQã¯åºåºãã¯ãã«qã§ãããAâRã¯åºåºãã¯ãã«rã§ãããã¯ã»ã«åº§æšã¯q_basis * q + r_basis * r
ã§ããããšãã°ãïŒ1ã1ïŒã®Bã¯åºåºãã¯ãã«qãšrã®åèšã§ããè¡åã©ã€ãã©ãªã䜿çšãããšãæäœã¯åçŽãªè¡åä¹ç®ã§ãããã ããããã§ã¯ãããªãã¯ã¹ãªãã§ã³ãŒããèšè¿°ããŸãã軞ã°ãªããã®ããx = q
ãz = r
次ã®ããã«ç§ã¯ããã®ã¬ã€ãã§äœ¿çšããããšã¯ãå€æã¯æ¬¡ã®ããã«ãªããŸãå¹³ããªäžé¢ãæããå
è§åœ¢ã®ãã function hex_to_pixel(hex): x = size * 3/2 * hex.q y = size * sqrt(3) * (hex.r + hex.q/2) return Point(x, y)
å
ã®ãšãã£ããããçš function hex_to_pixel(hex): x = size * sqrt(3) * (hex.q + hex.r/2) y = size * 3/2 * hex.r return Point(x, y)
ãããªãã¯ã¹ã¢ãããŒãã¯ãåŸã§ãã¯ã»ã«ã®åº§æšãå
è§åœ¢ã®åº§æšã«å€æããå¿
èŠããããšãã«äŸ¿å©ã§ãããããªãã¯ã¹ãéã«ããã ãã§ãã3次座æšã®å Žåã3次åºåºãã¯ãã«ïŒxãyãzïŒã䜿çšããããæåã«ãããã軞ã«å€æããŠãã軞åºåºãã¯ãã«ïŒqãrïŒã䜿çšã§ããŸãããªãã»ãã座æšã®å Žåãåçªå·ãŸãã¯è¡çªå·ãã·ããããå¿
èŠããããŸãïŒæŽæ°ã§ã¯ãªããªããŸãïŒããã®åŸãx軞ãšy軞ã«é¢é£ä»ããããããŒã¹ãã¯ãã«qãšrã䜿çšã§ããŸãïŒOdd-r function offset_to_pixel(hex): x = size * sqrt(3) * (hex.col + 0.5 * (hex.row&1)) y = size * 3/2 * hex.row return Point(x, y)
ã§ãr function offset_to_pixel(hex): x = size * sqrt(3) * (hex.col - 0.5 * (hex.row&1)) y = size * 3/2 * hex.row return Point(x, y)
å¥æ° function offset_to_pixel(hex): x = size * 3/2 * hex.col y = size * sqrt(3) * (hex.row + 0.5 * (hex.col&1)) return Point(x, y)
ã§ãq function offset_to_pixel(hex): x = size * 3/2 * hex.col y = size * sqrt(3) * (hex.row - 0.5 * (hex.col&1)) return Point(x, y)
æ®å¿µãªãããå€äœåº§æšã«ã¯ããããªãã¯ã¹ã§äœ¿çšã§ããåºåºãã¯ãã«ããããŸããããããããªãã»ãã座æšã§ãã¯ã»ã«ããå
è§åœ¢ãžã®å€æãããé£ããçç±ã®1ã€ã§ããå¥ã®ã¢ãããŒãïŒãªãã»ãã座æšã3次/軞座æšã«å€æããŠããã3次/軞座æšã®ãã¯ã»ã«ãžã®å€æã䜿çšããŸããæé©åäžã«å€æã³ãŒããåã蟌ãããšã«ãããäžèšãšåãçµæã«ãªããŸãããã¯ã»ã«ããå
è§åœ¢ãž
æãäžè¬çãªè³ªåã®1ã€ã¯ããã¯ã»ã«ã®äœçœ®ïŒããšãã°ãããŠã¹ã¯ãªãã¯ïŒãååŸããå
è§åœ¢ã®ã°ãªãã座æšã«å€æããæ¹æ³ã§ããïŒããã軞座æšãŸãã¯3次座æšã§ã©ã®ããã«è¡ããããã瀺ããŸãããªãã»ãã座æšã®å Žåãæãç°¡åãªæ¹æ³ã¯ã3次座æšãæåŸã«ãªãã»ãã座æšã«å€æããããšã§ãã- ãŸããå
è§åœ¢ãããã¯ã»ã«ãžã®å€æãéã«ããŸããããã«ãããå³ã«å°ããªéãåã§ç€ºãããŠããå
è§åœ¢ã®å°æ°åº§æšãåŸãããŸãã
- 次ã«ãå
è§åœ¢ã®å°æ°åº§æšãå«ãå
è§åœ¢ãå®çŸ©ããŸããå³ã§ã¯ãå
è§åœ¢ã匷調衚瀺ãããŠããŸãã
æã
ãæããå
è§åœ¢ã®ãã¯ã»ã«åº§æšã«åº§æšå€æããããã«q
ãr
åºåºãã¯ãã«ãåŸããx
ãy
ãããã¯è¡åä¹ç®ãšèŠãªãããšãã§ããŸããå°ã£ããããã®ãããªãã¯ã¹ã¯æ¬¡ã®ãšããã§ãããã¯ã»ã«ã®åº§æšãå
è§åœ¢ã®åº§æšã«æ»ãããšã¯ãããªãç°¡åã§ããè¡åãå転ã§ããŸãïŒãããã®èšç®ã«ãããq
ããã³ã®åæ°è»žåº§æšïŒæµ®åïŒãåŸããr
ãŸãããã®é¢æ°hex_round()
ã¯ãåæ°è»žåº§æšãå
è§åœ¢ã®æŽæ°è»žåº§æšã«å€æããŸãã軞æ¹åã®å°ã£ããããã®ã³ãŒãã¯æ¬¡ã®ãšããã§ãã function pixel_to_hex(x, y): q = (x * sqrt(3)/3 - y / 3) / size r = y * 2/3 / size return hex_round(Hex(q, r))
ãããŠãããã«è»žæ¹åã®ãã©ãããããå
è§åœ¢ã®ã³ãŒãããããŸãïŒ function pixel_to_hex(x, y): q = x * 2/3 / size r = (-x / 3 + sqrt(3)/3 * y) / size return hex_round(Hex(q, r))
ãããã®3è¡ã®ã³ãŒãã¯ããã¯ã»ã«ã®äœçœ®ãå
è§åœ¢ã®è»žåº§æšã«å€æããŸãããªãã»ãã座æšã䜿çšããå Žåã¯ãã䜿çšããŸãreturn cube_to_hex(cube_round(Cube(q, -qr, r)))
ããã¯ã»ã«ãå
è§åœ¢ã«å€æããæ¹æ³ã¯ä»ã«ããããããããŸããã§ããã®ããŒãžã¯ç§ã«ã¯ããç¥ãããŠããŸããæãè¿ãå
è§åœ¢ã«äžžããŸãã
æµ®åå°æ°ç¹ã䜿çšããŠ3次座æšïŒxãyãzïŒãååŸããå Žåããããã©ã®å
è§åœ¢ã«ãããã調ã¹ãå¿
èŠããããŸããããã¯ãç·ãæç»ãããã¯ã»ã«ããå
è§åœ¢ã«å€æããããšã§æ確ã«ãªããŸããæµ®åå°æ°ç¹å€ãæŽæ°å€ã«å€æããããšã¯äžžããšåŒã°ããããããã®ã¢ã«ãŽãªãºã ãåŒã³åºããŸããcube_round
ã3次浮åå°æ°ç¹åº§æšã§x + y + z = 0
ãã3次座æšã§ããããã£ãŠãåã³ã³ããŒãã³ããæãè¿ãæŽæ°ã«äžžããŸããã(rx, ry, rz)
ããã ããx + y + z = 0
äžžããåŸããšããä¿èšŒã¯ãããŸããrx + ry + rz = 0
ããããã£ãŠãæ¡ä»¶ãrx + ry + rz = 0
çã«ãªãããã«ãæ倧ââã®å€æŽã§ã³ã³ããŒãã³ããå€æŽããŸããããšãã°ãå€åãy
abs(ry-y)
倧ããå Žåabs(rx-x)
ãããŠãabs(rz-z)
ãããã«å€æŽãry = -rx-rz
ãŸããããã¯ç§ãã¡ã«ãããä¿èšŒãrx + ry + rz = 0
ãŸããã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ãã function cube_round(h): var rx = round(hx) var ry = round(hy) var rz = round(hz) var x_diff = abs(rx - hx) var y_diff = abs(ry - hy) var z_diff = abs(rz - hz) if x_diff > y_diff and x_diff > z_diff: rx = -ry-rz else if y_diff > z_diff: ry = -rx-rz else: rz = -rx-ry return Cube(rx, ry, rz)
éãã¥ãŒããã¯åº§æšã®å Žåããã¥ãŒããã¯åº§æšã«å€æããäžžãã¢ã«ãŽãªãºã ã䜿çšããŠããå
ã«æ»ãã®ãæãç°¡åã§ãã function hex_round(h): return cube_to_hex(cube_round(hex_to_cube(h)))
å®è£
ã«é¢ãã泚æïŒcube_round
ããã³hex_round
intã§ã¯ãªãfloatã§åº§æšãååŸããŸããCube
ãšclassesãäœæããå ŽåHex
ãæŽæ°ã®ä»£ããã«æµ®åå°æ°ç¹æ°ãæž¡ãããšãã§ããåçåä»ãã®èšèªãããã³çµ±äžåã®åãæã€éçåä»ãã®èšèªã§æ£åžžã«åäœããŸãããã ããéçåä»ãã䜿çšããã»ãšãã©ã®èšèªã§ã¯ãfloat座æšçšã«å¥ã®ã¯ã©ã¹/æ§é äœåãå¿
èŠã§ããcube_round
ãtypeãããFloatCube â Cube
ãŸããå¿
èŠãªå Žåã¯hex_round
ã代ããã«FloatHex â Hex
ãã«ããŒé¢æ°ãfloatcube_to_floathex
䜿çšãcube_to_hex
ãŸãããã©ã¡ãŒã¿ãŒåãããåïŒC ++ãHaskellãªã©ïŒãæã€èšèªã§ã¯ãTãintãŸãã¯floatã§ããCubeãå®çŸ©ã§ããŸãããŸãã¯æžãããšãã§ããŸãcube_round
ãã®é¢æ°ã®ã¿ã«æ°ããåãå®çŸ©ãã代ããã«ãå
¥åãšããŠ3ã€ã®æµ®åå°æ°ç¹æ°ãååŸããŸããå°å³ã軞座æšã§ä¿åãã
ã»ãšãã©ã®å Žåã軞座æšç³»ã¯ãé·æ¹åœ¢ã®ãããã䜿çšãããšãã«ã¹ããŒã¹ãç¡é§ã«æ¶è²»ãããããèŠæ
ãåŒãèµ·ãããŸãããããå€äœåº§æšç³»ã®çç±ã®1ã€ã§ãããã ããäžè§åœ¢ãŸãã¯å
è§åœ¢ã®ãããã䜿çšãããšãå
è§åœ¢ã®ãã¹ãŠã®åº§æšç³»ã§ã¹ããŒã¹ãæ¶è²»ãããŸãã 1ã€ã®æŠç¥ã䜿çšããŠãããããã¹ãŠã®ã¿ã€ãã®ã«ãŒããä¿åã§ããŸããé·æ¹åœ¢ã®å°å³äžè§åœ¢ã®å°å³å
è§åœ¢ã®å°å³è±åœ¢ã®å°å³å³ã§ã¯ãæªäœ¿çšã®ã¹ããŒã¹ã¯åç·ã®å·Šå³ã«ããããšã«æ³šæããŠãã ããïŒè±åœ¢ã®å°å³ãé€ãïŒãããã«ãããã«ãŒãã¹ãã¬ãŒãžæŠç¥ã®3ã€ã®ãªãã·ã§ã³ãæäŸãããŸãã- . . . , .
- - . , .
q,r
hash_table(hash(q,r))
. / , . - . . . . , 0, .
, « ». q,r
, array[r][q - first_column[r]]
. / , . first_column
.
, « » « », .
first_column[r] == -floor(r/2)
. array[r][q + r/2]
, .- , ,
first_column[r] == 0
, access array[r][q]
â ! , - ( ), array[r][q+r]
. N
, N = max(abs(x), abs(y), abs(z)
, first_column[r] == -N - min(0, r)
. array[r][q + N + min(0, r)]
. - r < 0
, array[r + N][q + N + min(0, r)]
.- ,
array[r][q]
.
äžéšã®ã²ãŒã ã§ã¯ãã«ãŒãã®ç«¯ãããã£ã€ãããå¿
èŠããããŸããæ£æ¹åœ¢ãããã¯ãx軞ïŒçäœã«ã»ãŒå¯Ÿå¿ïŒãŸãã¯x軞ãšy軞ïŒããŒã©ã¹ã«ã»ãŒå¯Ÿå¿ïŒã«æ²¿ã£ãŠã®ã¿ã©ããã§ããŸããæå°åã¯ãèŠçŽ ã®åœ¢ç¶ã§ã¯ãªãããããã®åœ¢ç¶ã«äŸåããŸããæ£æ¹åœ¢åº§æšãããã®æå°åã¯ããªãã»ãã座æšã§ç°¡åã«å®è¡ã§ããŸããå
è§åœ¢ã®ãããã3次座æšã§æãç³ãæ¹æ³ã瀺ããŸãããããã®äžå¿ã«é¢ããŠã¯ã6ã€ã®ããã©ãŒãã»ã³ã¿ãŒããããŸããããããé¢ãããšããã¡ã€ã³ãããã«åã³æ»ããŸã§ãæãè¿ããã©ãŒäžå¿ãåŒããŸãã [å
ã®èšäº]ã®å³ã§ãäžå€®ã®å°å³ããé¢ããŠãé¡ã®äžå¿ã®1ã€ãå察åŽããå°å³ã«å
¥ãæ§åã芳å¯ããŸããæãç°¡åãªå®è£
ã¯ãåçãäºåã«èšç®ããããšã§ãããããããåºãåå
è§åœ¢ãå察åŽã®å¯Ÿå¿ãããã¥ãŒããæ ŒçŽããã«ãã¯ã¢ããããŒãã«ãäœæããŸãã6ã€ã®ãã©ãŒã»ã³ã¿ãŒã®M
ãããããšããããäžã®åäœçœ®ã«ã€ããŠãL
ä¿åãmirror_table[cube_add(M, L)] = L
ãŸãããã©ãŒã®ããŒãã«ã«ããå
è§åœ¢ãèšç®ãããã³ã«ããã©ãŒãªã³ã°ãããŠããªãããŒãžã§ã³ã«çœ®ãæããŸããååŸã®ããå
è§åœ¢ã®ãããã§ã¯ãN
ãã©ãŒã®äžå¿Cube(2*N+1, -N, -N-1)
ã6ã¿ãŒã³ã«ãªããŸããéãæ¢ã
A *æ€çŽ¢ã¢ã«ãŽãªãºã ãDijkstraãŸãã¯Floyd-Warshallã¢ã«ãŽãªãºã ãªã©ãã°ã©ãã§ãã¹æ€çŽ¢ã䜿çšããå Žåãå
è§åœ¢ã°ãªããã§ã®ãã¹æ€çŽ¢ã¯ãæ£æ¹åœ¢ã°ãªããã§ã®ãã¹æ€çŽ¢ãšå€ãããŸããããã¹æ€çŽ¢ã¬ã€ãã®èª¬æãšã³ãŒãã¯ãå
è§åœ¢ã®ã°ãªããã«é©çšãããŸãã[å
ã®èšäºã§ã¯ããã®äŸã¯ã€ã³ã¿ã©ã¯ãã£ãã§ãããŠã¹ã¯ãªãã¯ã§å£ãè¿œå ããã³åé€ã§ããŸã]- é£äººããã¹æ€çŽ¢ã¬ã€ãã«ç€ºãããŠããã³ãŒãäŸã¯ãèŠçŽ ã«é£æ¥ããäœçœ®ãååŸããããã«åŒã³åºããŠããŸã
graph.neighbors
ãããã«ã¯ããè¿ãã®å
è§åœ¢ãã»ã¯ã·ã§ã³ã®æ©èœã䜿çšããŸãã貫éã§ããªãé£æ¥ããå
è§åœ¢ãé€å»ããŸãã - ãã¥ãŒãªã¹ãã£ãã¯ãã¢ã«ãŽãªãºã A *ã®ã³ãŒãäŸã§ã¯
heuristic
ã2ã€ã®äœçœ®éã®è·é¢ãååŸããé¢æ°ã䜿çšãããŠããŸããè·é¢ã®åŒã«ç§»åã³ã¹ããæããŠäœ¿çšããŸããããšãã°ã移åã«å
è§åœ¢ããã5ãŠãããã®ã³ã¹ãããããå Žåãè·é¢ã«5ãæããŸãã
è¿œå ã®èªæž
C ++ãJavaãCïŒãJavascriptãHaxeãPythonã®ã³ãŒãäŸã䜿çšããŠãå
è§åœ¢ã°ãªããã®ç¬èªã®ã©ã€ãã©ãªãå®è£
ããããã®ã¬ã€ãããããŸãã- ã°ãªããã¬ã€ãã§ã¯ã軞座æšç³»ãšãæ£æ¹åœ¢ãäžè§åœ¢ãå
è§åœ¢ã®é¢ãšè§åºŠã®åŠçã«ã€ããŠèª¬æããŸãããŸããæ£æ¹åœ¢ãšå
è§åœ¢ã®ã°ãªããã®æ¥ç¶æ¹æ³ã«ã€ããŠã説æããŸãã
- , , , 1996 .
- 1994 rec.games.programmer .
- DevMag , , , . PDF , . ! GameLogic Grids Unity.
- .
- : ( ), , () ().
- Rot.js : (), ( ), (), .
- : ?
- .
- .
- .
- , .
- HexPart , .
- ?
- , . [ ]
- Hexnet , , , .
- PDF , .
- ; .
- Hex-Grid Utilities â C# , , , . MIT.
- Reddit , Hacker News MetaFilter .
ãã®èšäºã®[å
ã®]ã³ãŒãã¯ãHaxeãšJavascriptã®æ··åã§èšè¿°ãããŠããŸãïŒCube.hxãHex.hxãGrid.hxãScreenCoordinate.hxãui.jsããã³cubegrid.jsïŒãã¥ãŒã/å
è§åœ¢ã®ã¢ãã¡ãŒã·ã§ã³çšïŒããã ããå
è§åœ¢ã°ãªããã®ç¬èªã®ã©ã€ãã©ãªãäœæããå Žåã¯ã代ããã«å®è£
ã¬ã€ããæ€èšããããšããå§ãããŸãããã®ã¬ã€ããããã«æ¡åŒµããããšæããŸããTrelloã«ãªã¹ãããããŸãã