目標:製作一個人類圖模組
輸入:生日日期時間
輸出:一 2x13(共 26 個數字)的人類圖矩陣
nest g module body-graph
呼叫 swisseph 提供的 swe_set_ephe_path()
函數,參數可替換為其他星曆的資料檔路徑,例如 JPL。
// body-graph.module.ts
@Module({})
export class BodyGraphModule implements OnModuleInit {
public onModuleInit(): void {
swe_set_ephe_path('');
}
}
雖然從生辰時間,到計算出星球角度的矩陣,這之間的過程都是同步的運算。這邊還是利用 CQRS 的 Command Pattern 編寫邏輯,目的是這個命令未來可能會將結果寫入資料庫,只是目前還沒有這樣的實作。
參數目前只有一個——出生時間,未來可能還會有使用者的相關資訊,以便一起寫入資料庫。
export class GenerateBodyGraphCommand implements ICommand {
public constructor(public readonly birth: IDateTime) {}
}
人類圖分成兩組數據,原文用 imprint 這個字,翻作「銘刻」、「版本說明」,分別為:個性(Personality)和設計(Design)。
個性是出生當下,天球上 13 顆星體的角度位置;設計是出生當下的太陽角度往前推算 88 度時,天球上 13 顆星體的角度位置。
13 顆星體分別為太陽、地球、月亮、北交點、南交點、水星、金星、火星、木星、土星、天王星、海王星和冥王星。
每顆星體的角度透過座標系轉換,可以對應到易經六十四卦的座標系。這個演算法會得到一組子結構(Substructure),目前只需用到閘門(gate)和爻線(line)。
我們可以 TypeScript interface 將所需的資結定義如下:
export interface ISubstructure {
gate: number;
line: number;
}
export interface IImprint {
sun: ISubstructure;
earth: ISubstructure;
moon: ISubstructure;
northNode: ISubstructure;
southNode: ISubstructure;
mercury: ISubstructure;
venus: ISubstructure;
mars: ISubstructure;
jupiter: ISubstructure;
saturn: ISubstructure;
uranus: ISubstructure;
neptune: ISubstructure;
pluto: ISubstructure;
}
export interface IBodyGraph {
personality: IImprint;
design: IImprint;
}
座標系轉換的演算法明天再做詳細的介紹。
晚安,瑪卡巴卡。