Skip to main content

五行能量計算

在生辰八字排盤出來後,程式碼接下來會進行最核心的「五行能量計算」。 在傳統中醫與命理學中,不是只單純數「有幾個木、幾個火」,因為每個字出生的季節不同、影響力也不同。這套程式碼將傳統的「地支藏干」與「季節加權」轉化成了數學計分公式。 以下為您詳細拆解程式中 calcElemEnergy() 函數的計算內幕:

第一步:認識基礎分數與藏干(Base)

在八字中,天干的力量是顯露在外的(100% 完整),但地支就像是一個個百寶箱,裡面往往躲著 1 到 3 個不同的天干(稱為地支藏干或人元)

  • 程式碼中定義了 ZHI_RENYUAN(地支藏干表),並給予了精準的能量比例:
  • 子(鼠):「癸水」,佔 100% (1.0)。
  • 丑(牛):「己土」佔 60% (0.6)、「癸水」佔 30% (0.3)、「辛金」佔 10% (0.1)。
  • 程式設定的基礎配分:每一個天干出現,基本分直接給 120 分。每一個地支出現,基本分總共給 240 分(再乘以藏干的比例)。
  • 例如「丑」地支:裡面的土拿到 240 x 0.6 = 144 分;水拿到 240 x 0.3 = 72 分;金拿到 240 x 0.1 = 24 分。
// 地支藏干對應的人元天干(主氣)
const ZHI_RENYUAN = {
0: [[9,1.0]], // 子: 癸 (100%)
1: [[5,0.6],[9,0.3],[7,0.1]], // 丑: 己60% 癸30% 辛10%
2: [[0,0.7],[2,0.2],[4,0.1]], // 寅: 甲70% 丙20% 戊10%
3: [[1,1.0]], // 卯: 乙100%
4: [[4,0.7],[1,0.2],[9,0.1]], // 辰: 戊70% 乙20% 癸10%
5: [[2,0.7],[4,0.2],[6,0.1]], // 巳: 丙70% 戊20% 庚10%
6: [[3,0.7],[5,0.3]], // 午: 丁70% 己30%
7: [[5,0.6],[3,0.3],[1,0.1]], // 未: 己60% 丁30% 乙10%
8: [[6,0.7],[8,0.2],[4,0.1]], // 申: 庚70% 辛20% 戊10%
9: [[7,1.0]], // 酉: 辛100%
10: [[4,0.7],[7,0.2],[3,0.1]], // 戌: 戊70% 辛20% 丁10%
11: [[8,0.7],[0,0.2],[1,0.1]], // 亥: 壬70% 癸20% 乙10%
};

第二步:引進「月令」季節加權(Weights)

在中醫五行看體質時,出生的月份(月柱)是最關鍵的。夏天出生的人心火通常較旺,冬天出生的人腎水通常較深。因此,程式碼引入了權重陣列(Weights):

// ── 五行能量計算 ───────────────────────────────────────────
function calcElemEnergy(pillars) {
// 月柱加權 1.2
const weights = [1, 1.2, 1, 1]; // 年柱加權 1.0, 月柱加權 1.2, 日柱加權 1.0, 時柱加權 1.0
const energy = new Array(10).fill(0);
pillars.forEach((p, i) => {
const w = weights[i] || 1;
energy[p.gan] += 120 * w;
(ZHI_RENYUAN[p.zhi] || []).forEach(([gi, ratio]) => {
energy[gi] += 240 * ratio * w;
});
});
return energy;
}

function getElemStatus(ratio, upper, lower) {
if (ratio > upper) return 'excess';
if (ratio < lower) return 'deficient';
return 'normal';
}

當計算到月柱的天干與地支時,算出來的分數都會被額外乘以 1.2 倍。這在算法上完美呼應了命理學中「得時得令」的力量加成。

第三步:分數加總與「平衡基準點」

  • 程式會跑一個循環,把年、月、日、時四柱的天干與地支分數全部算出來,並歸類到 10 天干中,最後再加總成「木、火、土、金、水」五大類。
  • 然而,每個人因為有注入口令(有沒有輸入時辰),總分會不一樣。為了讓每個人都能在同一個標準下比較,程式計算出了「平衡基準點(Balance)」:
平衡基準點 (Balance)=五行所有分數的總和5\text{平衡基準點 (Balance)} = \frac{\text{五行所有分數的總和}}{5}
  • 這個基準點的意思是:「如果你的八字五行完全平衡、不偏不倚,每一個五行應該要拿到的完美分數。」

第四步:算出能量偏差率(Ratios)

  • 最後,網頁上顯示的 +35.2%+35.2\%12.5%-12.5\% 的進度條,就是透過這個公式算出來的「偏差率」:
五行能量偏差率=該五行實際總分平衡基準點平衡基準點五行能量偏差率 = \frac{\text{該五行實際總分} - \text{平衡基準點}}{\text{平衡基準點}}

數據背後的醫學養生含意:

  • 程式碼設定了兩個關鍵的評估界線:上限 +50%(ELEM_UPPER) 與 下限 -30%(ELEM_LOWER)
// 能量計算
const energy = calcElemEnergy(pillars);
const total = energy.reduce((a, b) => a + b, 0);
const balance = total / 5;
const elemEnergy = [0,0,0,0,0];
energy.forEach((e, gi) => { elemEnergy[Math.floor(gi / 2)] += e; });
const elemRatios = elemEnergy.map(e => (e - balance) / balance);
const ganRatios = energy.map(e => (e - balance) / balance);

const ELEM_UPPER = 0.5, ELEM_LOWER = -0.3;
const GAN_UPPER = 0.9, GAN_LOWER = -0.6;
  1. 正常(Normal):偏差率在 -30% ~ +50% 之間。代表該五行能量穩定,身體自我調節能力好
  2. 太過(Excess):偏差率 >+50%
    • 代表該五行能量過剩(實症)
    • 例如「木過旺」,網頁就會判斷膽和肝的能量超標,有易發生實症的風險,養生建議會自動啟動「洩法」,建議吃金(白/辛味)的食物來剋制、或是吃火的食物來消耗
  3. 不及(Deficient):偏差率 <-30%
    • 代表該五行能量過低(虛症)
    • 例如「土不及」,代表脾胃之氣嚴重不足,容易消化不良或思慮過度。養生建議就會啟動「補法」,建議多吃黃色、甘味的食物,並搭配「香草暖胃茶」來激活脾胃經之氣
    • 透過這套數學模型,網頁就能把抽象的古老命理,變成現代人一眼就看懂的身體能量健康報告了!

能量條的產生

// ── 五行能量條 ─────────────────────────────────────────
let elemHTML = '';
elemRatios.forEach((r, i) => {
const status = getElemStatus(r, ELEM_UPPER, ELEM_LOWER);
const pct = (r * 100).toFixed(1);
const barW = Math.min(100, Math.max(0, (r + 1) / 2 * 100));
const statusLabel = status === 'excess' ? '太過' : status === 'deficient' ? '不及' : '正常';
const statusClass = status === 'excess' ? 'status-excess' : status === 'deficient' ? 'status-deficient' : 'status-normal';
elemHTML += `<div class="elem-row">
<div class="elem-name c-${ELEM_KEYS[i]}">${ELEM_NAMES[i]}</div>
<div class="elem-bar-wrap"><div class="elem-bar ${ELEM_CSS[i]}" style="width:${barW}%"></div></div>
<div class="elem-pct">${r > 0 ? '+' : ''}${pct}%</div>
<div class="elem-status ${statusClass}">${statusLabel}</div></div>`;
});
document.getElementById('elements-display').innerHTML = elemHTML;