function reduceToDigit(n) { if (n === 11 || n === 22 || n === 33) return n while (n > 9) { let sum = 0 const str = String(n) for (let i = 0; i < str.length; i++) { sum += parseInt(str[i], 10) } if (sum === 11 || sum === 22 || sum === 33) return sum n = sum } return n } const ENERGY_MAP = { '1': '领导力、创造、独立', '2': '合作、平衡、感性', '3': '表达、社交、艺术', '4': '稳定、务实、规则', '5': '自由、变化、冒险', '6': '关爱、责任、家庭', '7': '智慧、分析、内省', '8': '财富、权力、成就', '9': '博爱、理想、智慧', '0': '潜能、灵性、无限' } const COMBINATION_MAP = { '12': '创新与合作', '13': '创意表达', '14': '务实创新', '15': '变革领导', '16': '关怀创造', '17': '智慧创新', '18': '财富创造', '19': '理想创造', '21': '合作创新', '23': '社交表达', '24': '稳定合作', '25': '自由协作', '26': '关爱合作', '27': '智慧合作', '28': '财富合作', '31': '表达创造', '32': '社交协作', '34': '务实表达', '35': '自由表达', '36': '关爱表达', '37': '智慧表达', '38': '财富表达', '39': '理想表达', '41': '务实创新', '42': '稳定合作', '43': '务实社交', '45': '稳定变化', '46': '务实关爱', '47': '务实智慧', '48': '财富稳定', '51': '变革领导', '52': '自由协作', '53': '自由表达', '54': '变化稳定', '56': '自由关爱', '57': '智慧变化', '58': '自由财富', '59': '自由理想', '61': '关爱领导', '62': '关爱协作', '63': '情感表达', '64': '稳定关爱', '65': '自由关怀', '67': '智慧关怀', '68': '财富关怀', '71': '智慧领导', '72': '智慧协作', '73': '智慧表达', '74': '务实智慧', '75': '智慧变化', '76': '智慧关怀', '77': '深度内省', '78': '智慧财富', '79': '智慧理想', '81': '财富领导', '82': '财富协作', '83': '财富表达', '84': '务实财富', '85': '自由财富', '86': '财富关怀', '87': '智慧财富', '89': '财富理想', '91': '理想领导', '92': '理想协作', '93': '理想表达', '94': '务实理想', '95': '自由理想', '96': '关爱理想', '97': '智慧理想', '98': '财富理想' } export function getEnergy(num) { return ENERGY_MAP[String(num)] || '未知能量' } export function getCombination(a, b) { return COMBINATION_MAP[`${a}${b}`] || `${getEnergy(a)} → ${getEnergy(b)}` } /** * 数字能量三角图计算 - 完整30位置系统(I-X) * 外部位置(A-H)直接来自生日: * A = year[0], B = year[1], C = year[2], D = year[3] * E = month[0], F = month[1], G = day[0], H = day[1] * 内部位置(I-O): * I = reduceToDigit(E + F) // 月能量 * J = reduceToDigit(G + H) // 日能量 * K = reduceToDigit(A + B) // 年前半 * L = reduceToDigit(C + D) // 年后半 * M = reduceToDigit(I + J) // 青年综合数 * N = reduceToDigit(K + L) // 晚年综合数 * O = reduceToDigit(M + N) // 主性格 * 外部位置(P-X)— 独立计算: * P = reduceToDigit(I + M) * Q = reduceToDigit(J + M) * R = reduceToDigit(P + Q) * S = reduceToDigit(K + N) * T = reduceToDigit(L + N) * U = reduceToDigit(S + T) * V = reduceToDigit(M + O) * W = reduceToDigit(N + O) * X = reduceToDigit(V + W) */ export function calculateTriangle(birthYear, birthMonth, birthDay) { const y = String(birthYear).padStart(4, '0') const m = String(birthMonth).padStart(2, '0') const d = String(birthDay).padStart(2, '0') // 外部位置(A-H)- 原始数字提取 const A = parseInt(y[0], 10) const B = parseInt(y[1], 10) const C = parseInt(y[2], 10) const D = parseInt(y[3], 10) const E = parseInt(m[0], 10) const F = parseInt(m[1], 10) const G = parseInt(d[0], 10) const H = parseInt(d[1], 10) // 内部位置(I-O) const I = reduceToDigit(E + F) // 月能量 const J = reduceToDigit(G + H) // 日能量 const K = reduceToDigit(A + B) // 年前半 const L = reduceToDigit(C + D) // 年后半 const M = reduceToDigit(I + J) // 青年综合数 const N = reduceToDigit(K + L) // 晚年综合数 const O = reduceToDigit(M + N) // 主性格 // 外部位置(P-X)- 独立计算 const P = reduceToDigit(I + M) const Q = reduceToDigit(J + M) const R = reduceToDigit(P + Q) const S = reduceToDigit(K + N) const T = reduceToDigit(L + N) const U = reduceToDigit(S + T) const V = reduceToDigit(M + O) const W = reduceToDigit(N + O) const X = reduceToDigit(V + W) return { I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X } } export function analyzeTriangle(chart) { const positionLabels = { I: '月能量', J: '日能量', K: '年前位', L: '年后位', M: '青年综合数', N: '晚年综合数', O: '主性格', P: '左侧左子', Q: '左侧右子', R: '左侧主数', S: '右侧左子', T: '右侧右子', U: '右侧主数', V: '顶部左子', W: '顶部右子', X: '顶部主数' } const zones = [ { name: '主性格区', positions: ['O'] }, { name: '左区(月日能量)', positions: ['I', 'J', 'M'] }, { name: '右区(年份能量)', positions: ['K', 'L', 'N'] }, { name: '父源区', positions: ['I', 'M'] }, { name: '母源区', positions: ['L', 'N'] }, { name: '全三角', positions: ['I', 'J', 'K', 'L', 'M', 'N', 'O'] }, { name: '左侧外部组', positions: ['P', 'Q', 'R'] }, { name: '右侧外部组', positions: ['S', 'T', 'U'] }, { name: '顶部外部组', positions: ['V', 'W', 'X'] } ] const zoneAnalyses = zones.map(zone => ({ zoneName: zone.name, numbers: zone.positions.map(pos => ({ position: pos, number: chart[pos] || 0, label: positionLabels[pos] || pos })) })) const allPositions = ['I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X'] const primary = allPositions.map(pos => ({ position: pos, number: chart[pos] || 0, energy: getEnergy(chart[pos] || 0), label: positionLabels[pos] || '' })) const comboPairs = [ ['I', 'J'], ['K', 'L'], ['M', 'N'], ['I', 'K'], ['J', 'L'], ['I', 'M'], ['K', 'N'], ['M', 'O'], ['N', 'O'], ['P', 'Q'], ['S', 'T'], ['V', 'W'], ['P', 'R'], ['Q', 'R'], ['S', 'U'], ['T', 'U'], ['V', 'X'], ['W', 'X'] ] const combinations = comboPairs.map(([p1, p2]) => ({ pair: `${p1}${p2}`, meaning: getCombination(chart[p1] || 0, chart[p2] || 0) })) return { primary, combinations, zoneAnalyses } }