calculator.js 6.5 KB

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