紫微斗數安星演算法:如何計算 108+ 顆星曜的位置

分類:程式設計 × 東方術數

紫微斗數的安星(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,渲染)而非演算法本身。