以下方案基于將三維立方體堆疊數(shù)據(jù)轉(zhuǎn)換為二維平面數(shù)據(jù)些侍,最終構(gòu)成的是尖朝上六邊形地圖。邊朝上六邊形地圖也可得出相似的推論政模。
一切的想法源自一張立體圖:
上圖中岗宣,每個(gè)正方體在屏幕上的投影,都是一個(gè)正六邊形览徒。所以逆向思考,可以認(rèn)為六邊形地圖中的每個(gè)六邊形颂龙,都是一個(gè)立方體习蓬。 基于此纽什,我們便可以開始進(jìn)行六邊形地圖方案的設(shè)計(jì)與推演。 設(shè)計(jì)與推演的目的躲叼,是能夠找到巨象數(shù)據(jù)與抽象理論之間的關(guān)系芦缰,以協(xié)助我們通過計(jì)算機(jī)的形式去進(jìn)行計(jì)算。
坐標(biāo)系的建立
坐標(biāo)系的引入思路
既然我們已經(jīng)將每一個(gè)六邊形地圖巨象成為了一個(gè)立方體枫慷,那么我們就令這些立方體是邊長為1的立方體让蕾。基于此或听,我們便可以給每個(gè)立方體定義坐標(biāo)探孝,并建立坐標(biāo)系。
如上圖誉裆,建立三維坐標(biāo)系顿颅,其中我們定義藍(lán)色為X
軸,綠色為Y
軸足丢,紅色為Z
軸粱腻。
基于三維坐標(biāo)系,我們便可以求出每個(gè)方塊的坐標(biāo)斩跌。比如在上圖中绍些,左下方塊即可定位為(5,0,0)
,則右側(cè)方塊坐標(biāo)依次為(4,0,1)
耀鸦、(3,0,2)
柬批、(2,0,3)
、(1,0,4)
揭糕、(0,0,5)
萝快。
坐標(biāo)系的確立
那么,讓我們將焦點(diǎn)聚焦到最基本的六邊形地圖轉(zhuǎn)換的立體圖上著角。
如上圖揪漩,我們可以理解為這是一張二維平面圖,每個(gè)六邊形格子可以用(x,y)
的形式去表述吏口;同時(shí)也可以理解它是一個(gè)三維世界的二維投影奄容,每個(gè)立方體都可以用(x,y,z)
的形式去表述。
那么产徊,針對(duì)上圖中所選立方體昂勒,我們將其坐標(biāo)設(shè)為(0,0,0)
,而其代表的六邊形格子的坐標(biāo)則設(shè)定為(0,0)
舟铜。直觀地戈盈,該點(diǎn)右側(cè)的六邊形二維坐標(biāo)為(0,1)
,該立方體右側(cè)立方體的坐標(biāo)為(1,0,-1)
。
基于此塘娶,應(yīng)用于生產(chǎn)環(huán)境的坐標(biāo)系得以確立归斤,下一步,就是推導(dǎo)該坐標(biāo)系下的數(shù)學(xué)規(guī)律刁岸。
坐標(biāo)系下的運(yùn)算法則
設(shè)某立方體坐標(biāo)為(0,0,0)
脏里,那么根據(jù)圖例,我們可以推導(dǎo)出它周邊六個(gè)立方體的坐標(biāo)虹曙。
以點(diǎn) (0,0,0) 為基礎(chǔ)迫横,
左上角點(diǎn)坐標(biāo)為 (-1,1,0),
右上角點(diǎn)坐標(biāo)為 (0,1,-1)酝碳,
右點(diǎn)坐標(biāo)為 (1,0,-1)矾踱,
右下角點(diǎn)坐標(biāo)為 (1,-1,0),
左下角點(diǎn)坐標(biāo)為 (0,-1,1)击敌,
左點(diǎn)坐標(biāo)為 (-1,0,1)
(-1,1,0) (0,1,-1)
(-1,0,1) (0,0,0) (1,0,-1)
(0,-1,1) (1,-1,0)
當(dāng)我們推算出三維坐標(biāo)系下介返,原點(diǎn)周圍六個(gè)點(diǎn)的坐標(biāo)之后,便可以將這六個(gè)點(diǎn)的坐標(biāo)轉(zhuǎn)換為六個(gè)向量沃斤,分別表示指定的某個(gè)方塊周圍六個(gè)點(diǎn)的偏移向量圣蝎。
基于我們是由原點(diǎn)開始構(gòu)建坐標(biāo)系,且已獲取到六個(gè)方向的偏移向量衡瓶,可以得出以下結(jié)論:
結(jié)論1: 坐標(biāo)系中所有點(diǎn)的坐標(biāo)的x
徘公、y
、z
三值之和為0哮针。
結(jié)論1推導(dǎo):因坐標(biāo)系以(0,0,0)
點(diǎn)開始关面,且各偏移向量的x
、y
十厢、z
值之和為0等太,所以可推導(dǎo)出坐標(biāo)系中所有點(diǎn)的坐標(biāo)的x
、y
蛮放、z
三值之和為0缩抡。
結(jié)論2: 設(shè)坐標(biāo)系中任意兩點(diǎn)的坐標(biāo)差為(x,y,z)
,則x+y+z=0
成立包颁。
結(jié)論2推導(dǎo):兩坐標(biāo)點(diǎn)的坐標(biāo)差可以理解為由A點(diǎn)到B點(diǎn)所經(jīng)過的變換瞻想。因該變換由六個(gè)方向的偏移向量組成,且六個(gè)偏移向量滿足x+y+z=0
,所以該結(jié)論成立。
根據(jù)數(shù)學(xué)歸納法楔壤,我們可以依據(jù)所有點(diǎn)(二維坐標(biāo)下的六邊形,三維坐標(biāo)下的方塊)的二維與三維坐標(biāo)格遭,求出他們相互之間的轉(zhuǎn)化關(guān)系:
結(jié)論3: 設(shè)某點(diǎn)二維坐標(biāo)為(a,b)
,三維坐標(biāo)為(x,y,z)
椭盏,則對(duì)任意一點(diǎn)蚌斩,
存在三維轉(zhuǎn)二維運(yùn)算:a=x+(y>>1), b=y呵俏;
存在二維轉(zhuǎn)三維運(yùn)算:x=a-(b>>1), y=b, z=-x-y拴驮。
地圖常用的功能之一便是求取每個(gè)點(diǎn)之間的距離。因?yàn)槎S坐標(biāo)不便于我們求取距離柴信,所以我們優(yōu)先推算每個(gè)點(diǎn)在三維坐標(biāo)下距離的求取方式,之后再利用二維坐標(biāo)與三維坐標(biāo)之間的轉(zhuǎn)換關(guān)系宽气,即可完成二維左標(biāo)下求取兩點(diǎn)距離的計(jì)算流程随常。
我們先拋出結(jié)論:
結(jié)論4: 設(shè)A點(diǎn)與B點(diǎn)三維坐標(biāo)差為(x,y,z)
,則該坐標(biāo)差的本質(zhì)為6個(gè)偏移向量中的1-2個(gè)各放大不同倍數(shù)后疊加而成萄涯。
結(jié)論5: 設(shè)A點(diǎn)與B點(diǎn)三維坐標(biāo)差為(x,y,z)
绪氛,則A點(diǎn)與B點(diǎn)的距離為x
、y
涝影、z
中絕對(duì)值的最大值枣察。
我們先選擇一個(gè)點(diǎn)作為起始點(diǎn)。
之后我們?cè)龠x擇一個(gè)點(diǎn)作為目標(biāo)點(diǎn)燃逻。
從起始點(diǎn)到目標(biāo)點(diǎn)序目,可以有兩種路徑方案,如下圖實(shí)例:
兩種方案雖然行走路徑不同伯襟,但是距離相同猿涨。其本質(zhì)就是n
個(gè)偏移向量的疊加。而由于六邊形地圖自身的性質(zhì)姆怪,構(gòu)成兩點(diǎn)之間路徑的偏移向量叛赚,只可能是單獨(dú)1個(gè)向量或相鄰的2個(gè)向量組合而成。
目光回到偏移向量稽揭,我們可以發(fā)現(xiàn)任意相鄰的2個(gè)向量存在一個(gè)坐標(biāo)具有相同的值俺附,所以結(jié)合兩點(diǎn)之間路徑的偏移向量的本質(zhì),就可以得出結(jié)論5溪掀。