mingpan 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/README.en.md +64 -0
  2. package/README.ja.md +64 -0
  3. package/README.md +80 -11
  4. package/dist/core/bazi/BaziCore.d.ts +7 -1
  5. package/dist/core/bazi/BaziCore.d.ts.map +1 -1
  6. package/dist/core/bazi/BaziCore.js +41 -15
  7. package/dist/core/bazi/BaziCore.js.map +1 -1
  8. package/dist/core/bazi/TrueSolarTime.js +8 -8
  9. package/dist/core/bazi/TrueSolarTime.js.map +1 -1
  10. package/dist/core/bazi/types.d.ts +4 -0
  11. package/dist/core/bazi/types.d.ts.map +1 -1
  12. package/dist/core/calendar/SolarTermsCalculator.js +2 -2
  13. package/dist/core/calendar/SolarTermsCalculator.js.map +1 -1
  14. package/dist/core/calendar/astronomicalCalendar.d.ts +0 -13
  15. package/dist/core/calendar/astronomicalCalendar.d.ts.map +1 -1
  16. package/dist/core/calendar/astronomicalCalendar.js +0 -56
  17. package/dist/core/calendar/astronomicalCalendar.js.map +1 -1
  18. package/dist/core/calendar/calendar.d.ts.map +1 -1
  19. package/dist/core/calendar/calendar.js +11 -11
  20. package/dist/core/calendar/calendar.js.map +1 -1
  21. package/dist/core/calendar/lunarCalendar.js +1 -1
  22. package/dist/core/calendar/lunarCalendar.js.map +1 -1
  23. package/dist/core/calendar/solarTerms.js +10 -10
  24. package/dist/core/calendar/solarTerms.js.map +1 -1
  25. package/dist/core/ziwei/IztroAdapter.d.ts.map +1 -1
  26. package/dist/core/ziwei/IztroAdapter.js +11 -4
  27. package/dist/core/ziwei/IztroAdapter.js.map +1 -1
  28. package/dist/index.d.ts +10 -5
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +13 -1582
  31. package/dist/index.js.map +1 -1
  32. package/dist/output/fortuneTextRenderer.d.ts +8 -7
  33. package/dist/output/fortuneTextRenderer.d.ts.map +1 -1
  34. package/dist/output/fortuneTextRenderer.js +89 -25
  35. package/dist/output/fortuneTextRenderer.js.map +1 -1
  36. package/dist/output/listTextRenderer.js +7 -7
  37. package/dist/output/listTextRenderer.js.map +1 -1
  38. package/dist/output/qimenTextRenderer.d.ts +2 -6
  39. package/dist/output/qimenTextRenderer.d.ts.map +1 -1
  40. package/dist/output/qimenTextRenderer.js +12 -145
  41. package/dist/output/qimenTextRenderer.js.map +1 -1
  42. package/dist/server.d.ts +11 -0
  43. package/dist/server.d.ts.map +1 -0
  44. package/dist/server.js +35 -0
  45. package/dist/server.js.map +1 -0
  46. package/dist/services/bazi/BaziService.d.ts +1 -17
  47. package/dist/services/bazi/BaziService.d.ts.map +1 -1
  48. package/dist/services/bazi/BaziService.js +11 -195
  49. package/dist/services/bazi/BaziService.js.map +1 -1
  50. package/dist/services/bazi/analyzers/StrengthAnalyzer.js +1 -1
  51. package/dist/services/bazi/analyzers/StrengthAnalyzer.js.map +1 -1
  52. package/dist/services/bazi/analyzers/TenGodsAnalyzer.js +12 -12
  53. package/dist/services/bazi/analyzers/TenGodsAnalyzer.js.map +1 -1
  54. package/dist/services/bazi/calculators/DaYunCalculator.js +1 -1
  55. package/dist/services/bazi/calculators/DaYunCalculator.js.map +1 -1
  56. package/dist/services/bazi/calculators/LiuRiCalculator.js +2 -2
  57. package/dist/services/bazi/calculators/LiuRiCalculator.js.map +1 -1
  58. package/dist/services/bazi/calculators/LiuYueCalculator.js +2 -2
  59. package/dist/services/bazi/calculators/LiuYueCalculator.js.map +1 -1
  60. package/dist/services/bazi/calculators/LuckCycleCalculator.d.ts.map +1 -1
  61. package/dist/services/bazi/calculators/LuckCycleCalculator.js +55 -43
  62. package/dist/services/bazi/calculators/LuckCycleCalculator.js.map +1 -1
  63. package/dist/services/bazi/index.d.ts +0 -2
  64. package/dist/services/bazi/index.d.ts.map +1 -1
  65. package/dist/services/bazi/index.js +1 -5
  66. package/dist/services/bazi/index.js.map +1 -1
  67. package/dist/services/bazi/types.d.ts +4 -112
  68. package/dist/services/bazi/types.d.ts.map +1 -1
  69. package/dist/services/bazi/types.js +3 -102
  70. package/dist/services/bazi/types.js.map +1 -1
  71. package/dist/services/daliuren/DaliurenService.d.ts +11 -1
  72. package/dist/services/daliuren/DaliurenService.d.ts.map +1 -1
  73. package/dist/services/daliuren/DaliurenService.js +30 -0
  74. package/dist/services/daliuren/DaliurenService.js.map +1 -1
  75. package/dist/services/daliuren/calculators/TianDiPanCalculator.d.ts.map +1 -1
  76. package/dist/services/daliuren/calculators/TianDiPanCalculator.js +3 -4
  77. package/dist/services/daliuren/calculators/TianDiPanCalculator.js.map +1 -1
  78. package/dist/services/daliuren/data/constants.d.ts +7 -0
  79. package/dist/services/daliuren/data/constants.d.ts.map +1 -1
  80. package/dist/services/daliuren/data/constants.js +17 -1
  81. package/dist/services/daliuren/data/constants.js.map +1 -1
  82. package/dist/services/daliuren/types.d.ts +11 -2
  83. package/dist/services/daliuren/types.d.ts.map +1 -1
  84. package/dist/services/liuyao/LiuyaoService.d.ts.map +1 -1
  85. package/dist/services/liuyao/LiuyaoService.js +1 -0
  86. package/dist/services/liuyao/LiuyaoService.js.map +1 -1
  87. package/dist/services/meihua/MeihuaService.d.ts.map +1 -1
  88. package/dist/services/meihua/MeihuaService.js +4 -3
  89. package/dist/services/meihua/MeihuaService.js.map +1 -1
  90. package/dist/services/meihua/calculators/TiyongCalculator.d.ts.map +1 -1
  91. package/dist/services/meihua/calculators/TiyongCalculator.js +6 -5
  92. package/dist/services/meihua/calculators/TiyongCalculator.js.map +1 -1
  93. package/dist/services/qimen/QimenService.d.ts +1 -18
  94. package/dist/services/qimen/QimenService.d.ts.map +1 -1
  95. package/dist/services/qimen/QimenService.js +13 -45
  96. package/dist/services/qimen/QimenService.js.map +1 -1
  97. package/dist/services/qimen/calculators/BaMenCalculator.d.ts +14 -22
  98. package/dist/services/qimen/calculators/BaMenCalculator.d.ts.map +1 -1
  99. package/dist/services/qimen/calculators/BaMenCalculator.js +41 -59
  100. package/dist/services/qimen/calculators/BaMenCalculator.js.map +1 -1
  101. package/dist/services/qimen/calculators/JiuGongCalculator.d.ts +6 -13
  102. package/dist/services/qimen/calculators/JiuGongCalculator.d.ts.map +1 -1
  103. package/dist/services/qimen/calculators/JiuGongCalculator.js +11 -41
  104. package/dist/services/qimen/calculators/JiuGongCalculator.js.map +1 -1
  105. package/dist/services/qimen/calculators/JiuXingCalculator.d.ts +13 -23
  106. package/dist/services/qimen/calculators/JiuXingCalculator.d.ts.map +1 -1
  107. package/dist/services/qimen/calculators/JiuXingCalculator.js +23 -68
  108. package/dist/services/qimen/calculators/JiuXingCalculator.js.map +1 -1
  109. package/dist/services/qimen/calculators/JuShuCalculator.d.ts +8 -5
  110. package/dist/services/qimen/calculators/JuShuCalculator.d.ts.map +1 -1
  111. package/dist/services/qimen/calculators/JuShuCalculator.js +16 -21
  112. package/dist/services/qimen/calculators/JuShuCalculator.js.map +1 -1
  113. package/dist/services/qimen/calculators/PanTypeCalculator.d.ts +19 -14
  114. package/dist/services/qimen/calculators/PanTypeCalculator.d.ts.map +1 -1
  115. package/dist/services/qimen/calculators/PanTypeCalculator.js +34 -36
  116. package/dist/services/qimen/calculators/PanTypeCalculator.js.map +1 -1
  117. package/dist/services/qimen/calculators/SanQiLiuYiCalculator.d.ts +11 -20
  118. package/dist/services/qimen/calculators/SanQiLiuYiCalculator.d.ts.map +1 -1
  119. package/dist/services/qimen/calculators/SanQiLiuYiCalculator.js +29 -42
  120. package/dist/services/qimen/calculators/SanQiLiuYiCalculator.js.map +1 -1
  121. package/dist/services/qimen/calculators/ZhuanPanCalculator.d.ts +34 -41
  122. package/dist/services/qimen/calculators/ZhuanPanCalculator.d.ts.map +1 -1
  123. package/dist/services/qimen/calculators/ZhuanPanCalculator.js +102 -130
  124. package/dist/services/qimen/calculators/ZhuanPanCalculator.js.map +1 -1
  125. package/dist/services/qimen/types.d.ts +3 -77
  126. package/dist/services/qimen/types.d.ts.map +1 -1
  127. package/dist/services/qimen/types.js +3 -2
  128. package/dist/services/qimen/types.js.map +1 -1
  129. package/dist/services/ziwei/ZiweiService.d.ts.map +1 -1
  130. package/dist/services/ziwei/ZiweiService.js +4 -3
  131. package/dist/services/ziwei/ZiweiService.js.map +1 -1
  132. package/dist/services/ziwei/calculators/DecadeCalculator.d.ts.map +1 -1
  133. package/dist/services/ziwei/calculators/DecadeCalculator.js +2 -1
  134. package/dist/services/ziwei/calculators/DecadeCalculator.js.map +1 -1
  135. package/dist/shared/logger.d.ts +5 -0
  136. package/dist/shared/logger.d.ts.map +1 -1
  137. package/dist/shared/logger.js +16 -4
  138. package/dist/shared/logger.js.map +1 -1
  139. package/dist/tools/baziTools.d.ts +13 -0
  140. package/dist/tools/baziTools.d.ts.map +1 -0
  141. package/dist/tools/baziTools.js +331 -0
  142. package/dist/tools/baziTools.js.map +1 -0
  143. package/dist/tools/calendarTools.d.ts +12 -0
  144. package/dist/tools/calendarTools.d.ts.map +1 -0
  145. package/dist/tools/calendarTools.js +121 -0
  146. package/dist/tools/calendarTools.js.map +1 -0
  147. package/dist/tools/divinationTools.d.ts +9 -0
  148. package/dist/tools/divinationTools.d.ts.map +1 -0
  149. package/dist/tools/divinationTools.js +205 -0
  150. package/dist/tools/divinationTools.js.map +1 -0
  151. package/dist/tools/qimenTools.d.ts +10 -0
  152. package/dist/tools/qimenTools.d.ts.map +1 -0
  153. package/dist/tools/qimenTools.js +132 -0
  154. package/dist/tools/qimenTools.js.map +1 -0
  155. package/dist/tools/schemas.d.ts +99 -0
  156. package/dist/tools/schemas.d.ts.map +1 -0
  157. package/dist/tools/schemas.js +163 -0
  158. package/dist/tools/schemas.js.map +1 -0
  159. package/dist/tools/ziweiTools.d.ts +14 -0
  160. package/dist/tools/ziweiTools.d.ts.map +1 -0
  161. package/dist/tools/ziweiTools.js +484 -0
  162. package/dist/tools/ziweiTools.js.map +1 -0
  163. package/dist/utils/ageCalculator.d.ts +1 -1
  164. package/dist/utils/ageCalculator.d.ts.map +1 -1
  165. package/dist/utils/ageCalculator.js +10 -6
  166. package/dist/utils/ageCalculator.js.map +1 -1
  167. package/dist/utils/timeNormalization.d.ts +42 -17
  168. package/dist/utils/timeNormalization.d.ts.map +1 -1
  169. package/dist/utils/timeNormalization.js +99 -41
  170. package/dist/utils/timeNormalization.js.map +1 -1
  171. package/dist/utils/wallTime.d.ts +25 -0
  172. package/dist/utils/wallTime.d.ts.map +1 -0
  173. package/dist/utils/wallTime.js +33 -0
  174. package/dist/utils/wallTime.js.map +1 -0
  175. package/dist/worker.d.ts +23 -0
  176. package/dist/worker.d.ts.map +1 -0
  177. package/dist/worker.js +47 -0
  178. package/dist/worker.js.map +1 -0
  179. package/package.json +21 -11
  180. package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.d.ts +0 -16
  181. package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.d.ts.map +0 -1
  182. package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.js +0 -60
  183. package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.js.map +0 -1
  184. package/dist/services/bazi/analyzers/NaYinAnalyzer.d.ts +0 -33
  185. package/dist/services/bazi/analyzers/NaYinAnalyzer.d.ts.map +0 -1
  186. package/dist/services/bazi/analyzers/NaYinAnalyzer.js +0 -209
  187. package/dist/services/bazi/analyzers/NaYinAnalyzer.js.map +0 -1
  188. package/dist/services/bazi/analyzers/ShenShaAnalyzer.d.ts +0 -236
  189. package/dist/services/bazi/analyzers/ShenShaAnalyzer.d.ts.map +0 -1
  190. package/dist/services/bazi/analyzers/ShenShaAnalyzer.js +0 -2079
  191. package/dist/services/bazi/analyzers/ShenShaAnalyzer.js.map +0 -1
  192. package/dist/services/bazi/analyzers/TraditionalAnalyzer.d.ts +0 -46
  193. package/dist/services/bazi/analyzers/TraditionalAnalyzer.d.ts.map +0 -1
  194. package/dist/services/bazi/analyzers/TraditionalAnalyzer.js +0 -260
  195. package/dist/services/bazi/analyzers/TraditionalAnalyzer.js.map +0 -1
  196. package/dist/services/qimen/calculators/ZeRiCalculator.d.ts +0 -78
  197. package/dist/services/qimen/calculators/ZeRiCalculator.d.ts.map +0 -1
  198. package/dist/services/qimen/calculators/ZeRiCalculator.js +0 -431
  199. package/dist/services/qimen/calculators/ZeRiCalculator.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * 三奇六仪计算器
