分類:程式設計 × 東方術數
紫微斗數的安星(Star Placement,安星),是指依照出生資料,計算每一顆星曜在十二宮中的位置。本文將從程式設計角度介紹完整紫微斗數 Engine 的核心演算法。
1. 十二宮資料結構(Data Structure,資料結構)
一張紫微斗數命盤由 十二宮 組成,通常排列成四行三列。
每一宮保存:
- 宮位名稱
- 星曜列表
- 天干、地支
- 長生位置
const CUNG_ORDER = [
'命宮', '兄弟', '夫妻', '子女',
'財帛', '疾厄', '遷移', '僕役',
'官祿', '田宅', '福德', '父母'
];
// 每一宮對應一個地支(子~亥),
// 並依命宮位置旋轉整個命盤。
2. 第一步:計算局數(Cục Số)
局數(Configuration Number,局數)決定紫微星的安星方式。
局數共有五種:
- 水二局
- 木三局
- 金四局
- 土五局
- 火六局
其計算依據:
- 出生年天干
- 農曆月份
- 命宮納音五行
演算法如下:
function cucSo(amLichMonth, yearStem) {
// Step 1:
// 找出命宮干支的納音五行
// Step 2:
// 五行對應局數
const NH = napAmNguHanh;
return {
水:2,
木:3,
金:4,
土:5,
火:6
}[NH];
}
3. 第二步:安紫微星
紫微星的位置取決於:
- 農曆生日
- 局數
通常可表示為一個 30 × 5 Lookup Table(查找表)。
// 簡化後的概念
tuViPosition =
(lunarDay - 1 + offset[cuc]) % 12;
const TV_TABLE = {
2: [/* 水二局 30 筆 */],
3: [/* 木三局 30 筆 */],
4: [/* 金四局 30 筆 */],
5: [/* 土五局 30 筆 */],
6: [/* 火六局 30 筆 */]
};
不同局數會對應不同的查找表,因此同一天出生的人,在不同局數下,紫微星的位置也可能不同。
4. 第三步:安其他星曜
確定紫微星位置後,其餘星曜便依各自規則配置。
十四主星
十四主星的位置通常以紫微星為基準,依固定規則配置。
六吉星
包括:
- 文昌
- 文曲
- 左輔
- 右弼
- 天魁
- 天鉞
主要依據:
- 出生年天干
- 地支
- 出生時辰
六煞星
包括:
- 擎羊
- 陀羅
- 火星
- 鈴星
- 天空
- 地劫
主要依據:
- 年干
- 時支
四化(Four Transformations,四化)
包括:
- 化祿
- 化權
- 化科
- 化忌
通常使用:
十天干 × 四化
形成固定查找表,共約四十筆對應資料。
5. 演算法複雜度(Complexity Analysis,複雜度分析)
完整安星流程如下:
輸入:
- 出生年
- 農曆月
- 農曆日
- 出生時辰
- 性別
輸出:
- 十二宮
- 約 108~115 顆星曜(依不同流派而異)
演算法特性:
- 時間複雜度(Time Complexity,時間複雜度):O
- 幾乎全部採用 Lookup Table(查找表)完成
- 不涉及大量數值運算
真正最耗時的部分並不是安星,而是:
西曆 → 農曆轉換
此步驟通常需要依賴 VSOP87(行星位置模型) 等天文演算法計算節氣、新月與農曆月份。
在現代硬體上,
整個紫微斗數 Engine 通常可於 10 毫秒以內完成安星,實際執行時間多半消耗於介面繪製(Rendering,渲染)而非演算法本身。