3
- * 计算天盘布局(时干/日干带动的天盘飞布)
3
+ * 计算飞盘式天盘布局
4
4
  */
5
5
  import type { GongWei, TianGan, YinYangDun } from '../types';
6
6
  export interface TianPanResult {
@@ -11,37 +11,28 @@ export interface TianPanResult {
11
11
  }
12
12
  /**
13
13
  * 三奇六仪计算器
14
- * 负责计算天盘布局
14
+ * 负责计算飞盘式天盘布局
15
15
  */
16
16
  export declare class SanQiLiuYiCalculator {
17
17
  /**
18
- * 计算天盘布局
18
+ * 计算飞盘式天盘布局
19
19
  * @param diPanGanGong 地盘干->宫位映射
20
- * @param hourGanZhi 时干支(时盘)或日干支(日盘)
20
+ * @param refGanZhi 参考干支(时盘为时干支,余类推)
21
21
  * @param yinYangDun 阴阳遁
22
22
  * @returns 天盘各宫的干
23
23
  *
24
- * 原理:
25
- * 1. 找到时干(或日干)在地盘的落宫
26
- * 2. 以该宫为起点,将三奇六仪按洛书顺序飞布
27
- * 3. 阳遁顺飞,阴遁逆飞
28
- *
29
- * 例如:
30
- * - 阳遁一局,时干为庚
31
- * - 庚在地盘震三宫
32
- * - 则天盘从震三宫开始顺布:戊-震3, 己-巽4, 庚-离9...
24
+ * 原理(飞盘式):
25
+ * 1. 值符随时干:旬首六仪飞到参考干(甲用旬首仪)所在的地盘宫
26
+ * 2. 其余八干按 戊己庚辛壬癸丁丙乙 的循环顺序(自旬首仪起),
27
+ * 按宫位数字顺序(1→2→…→9→1)飞布,阳遁顺飞、阴遁逆飞
28
+ * 3. 落入中五宫之干寄坤二宫(查询时换算,显示时仍在中宫)
33
29
  */
34
- static calculate(diPanGanGong: Record<TianGan, GongWei>, hourGanZhi: string, yinYangDun: YinYangDun): TianPanResult;
30
+ static calculate(diPanGanGong: Record<TianGan, GongWei>, refGanZhi: string, yinYangDun: YinYangDun): TianPanResult;
35
31
  /**
36
32
  * 获取遁甲干
37
- * 甲遁于六仪之下,需要根据时干支确定
33
+ * 甲遁于六仪之下,需要根据干支确定
38
34
  */
39
35
  private static getDunGan;
40
- /**
41
- * 根据起始宫位和步数计算目标宫位(9宫飞布)
42
- * 洛书9宫顺序:1(坎) -> 8(艮) -> 3(震) -> 4(巽) -> 5(中) -> 9(离) -> 2(坤) -> 7(兑) -> 6(乾)
43
- */
44
- private static getGongByStep;
45
36
  /**
46
37
  * 根据天干找天盘落宫
47
38
  */
@@ -1 +1 @@
1
- {"version":3,"file":"SanQiLiuYiCalculator.d.ts","sourceRoot":"","sources":["../../../../src/services/qimen/calculators/SanQiLiuYiCalculator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAU7D,MAAM,WAAW,aAAa;IAC5B,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClC,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,SAAS,CACd,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EACtC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,UAAU,GACrB,aAAa;IA4BhB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IAWxB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAU5B;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO;CAI/E"}
1
+ {"version":3,"file":"SanQiLiuYiCalculator.d.ts","sourceRoot":"","sources":["../../../../src/services/qimen/calculators/SanQiLiuYiCalculator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAQ7D,MAAM,WAAW,aAAa;IAC5B,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClC,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,SAAS,CACd,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EACtC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,UAAU,GACrB,aAAa;IAiChB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IASxB;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO;CAI/E"}
@@ -1,50 +1,50 @@
1
1
  "use strict";
2
2
  /**
3
3
  * 三奇六仪计算器
4
- * 计算天盘布局(时干/日干带动的天盘飞布)
4
+ * 计算飞盘式天盘布局
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.SanQiLiuYiCalculator = void 0;
8
8
  const constants_1 = require("../data/constants");
9
9
  /**
10
10
  * 三奇六仪计算器
11
- * 负责计算天盘布局
11
+ * 负责计算飞盘式天盘布局
12
12
  */
13
13
  class SanQiLiuYiCalculator {
14
14
  /**
15
- * 计算天盘布局
15
+ * 计算飞盘式天盘布局
16
16
  * @param diPanGanGong 地盘干->宫位映射
17
- * @param hourGanZhi 时干支(时盘)或日干支(日盘)
17
+ * @param refGanZhi 参考干支(时盘为时干支,余类推)
18
18
  * @param yinYangDun 阴阳遁
19
19
  * @returns 天盘各宫的干
20
20
  *
21
- * 原理:
22
- * 1. 找到时干(或日干)在地盘的落宫
23
- * 2. 以该宫为起点,将三奇六仪按洛书顺序飞布
24
- * 3. 阳遁顺飞,阴遁逆飞
25
- *
26
- * 例如:
27
- * - 阳遁一局,时干为庚
28
- * - 庚在地盘震三宫
29
- * - 则天盘从震三宫开始顺布:戊-震3, 己-巽4, 庚-离9...
21
+ * 原理(飞盘式):
22
+ * 1. 值符随时干:旬首六仪飞到参考干(甲用旬首仪)所在的地盘宫
23
+ * 2. 其余八干按 戊己庚辛壬癸丁丙乙 的循环顺序(自旬首仪起),
24
+ * 按宫位数字顺序(1→2→…→9→1)飞布,阳遁顺飞、阴遁逆飞
25
+ * 3. 落入中五宫之干寄坤二宫(查询时换算,显示时仍在中宫)
30
26
  */
31
- static calculate(diPanGanGong, hourGanZhi, yinYangDun) {
27
+ static calculate(diPanGanGong, refGanZhi, yinYangDun) {
32
28
  const isYang = yinYangDun === '阳遁';
33
- const hourGan = hourGanZhi.charAt(0);
34
- // 时干对应的遁甲干
35
- // 如果时干是甲,需要找到该甲的旬首,然后找到对应的六仪
36
- const dunGan = this.getDunGan(hourGan, hourGanZhi);
37
- // 找到遁甲干在地盘的落宫
38
- let startGong = diPanGanGong[dunGan];
29
+ const refGan = refGanZhi.charAt(0);
30
+ // 参考干对应的遁甲干(甲遁于旬首六仪之下)
31
+ const refDunGan = this.getDunGan(refGan, refGanZhi);
32
+ // 起点宫 = 参考干(遁干)在地盘的落宫(中五寄坤二)
33
+ let startGong = diPanGanGong[refDunGan];
39
34
  if (startGong === 5) {
40
- startGong = constants_1.ZHONG_GONG_JI; // 中宫寄坤二
35
+ startGong = constants_1.ZHONG_GONG_JI;
41
36
  }
37
+ // 飞布序列:自旬首仪起,按戊己庚辛壬癸丁丙乙循环
38
+ const xunShou = (0, constants_1.getXunShou)(refGanZhi);
39
+ const fuGan = (0, constants_1.getLiuYiGan)(xunShou);
40
+ const fuIdx = constants_1.SAN_QI_LIU_YI.indexOf(fuGan);
41
+ const flyOrder = constants_1.SAN_QI_LIU_YI.slice(fuIdx).concat(constants_1.SAN_QI_LIU_YI.slice(0, fuIdx));
42
42
  const gongGan = {};
43
43
  const ganGong = {};
44
- // 从起始宫开始,依次布入三奇六仪(9干飞布9宫)
45
44
  for (let i = 0; i < 9; i++) {
46
- const gan = constants_1.SAN_QI_LIU_YI[i];
47
- const gong = this.getGongByStep(startGong, i, isYang);
45
+ const gan = flyOrder[i];
46
+ const offset = isYang ? i : -i;
47
+ const gong = (((startGong - 1 + offset) % 9) + 9) % 9 + 1;
48
48
  gongGan[gong] = gan;
49
49
  ganGong[gan] = gong;
50
50
  }
@@ -52,28 +52,15 @@ class SanQiLiuYiCalculator {
52
52
  }
53
53
  /**
54
54
  * 获取遁甲干
55
- * 甲遁于六仪之下,需要根据时干支确定
55
+ * 甲遁于六仪之下,需要根据干支确定
56
56
  */
57
- static getDunGan(hourGan, hourGanZhi) {
58
- if (hourGan !== '甲') {
59
- // 非甲时,直接返回时干
60
- return hourGan;
57
+ static getDunGan(refGan, refGanZhi) {
58
+ if (refGan !== '甲') {
59
+ return refGan;
61
60
  }
62
- // 甲时,需要找到旬首对应的六仪
63
- const xunShou = (0, constants_1.getXunShou)(hourGanZhi);
61
+ const xunShou = (0, constants_1.getXunShou)(refGanZhi);
64
62
  return (0, constants_1.getLiuYiGan)(xunShou);
65
63
  }
66
- /**
67
- * 根据起始宫位和步数计算目标宫位(9宫飞布)
68
- * 洛书9宫顺序:1(坎) -> 8(艮) -> 3(震) -> 4(巽) -> 5(中) -> 9(离) -> 2(坤) -> 7(兑) -> 6(乾)
69
- */
70
- static getGongByStep(startGong, steps, isYang) {
71
- const startIdx = (0, constants_1.getLuoShuIndex9)(startGong);
72
- const targetIdx = isYang
73
- ? (startIdx + steps) % 9
74
- : ((startIdx - steps) % 9 + 9) % 9;
75
- return (0, constants_1.getLuoShuGong9)(targetIdx);
76
- }
77
64
  /**
78
65
  * 根据天干找天盘落宫
79
66
  */
@@ -1 +1 @@
1
- {"version":3,"file":"SanQiLiuYiCalculator.js","sourceRoot":"","sources":["../../../../src/services/qimen/calculators/SanQiLiuYiCalculator.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,iDAO2B;AAS3B;;;GAGG;AACH,MAAa,oBAAoB;IAC/B;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,SAAS,CACd,YAAsC,EACtC,UAAkB,EAClB,UAAsB;QAEtB,MAAM,MAAM,GAAG,UAAU,KAAK,IAAI,CAAC;QACnC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAY,CAAC;QAEhD,WAAW;QACX,6BAA6B;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEnD,cAAc;QACd,IAAI,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpB,SAAS,GAAG,yBAAa,CAAC,CAAC,QAAQ;QACrC,CAAC;QAED,MAAM,OAAO,GAA6B,EAA8B,CAAC;QACzE,MAAM,OAAO,GAA6B,EAA8B,CAAC;QAEzE,0BAA0B;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,yBAAa,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACtB,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACK,MAAM,CAAC,SAAS,CAAC,OAAgB,EAAE,UAAkB;QAC3D,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YACpB,aAAa;YACb,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,iBAAiB;QACjB,MAAM,OAAO,GAAG,IAAA,sBAAU,EAAC,UAAU,CAAC,CAAC;QACvC,OAAO,IAAA,uBAAW,EAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACK,MAAM,CAAC,aAAa,CAAC,SAAkB,EAAE,KAAa,EAAE,MAAe;QAC7E,MAAM,QAAQ,GAAG,IAAA,2BAAe,EAAC,SAAS,CAAC,CAAC;QAE5C,MAAM,SAAS,GAAG,MAAM;YACtB,CAAC,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC;YACxB,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAErC,OAAO,IAAA,0BAAc,EAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAiC,EAAE,GAAY;QAClE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,yBAAa,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3C,CAAC;CACF;AAtFD,oDAsFC"}
1
+ {"version":3,"file":"SanQiLiuYiCalculator.js","sourceRoot":"","sources":["../../../../src/services/qimen/calculators/SanQiLiuYiCalculator.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,iDAK2B;AAS3B;;;GAGG;AACH,MAAa,oBAAoB;IAC/B;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,SAAS,CACd,YAAsC,EACtC,SAAiB,EACjB,UAAsB;QAEtB,MAAM,MAAM,GAAG,UAAU,KAAK,IAAI,CAAC;QACnC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAY,CAAC;QAE9C,uBAAuB;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEpD,6BAA6B;QAC7B,IAAI,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpB,SAAS,GAAG,yBAAa,CAAC;QAC5B,CAAC;QAED,0BAA0B;QAC1B,MAAM,OAAO,GAAG,IAAA,sBAAU,EAAC,SAAS,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,IAAA,uBAAW,EAAC,OAAO,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,yBAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,yBAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,yBAAa,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAElF,MAAM,OAAO,GAA6B,EAA8B,CAAC;QACzE,MAAM,OAAO,GAA6B,EAA8B,CAAC;QAEzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1D,OAAO,CAAC,IAAe,CAAC,GAAG,GAAG,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,IAAe,CAAC;QACjC,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACK,MAAM,CAAC,SAAS,CAAC,MAAe,EAAE,SAAiB;QACzD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,OAAO,GAAG,IAAA,sBAAU,EAAC,SAAS,CAAC,CAAC;QACtC,OAAO,IAAA,uBAAW,EAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAiC,EAAE,GAAY;QAClE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,yBAAa,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3C,CAAC;CACF;AAvED,oDAuEC"}
@@ -3,14 +3,18 @@
3
3
  * Rotating style Qimen calculator (following《神奇之门》)
4
4
  *
5
5
  * 转盘式核心规则:
6
- * 1. 三奇六仪按物理方向旋转(非洛书飞布)
7
- * 2. 阳遁顺转(物理顺时针):1→8→3→4→9→2→7→6
8
- * 3. 阴遁逆转(物理逆时针):1→6→7→2→9→4→3→8
9
- * 4. 八门、九星同样按物理方向转动
10
- * 5. 中宫寄坤二
11
- * 6. 天禽星随天芮星(寄坤二宫)
6
+ * 1. 天盘、九星、八门是三个「物理转盘」,盘内元素相对顺序恒定不变
7
+ * 2. 转盘环序(物理顺时针,从坎一宫起):坎→艮→震→巽→离→坤→兑→乾
8
+ * - 九星环序:蓬任冲辅英芮柱心(禽寄芮,随坤二宫)
9
+ * - 八门环序:休生伤杜景死惊开
10
+ * 3. 天盘干与九星同转:值符星携旬首六仪转到时干(遁干)所在的地盘宫
11
+ * 4. 值使门随时辰飞宫:从值符原始宫起,按旬内时辰序数,
12
+ * 阳遁顺数宫位数字(1→2→…→9→1)、阴遁逆数
13
+ * 5. 中五宫寄坤二宫;天禽随天芮
14
+ *
15
+ * 参照:《神奇之门》(张志春)、kentang2017/kinqimen pan_sky/pan_star/pan_door(MIT)
12
16
  */
13
- import type { GongWei, TianGan, DiZhi, BaMen, JiuXing, YinYangDun } from '../types';
17
+ import type { GongWei, TianGan, BaMen, JiuXing, YinYangDun } from '../types';
14
18
  export interface ZhuanPanTianPanResult {
15
19
  gongGan: Record<GongWei, TianGan>;
16
20
  ganGong: Record<TianGan, GongWei>;
@@ -32,6 +36,11 @@ export interface ZhuanPanJiuXingResult {
32
36
  * 实现《神奇之门》中的转盘式排盘法
33
37
  */
34
38
  export declare class ZhuanPanCalculator {
39
+ /**
40
+ * 获取参考干(时干/日干/月干/年干)遁干后的地盘落宫
41
+ * 甲遁于旬首六仪之下;落中五宫者寄坤二
42
+ */
43
+ static getShiGanLuoGong(diPanGanGong: Record<TianGan, GongWei>, ganZhi: string): GongWei;
35
44
  /**
36
45
  * 计算转盘式天盘布局
37
46
  * @param diPanGanGong 地盘干->宫位映射
@@ -39,51 +48,45 @@ export declare class ZhuanPanCalculator {
39
48
  * @param yinYangDun 阴阳遁
40
49
  * @returns 天盘各宫的干
41
50
  *
42
- * 原理(转盘式):
43
- * 1. 找到时干(或日干/月干/年干)在地盘的落宫
44
- * 2. 计算该宫到值符星原始宫的旋转步数
45
- * 3. 将整个地盘旋转相应步数
46
- * 4. 阳遁顺时针旋转,阴遁逆时针旋转
51
+ * 原理(转盘式刚体旋转):
52
+ * 1. 旬首六仪(值符所携之干)在地盘的原始宫
53
+ * 2. 参考干(时干等,甲用旬首仪)在地盘的落宫
54
+ * 3. 将整个地盘沿转盘环旋转,使旬首仪从原始宫转到参考干落宫
55
+ * 4. 中五宫之干寄坤二宫随盘转动;天盘中宫显示坤二宫之干
47
56
  */
48
57
  static calculateTianPan(diPanGanGong: Record<TianGan, GongWei>, ganZhi: string, yinYangDun: YinYangDun): ZhuanPanTianPanResult;
49
58
  /**
50
59
  * 计算转盘式八门布局
51
- * @param zhiFuGong 值符星落宫(旬首遁干在地盘的宫位)
52
- * @param hourZhi 时支
60
+ * @param zhiFuGong 值符星原始宫位(旬首遁干在地盘的宫位,值使门原始宫与其相同)
61
+ * @param refGanZhi 参考干支(时盘为时干支,余类推)
53
62
  * @param yinYangDun 阴阳遁
54
63
  * @returns 八门布局
55
64
  *
56
65
  * 原理(转盘式):
57
- * 1. 确定值使门(值符星原始宫位对应的门)
58
- * 2. 值使门从值符星落宫起,按时辰数旋转
59
- * 3. 阳遁顺时针,阴遁逆时针
60
- * 4. 其他七门依次排列(按物理方向旋转)
66
+ * 1. 值使门 = 值符星原始宫位对应的门(中五宫寄坤二取死门)
67
+ * 2. 值使门落宫:从值符原始宫起,按参考干支的旬内序数(甲为0),
68
+ * 阳遁顺数宫位数字、阴遁逆数;落中五宫寄坤二
69
+ * 3. 其余七门按八门环序(休生伤杜景死惊开)随盘刚体旋转
61
70
  */
62
- static calculateBaMen(zhiFuGong: GongWei, hourZhi: DiZhi, yinYangDun: YinYangDun): ZhuanPanBaMenResult;
71
+ static calculateBaMen(zhiFuGong: GongWei, refGanZhi: string, yinYangDun: YinYangDun): ZhuanPanBaMenResult;
63
72
  /**
64
73
  * 计算转盘式九星布局
65
- * @param xunShouGong 旬首遁干在地盘的宫位
66
- * @param hourZhi 时支
74
+ * @param xunShouGong 旬首遁干在地盘的宫位(值符星原始宫)
75
+ * @param shiGanLuoGong 参考干(时干等,甲用旬首仪)的地盘落宫
67
76
  * @param yinYangDun 阴阳遁
68
77
  * @returns 九星布局
69
78
  *
70
79
  * 原理(转盘式):
71
- * 1. 确定值符星(旬首落宫对应的星)
72
- * 2. 值符星从地盘旬首落宫起,按时辰数旋转
73
- * 3. 阳遁顺时针,阴遁逆时针
74
- * 4. 天禽星(中五宫)随天芮星,或寄坤二
80
+ * 1. 值符星 = 旬首遁干原始宫对应的星(中五宫为天禽,寄坤二随天芮)
81
+ * 2. 值符星随时干:转盘旋转使值符星从原始宫转到参考干落宫
82
+ * 3. 其余诸星按九星环序(蓬任冲辅英芮柱心)随盘刚体旋转
75
83
  */
76
- static calculateJiuXing(xunShouGong: GongWei, hourZhi: DiZhi, yinYangDun: YinYangDun): ZhuanPanJiuXingResult;
84
+ static calculateJiuXing(xunShouGong: GongWei, shiGanLuoGong: GongWei, yinYangDun: YinYangDun): ZhuanPanJiuXingResult;
77
85
  /**
78
86
  * 获取遁甲干
79
87
  * 甲遁于六仪之下,需要根据干支确定
80
88
  */
81
89
  private static getDunGan;
82
- /**
83
- * 根据起始宫位和步数计算目标宫位(转盘式9宫旋转)
84
- * 包含中宫处理
85
- */
86
- private static getGongByRotation;
87
90
  /**
88
91
  * 根据宫位获取原始门
89
92
  */
@@ -92,16 +95,6 @@ export declare class ZhuanPanCalculator {
92
95
  * 根据宫位获取原始星
93
96
  */
94
97
  private static getXingByGong;
95
- /**
96
- * 计算所有八门的落宫(转盘式)
97
- * 整体按物理方向旋转
98
- */
99
- private static calculateAllMenZhuanPan;
100
- /**
101
- * 计算所有九星的落宫(转盘式)
102
- * 整体按物理方向旋转,天禽星随天芮星
103
- */
104
- private static calculateAllXingZhuanPan;
105
98
  /**
106
99
  * 根据宫位找门
107
100
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ZhuanPanCalculator.d.ts","sourceRoot":"","sources":["../../../../src/services/qimen/calculators/ZhuanPanCalculator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAoBpF,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAChC,SAAS,EAAE,KAAK,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;CACvB;AAID;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,gBAAgB,CACrB,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EACtC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,GACrB,qBAAqB;IA6BxB;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,cAAc,CACnB,SAAS,EAAE,OAAO,EAClB,OAAO,EAAE,KAAK,EACd,UAAU,EAAE,UAAU,GACrB,mBAAmB;IAwBtB;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,gBAAgB,CACrB,WAAW,EAAE,OAAO,EACpB,OAAO,EAAE,KAAK,EACd,UAAU,EAAE,UAAU,GACrB,qBAAqB;IA0BxB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IAUxB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAwBhC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAY3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAe5B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IA6BtC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAoCvC;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,KAAK;IAI3E;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO;IAOjF;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO;CAI/E"}
1
+ {"version":3,"file":"ZhuanPanCalculator.d.ts","sourceRoot":"","sources":["../../../../src/services/qimen/calculators/ZhuanPanCalculator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAS,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAiBpF,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAChC,SAAS,EAAE,KAAK,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;CACvB;AAUD;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CACrB,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EACtC,MAAM,EAAE,MAAM,GACb,OAAO;IAOV;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,gBAAgB,CACrB,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EACtC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,GACrB,qBAAqB;IA0CxB;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,cAAc,CACnB,SAAS,EAAE,OAAO,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,UAAU,GACrB,mBAAmB;IAyCtB;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,gBAAgB,CACrB,WAAW,EAAE,OAAO,EACpB,aAAa,EAAE,OAAO,EACtB,UAAU,EAAE,UAAU,GACrB,qBAAqB;IA+BxB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IAUxB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAY3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAe5B;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,KAAK;IAI3E;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO;IAOjF;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO;CAI/E"}
@@ -4,22 +4,41 @@
4
4
  * Rotating style Qimen calculator (following《神奇之门》)
5
5
  *
6
6
  * 转盘式核心规则:
7
- * 1. 三奇六仪按物理方向旋转(非洛书飞布)
8
- * 2. 阳遁顺转(物理顺时针):1→8→3→4→9→2→7→6
9
- * 3. 阴遁逆转(物理逆时针):1→6→7→2→9→4→3→8
10
- * 4. 八门、九星同样按物理方向转动
11
- * 5. 中宫寄坤二
12
- * 6. 天禽星随天芮星(寄坤二宫)
7
+ * 1. 天盘、九星、八门是三个「物理转盘」,盘内元素相对顺序恒定不变
8
+ * 2. 转盘环序(物理顺时针,从坎一宫起):坎→艮→震→巽→离→坤→兑→乾
9
+ * - 九星环序:蓬任冲辅英芮柱心(禽寄芮,随坤二宫)
10
+ * - 八门环序:休生伤杜景死惊开
11
+ * 3. 天盘干与九星同转:值符星携旬首六仪转到时干(遁干)所在的地盘宫
12
+ * 4. 值使门随时辰飞宫:从值符原始宫起,按旬内时辰序数,
13
+ * 阳遁顺数宫位数字(1→2→…→9→1)、阴遁逆数
14
+ * 5. 中五宫寄坤二宫;天禽随天芮
15
+ *
16
+ * 参照:《神奇之门》(张志春)、kentang2017/kinqimen pan_sky/pan_star/pan_door(MIT)
13
17
  */
14
18
  Object.defineProperty(exports, "__esModule", { value: true });
15
19
  exports.ZhuanPanCalculator = void 0;
16
20
  const constants_1 = require("../data/constants");
21
+ /**
22
+ * 转盘九星环序(物理顺时针,天禽寄天芮不在环上)
23
+ * 与 PHYSICAL_CLOCKWISE_ORDER=[坎1,艮8,震3,巽4,离9,坤2,兑7,乾6] 一一对应
24
+ */
25
+ const JIU_XING_RING = ['蓬', '任', '冲', '辅', '英', '芮', '柱', '心'];
17
26
  // ============= 转盘式计算器 =============
18
27
  /**
19
28
  * 转盘式奇门计算器
20
29
  * 实现《神奇之门》中的转盘式排盘法
21
30
  */
22
31
  class ZhuanPanCalculator {
32
+ /**
33
+ * 获取参考干(时干/日干/月干/年干)遁干后的地盘落宫
34
+ * 甲遁于旬首六仪之下;落中五宫者寄坤二
35
+ */
36
+ static getShiGanLuoGong(diPanGanGong, ganZhi) {
37
+ const gan = ganZhi.charAt(0);
38
+ const dunGan = this.getDunGan(gan, ganZhi);
39
+ const gong = diPanGanGong[dunGan];
40
+ return gong === 5 ? constants_1.ZHONG_GONG_JI_ZHUAN : gong;
41
+ }
23
42
  /**
24
43
  * 计算转盘式天盘布局
25
44
  * @param diPanGanGong 地盘干->宫位映射
@@ -27,95 +46,123 @@ class ZhuanPanCalculator {
27
46
  * @param yinYangDun 阴阳遁
28
47
  * @returns 天盘各宫的干
29
48
  *
30
- * 原理(转盘式):
31
- * 1. 找到时干(或日干/月干/年干)在地盘的落宫
32
- * 2. 计算该宫到值符星原始宫的旋转步数
33
- * 3. 将整个地盘旋转相应步数
34
- * 4. 阳遁顺时针旋转,阴遁逆时针旋转
49
+ * 原理(转盘式刚体旋转):
50
+ * 1. 旬首六仪(值符所携之干)在地盘的原始宫
51
+ * 2. 参考干(时干等,甲用旬首仪)在地盘的落宫
52
+ * 3. 将整个地盘沿转盘环旋转,使旬首仪从原始宫转到参考干落宫
53
+ * 4. 中五宫之干寄坤二宫随盘转动;天盘中宫显示坤二宫之干
35
54
  */
36
55
  static calculateTianPan(diPanGanGong, ganZhi, yinYangDun) {
37
56
  const isYang = yinYangDun === '阳遁';
38
- const gan = ganZhi.charAt(0);
39
- // 时干对应的遁甲干
40
- const dunGan = this.getDunGan(gan, ganZhi);
41
- // 找到遁甲干在地盘的落宫
42
- let startGong = diPanGanGong[dunGan];
43
- if (startGong === 5) {
44
- startGong = constants_1.ZHONG_GONG_JI_ZHUAN;
57
+ const xunShou = (0, constants_1.getXunShou)(ganZhi);
58
+ const fuGan = (0, constants_1.getLiuYiGan)(xunShou);
59
+ const shiGong = this.getShiGanLuoGong(diPanGanGong, ganZhi);
60
+ let fuGong = diPanGanGong[fuGan];
61
+ if (fuGong === 5) {
62
+ fuGong = constants_1.ZHONG_GONG_JI_ZHUAN; // 中五寄坤二
45
63
  }
46
- // 转盘式:整体旋转
47
- // 计算需要旋转的步数:从遁甲干原始宫位到当前地盘落宫的步数
64
+ const steps = (0, constants_1.getRotationSteps)(fuGong, shiGong, isYang);
48
65
  const gongGan = {};
49
66
  const ganGong = {};
50
- // 转盘式布局:从起始宫开始,按物理方向旋转布入三奇六仪
51
- for (let i = 0; i < 9; i++) {
52
- const currentGan = constants_1.SAN_QI_LIU_YI[i];
53
- const gong = this.getGongByRotation(startGong, i, isYang);
54
- gongGan[gong] = currentGan;
55
- ganGong[currentGan] = gong;
67
+ // 地盘坤二宫本干与中五宫寄干(若中五有干,二者同落一宫)
68
+ const kunGan = constants_1.SAN_QI_LIU_YI.find(g => diPanGanGong[g] === 2);
69
+ const zhongGan = constants_1.SAN_QI_LIU_YI.find(g => diPanGanGong[g] === 5);
70
+ for (const gan of constants_1.SAN_QI_LIU_YI) {
71
+ const src = diPanGanGong[gan];
72
+ const srcActual = src === 5 ? constants_1.ZHONG_GONG_JI_ZHUAN : src;
73
+ const dst = (0, constants_1.rotate)(srcActual, steps, isYang);
74
+ ganGong[gan] = dst;
75
+ gongGan[dst] = gan;
76
+ }
77
+ // 中五寄干与坤二本干同宫时,坤二本干优先显示
78
+ if (zhongGan !== undefined && kunGan !== undefined) {
79
+ const kunDst = ganGong[kunGan];
80
+ gongGan[kunDst] = kunGan;
56
81
  }
82
+ // 天盘中五宫寄坤二,显示坤二宫天盘干
83
+ gongGan[5] = gongGan[constants_1.ZHONG_GONG_JI_ZHUAN];
57
84
  return { gongGan, ganGong };
58
85
  }
59
86
  /**
60
87
  * 计算转盘式八门布局
61
- * @param zhiFuGong 值符星落宫(旬首遁干在地盘的宫位)
62
- * @param hourZhi 时支
88
+ * @param zhiFuGong 值符星原始宫位(旬首遁干在地盘的宫位,值使门原始宫与其相同)
89
+ * @param refGanZhi 参考干支(时盘为时干支,余类推)
63
90
  * @param yinYangDun 阴阳遁
64
91
  * @returns 八门布局
65
92
  *
66
93
  * 原理(转盘式):
67
- * 1. 确定值使门(值符星原始宫位对应的门)
68
- * 2. 值使门从值符星落宫起,按时辰数旋转
69
- * 3. 阳遁顺时针,阴遁逆时针
70
- * 4. 其他七门依次排列(按物理方向旋转)
94
+ * 1. 值使门 = 值符星原始宫位对应的门(中五宫寄坤二取死门)
95
+ * 2. 值使门落宫:从值符原始宫起,按参考干支的旬内序数(甲为0),
96
+ * 阳遁顺数宫位数字、阴遁逆数;落中五宫寄坤二
97
+ * 3. 其余七门按八门环序(休生伤杜景死惊开)随盘刚体旋转
71
98
  */
72
- static calculateBaMen(zhiFuGong, hourZhi, yinYangDun) {
99
+ static calculateBaMen(zhiFuGong, refGanZhi, yinYangDun) {
73
100
  const isYang = yinYangDun === '阳遁';
74
- // 1. 确定值使门(值符星原始宫位对应的门)
101
+ // 1. 确定值使门(值符原始宫对应的门)
75
102
  const zhiShiMen = this.getMenByGong(zhiFuGong);
76
103
  const zhiShiGong = constants_1.BA_MEN_GONG[zhiShiMen];
77
- // 2. 计算时辰数(子时为1
78
- const hourNum = constants_1.DI_ZHI.indexOf(hourZhi) + 1;
79
- // 3. 计算值使门落宫(转盘式旋转)
80
- const zhiShiLuoGong = (0, constants_1.rotate)(zhiFuGong, hourNum - 1, isYang);
81
- // 4. 计算所有八门的落宫(转盘式)
82
- const gongMen = this.calculateAllMenZhuanPan(zhiShiMen, zhiShiLuoGong, isYang);
104
+ // 2. 旬内序数:甲为0,乙为1,……癸为9(时干支/日干支在其旬内的位置)
105
+ const idx = constants_1.JIA_ZI_60.indexOf(refGanZhi);
106
+ if (idx === -1) {
107
+ throw new Error(`无效的干支: ${refGanZhi}`);
108
+ }
109
+ const steps = idx % 10;
110
+ // 3. 值使门落宫(宫位数字顺逆数,落中五寄坤二)
111
+ const anchor = zhiShiGong === 5 ? constants_1.ZHONG_GONG_JI_ZHUAN : zhiShiGong;
112
+ let luoGong = (((anchor - 1 + (isYang ? steps : -steps)) % 9) + 9) % 9 + 1;
113
+ if (luoGong === 5) {
114
+ luoGong = constants_1.ZHONG_GONG_JI_ZHUAN;
115
+ }
116
+ // 4. 八门刚体旋转:值使门从原始宫转到落宫
117
+ const ringSteps = (0, constants_1.getRotationSteps)(anchor, luoGong, isYang);
118
+ const gongMen = {};
119
+ for (let i = 0; i < 8; i++) {
120
+ const men = constants_1.BA_MEN_ORDER[i];
121
+ const home = constants_1.PHYSICAL_CLOCKWISE_ORDER[i]; // 八门原始宫与环序一一对应
122
+ gongMen[(0, constants_1.rotate)(home, ringSteps, isYang)] = men;
123
+ }
124
+ // 中宫寄坤二,使用坤二的门
125
+ gongMen[5] = gongMen[constants_1.ZHONG_GONG_JI_ZHUAN];
83
126
  return {
84
127
  gongMen,
85
128
  zhiShiMen,
86
129
  zhiShiGong,
87
- zhiShiLuoGong,
130
+ zhiShiLuoGong: luoGong,
88
131
  };
89
132
  }
90
133
  /**
91
134
  * 计算转盘式九星布局
92
- * @param xunShouGong 旬首遁干在地盘的宫位
93
- * @param hourZhi 时支
135
+ * @param xunShouGong 旬首遁干在地盘的宫位(值符星原始宫)
136
+ * @param shiGanLuoGong 参考干(时干等,甲用旬首仪)的地盘落宫
94
137
  * @param yinYangDun 阴阳遁
95
138
  * @returns 九星布局
96
139
  *
97
140
  * 原理(转盘式):
98
- * 1. 确定值符星(旬首落宫对应的星)
99
- * 2. 值符星从地盘旬首落宫起,按时辰数旋转
100
- * 3. 阳遁顺时针,阴遁逆时针
101
- * 4. 天禽星(中五宫)随天芮星,或寄坤二
141
+ * 1. 值符星 = 旬首遁干原始宫对应的星(中五宫为天禽,寄坤二随天芮)
142
+ * 2. 值符星随时干:转盘旋转使值符星从原始宫转到参考干落宫
143
+ * 3. 其余诸星按九星环序(蓬任冲辅英芮柱心)随盘刚体旋转
102
144
  */
103
- static calculateJiuXing(xunShouGong, hourZhi, yinYangDun) {
145
+ static calculateJiuXing(xunShouGong, shiGanLuoGong, yinYangDun) {
104
146
  const isYang = yinYangDun === '阳遁';
105
147
  // 1. 确定值符星(旬首落宫对应的星)
106
148
  const zhiFuXing = this.getXingByGong(xunShouGong);
107
149
  const zhiFuGong = constants_1.JIU_XING_GONG[zhiFuXing];
108
- // 2. 计算时辰数(子时为1)
109
- const hourNum = constants_1.DI_ZHI.indexOf(hourZhi) + 1;
110
- // 3. 计算值符星落宫(转盘式旋转)
111
- const zhiFuLuoGong = (0, constants_1.rotate)(xunShouGong, hourNum - 1, isYang);
112
- // 4. 计算所有九星的落宫(转盘式)
113
- const gongXing = this.calculateAllXingZhuanPan(zhiFuXing, zhiFuLuoGong, isYang);
150
+ // 天禽寄坤二,随天芮所在环位转动
151
+ const homeSlot = xunShouGong === 5 ? constants_1.ZHONG_GONG_JI_ZHUAN : xunShouGong;
152
+ // 2. 刚体旋转:值符星原始环位转到参考干落宫
153
+ const steps = (0, constants_1.getRotationSteps)(homeSlot, shiGanLuoGong, isYang);
154
+ const gongXing = {};
155
+ for (let i = 0; i < 8; i++) {
156
+ const home = constants_1.PHYSICAL_CLOCKWISE_ORDER[i];
157
+ gongXing[(0, constants_1.rotate)(home, steps, isYang)] = JIU_XING_RING[i];
158
+ }
159
+ // 天禽随天芮寄坤二,中宫显示天禽
160
+ gongXing[5] = '禽';
114
161
  return {
115
162
  gongXing,
116
163
  zhiFuXing,
117
164
  zhiFuGong,
118
- zhiFuLuoGong,
165
+ zhiFuLuoGong: shiGanLuoGong,
119
166
  };
120
167
  }
121
168
  // ============= 私有辅助方法 =============
@@ -131,31 +178,6 @@ class ZhuanPanCalculator {
131
178
  const xunShou = (0, constants_1.getXunShou)(ganZhi);
132
179
  return (0, constants_1.getLiuYiGan)(xunShou);
133
180
  }
134
- /**
135
- * 根据起始宫位和步数计算目标宫位(转盘式9宫旋转)
136
- * 包含中宫处理
137
- */
138
- static getGongByRotation(startGong, steps, isYang) {
139
- // 中宫寄坤二
140
- if (startGong === 5) {
141
- startGong = constants_1.ZHONG_GONG_JI_ZHUAN;
142
- }
143
- // 对于9宫布局(含中宫),需要特殊处理
144
- // 前4步走外圈前半,第5步到中宫,后4步走外圈后半
145
- if (steps === 4) {
146
- return 5; // 第5个位置是中宫
147
- }
148
- // 调整步数:跳过中宫的计算
149
- const adjustedSteps = steps > 4 ? steps - 1 : steps;
150
- if (isYang) {
151
- const startIdx = (0, constants_1.getPhysicalClockwiseIndex)(startGong);
152
- return (0, constants_1.getPhysicalClockwiseGong)(startIdx + adjustedSteps);
153
- }
154
- else {
155
- const startIdx = (0, constants_1.getPhysicalCounterClockwiseIndex)(startGong);
156
- return (0, constants_1.getPhysicalCounterClockwiseGong)(startIdx + adjustedSteps);
157
- }
158
- }
159
181
  /**
160
182
  * 根据宫位获取原始门
161
183
  */
@@ -183,56 +205,6 @@ class ZhuanPanCalculator {
183
205
  }
184
206
  return '芮'; // 默认天芮
185
207
  }
186
- /**
187
- * 计算所有八门的落宫(转盘式)
188
- * 整体按物理方向旋转
189
- */
190
- static calculateAllMenZhuanPan(zhiShiMen, zhiShiLuoGong, isYang) {
191
- const gongMen = {};
192
- // 找到值使门在八门顺序中的索引
193
- const zhiShiIdx = constants_1.BA_MEN_ORDER.indexOf(zhiShiMen);
194
- // 获取值使门落宫索引
195
- let actualLuoGong = zhiShiLuoGong === 5 ? constants_1.ZHONG_GONG_JI_ZHUAN : zhiShiLuoGong;
196
- // 转盘式:依次排列八门,按物理方向旋转
197
- for (let i = 0; i < 8; i++) {
198
- const menIdx = (zhiShiIdx + i) % 8;
199
- const men = constants_1.BA_MEN_ORDER[menIdx];
200
- // 转盘式旋转
201
- const gong = (0, constants_1.rotate)(actualLuoGong, i, isYang);
202
- gongMen[gong] = men;
203
- }
204
- // 中宫寄坤二,使用坤二的门
205
- gongMen[5] = gongMen[constants_1.ZHONG_GONG_JI_ZHUAN];
206
- return gongMen;
207
- }
208
- /**
209
- * 计算所有九星的落宫(转盘式)
210
- * 整体按物理方向旋转,天禽星随天芮星
211
- */
212
- static calculateAllXingZhuanPan(zhiFuXing, zhiFuLuoGong, isYang) {
213
- const gongXing = {};
214
- // 九星顺序(不含天禽,因为天禽随天芮)
215
- const xingOrderWithoutQin = ['蓬', '芮', '冲', '辅', '心', '柱', '任', '英'];
216
- // 找到值符星在顺序中的索引
217
- let zhiFuIdx = xingOrderWithoutQin.indexOf(zhiFuXing);
218
- if (zhiFuIdx === -1) {
219
- // 如果值符星是天禽,则以天芮为准
220
- zhiFuIdx = xingOrderWithoutQin.indexOf('芮');
221
- }
222
- // 获取值符星落宫
223
- let actualLuoGong = zhiFuLuoGong === 5 ? constants_1.ZHONG_GONG_JI_ZHUAN : zhiFuLuoGong;
224
- // 转盘式:依次排列八星,按物理方向旋转
225
- for (let i = 0; i < 8; i++) {
226
- const xingIdx = (zhiFuIdx + i) % 8;
227
- const xing = xingOrderWithoutQin[xingIdx];
228
- // 转盘式旋转
229
- const gong = (0, constants_1.rotate)(actualLuoGong, i, isYang);
230
- gongXing[gong] = xing;
231
- }
232
- // 天禽星寄中宫,实际显示时随天芮
233
- gongXing[5] = '禽';
234
- return gongXing;
235
- }
236
208
  /**
237
209
  * 根据宫位找门
238
210
  */