xiaochengtu 1.0.0

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.
package/dist/index.mjs ADDED
@@ -0,0 +1,520 @@
1
+ // src/types.ts
2
+ var Trigram = /* @__PURE__ */ ((Trigram3) => {
3
+ Trigram3["Qian"] = "qian";
4
+ Trigram3["Dui"] = "dui";
5
+ Trigram3["Li"] = "li";
6
+ Trigram3["Zhen"] = "zhen";
7
+ Trigram3["Xun"] = "xun";
8
+ Trigram3["Kan"] = "kan";
9
+ Trigram3["Gen"] = "gen";
10
+ Trigram3["Kun"] = "kun";
11
+ return Trigram3;
12
+ })(Trigram || {});
13
+ var WuXing = /* @__PURE__ */ ((WuXing2) => {
14
+ WuXing2["Metal"] = "metal";
15
+ WuXing2["Wood"] = "wood";
16
+ WuXing2["Water"] = "water";
17
+ WuXing2["Fire"] = "fire";
18
+ WuXing2["Earth"] = "earth";
19
+ return WuXing2;
20
+ })(WuXing || {});
21
+ var YinYang = /* @__PURE__ */ ((YinYang3) => {
22
+ YinYang3["Yang"] = "yang";
23
+ YinYang3["Yin"] = "yin";
24
+ return YinYang3;
25
+ })(YinYang || {});
26
+ var DynamicProperty = /* @__PURE__ */ ((DynamicProperty2) => {
27
+ DynamicProperty2["Rising"] = "rising";
28
+ DynamicProperty2["Falling"] = "falling";
29
+ return DynamicProperty2;
30
+ })(DynamicProperty || {});
31
+ var FourImages = /* @__PURE__ */ ((FourImages2) => {
32
+ FourImages2["He"] = "he";
33
+ FourImages2["Pi"] = "pi";
34
+ FourImages2["Wang"] = "wang";
35
+ FourImages2["Lai"] = "lai";
36
+ return FourImages2;
37
+ })(FourImages || {});
38
+ var MatchResult = /* @__PURE__ */ ((MatchResult2) => {
39
+ MatchResult2["Match"] = "match";
40
+ MatchResult2["Mismatch"] = "mismatch";
41
+ return MatchResult2;
42
+ })(MatchResult || {});
43
+ var Palace = /* @__PURE__ */ ((Palace2) => {
44
+ Palace2[Palace2["Kan"] = 1] = "Kan";
45
+ Palace2[Palace2["Kun"] = 2] = "Kun";
46
+ Palace2[Palace2["Zhen"] = 3] = "Zhen";
47
+ Palace2[Palace2["Xun"] = 4] = "Xun";
48
+ Palace2[Palace2["Center"] = 5] = "Center";
49
+ Palace2[Palace2["Qian"] = 6] = "Qian";
50
+ Palace2[Palace2["Dui"] = 7] = "Dui";
51
+ Palace2[Palace2["Gen"] = 8] = "Gen";
52
+ Palace2[Palace2["Li"] = 9] = "Li";
53
+ return Palace2;
54
+ })(Palace || {});
55
+
56
+ // src/constants.ts
57
+ var TRIGRAM_PROPERTIES = {
58
+ ["qian" /* Qian */]: {
59
+ name: "Qian",
60
+ chineseName: "\u4E7E",
61
+ priorHeavenNumber: 1,
62
+ wuXing: "metal" /* Metal */,
63
+ yinYang: "yang" /* Yang */,
64
+ dynamicProperty: "rising" /* Rising */,
65
+ palacePosition: 6 /* Qian */
66
+ },
67
+ ["dui" /* Dui */]: {
68
+ name: "Dui",
69
+ chineseName: "\u5151",
70
+ priorHeavenNumber: 2,
71
+ wuXing: "metal" /* Metal */,
72
+ yinYang: "yin" /* Yin */,
73
+ dynamicProperty: "falling" /* Falling */,
74
+ palacePosition: 7 /* Dui */
75
+ },
76
+ ["li" /* Li */]: {
77
+ name: "Li",
78
+ chineseName: "\u79BB",
79
+ priorHeavenNumber: 3,
80
+ wuXing: "fire" /* Fire */,
81
+ yinYang: "yin" /* Yin */,
82
+ dynamicProperty: "falling" /* Falling */,
83
+ palacePosition: 9 /* Li */
84
+ },
85
+ ["zhen" /* Zhen */]: {
86
+ name: "Zhen",
87
+ chineseName: "\u9707",
88
+ priorHeavenNumber: 4,
89
+ wuXing: "wood" /* Wood */,
90
+ yinYang: "yang" /* Yang */,
91
+ dynamicProperty: "rising" /* Rising */,
92
+ palacePosition: 3 /* Zhen */
93
+ },
94
+ ["xun" /* Xun */]: {
95
+ name: "Xun",
96
+ chineseName: "\u5DFD",
97
+ priorHeavenNumber: 5,
98
+ wuXing: "wood" /* Wood */,
99
+ yinYang: "yin" /* Yin */,
100
+ dynamicProperty: "falling" /* Falling */,
101
+ palacePosition: 4 /* Xun */
102
+ },
103
+ ["kan" /* Kan */]: {
104
+ name: "Kan",
105
+ chineseName: "\u574E",
106
+ priorHeavenNumber: 6,
107
+ wuXing: "water" /* Water */,
108
+ yinYang: "yang" /* Yang */,
109
+ dynamicProperty: "rising" /* Rising */,
110
+ palacePosition: 1 /* Kan */
111
+ },
112
+ ["gen" /* Gen */]: {
113
+ name: "Gen",
114
+ chineseName: "\u826E",
115
+ priorHeavenNumber: 7,
116
+ wuXing: "earth" /* Earth */,
117
+ yinYang: "yang" /* Yang */,
118
+ dynamicProperty: "rising" /* Rising */,
119
+ palacePosition: 8 /* Gen */
120
+ },
121
+ ["kun" /* Kun */]: {
122
+ name: "Kun",
123
+ chineseName: "\u5764",
124
+ priorHeavenNumber: 8,
125
+ wuXing: "earth" /* Earth */,
126
+ yinYang: "yin" /* Yin */,
127
+ dynamicProperty: "falling" /* Falling */,
128
+ palacePosition: 2 /* Kun */
129
+ }
130
+ };
131
+ var NUMBER_TO_TRIGRAM = {
132
+ 1: "qian" /* Qian */,
133
+ 2: "dui" /* Dui */,
134
+ 3: "li" /* Li */,
135
+ 4: "zhen" /* Zhen */,
136
+ 5: "xun" /* Xun */,
137
+ 6: "kan" /* Kan */,
138
+ 7: "gen" /* Gen */,
139
+ 8: "kun" /* Kun */
140
+ };
141
+ var PALACE_TO_EARTH_TRIGRAM = {
142
+ [1 /* Kan */]: "kan" /* Kan */,
143
+ [2 /* Kun */]: "kun" /* Kun */,
144
+ [3 /* Zhen */]: "zhen" /* Zhen */,
145
+ [4 /* Xun */]: "xun" /* Xun */,
146
+ [5 /* Center */]: "kun" /* Kun */,
147
+ // 中宫无固定地盘,默认坤
148
+ [6 /* Qian */]: "qian" /* Qian */,
149
+ [7 /* Dui */]: "dui" /* Dui */,
150
+ [8 /* Gen */]: "gen" /* Gen */,
151
+ [9 /* Li */]: "li" /* Li */
152
+ };
153
+ var TRIGRAM_BINARY_CORRECT = {
154
+ ["qian" /* Qian */]: [1, 1, 1],
155
+ // ☰ 乾:三阳
156
+ ["dui" /* Dui */]: [0, 1, 1],
157
+ // ☱ 兑:上阴中阳下阳
158
+ ["li" /* Li */]: [1, 0, 1],
159
+ // ☲ 离:上阳中阴下阳
160
+ ["zhen" /* Zhen */]: [1, 0, 0],
161
+ // ☳ 震:上阳中阴下阴
162
+ ["xun" /* Xun */]: [0, 1, 1],
163
+ // ☴ 巽:上阴中阳下阳(与兑相同?需核实)
164
+ ["kan" /* Kan */]: [0, 1, 0],
165
+ // ☵ 坎:上阴中阳下阴
166
+ ["gen" /* Gen */]: [0, 0, 1],
167
+ // ☶ 艮:上阴中阴下阳
168
+ ["kun" /* Kun */]: [0, 0, 0]
169
+ // ☷ 坤:三阴
170
+ };
171
+ var BINARY_TO_TRIGRAM = {
172
+ "111": "qian" /* Qian */,
173
+ "011": "dui" /* Dui */,
174
+ "101": "li" /* Li */,
175
+ "100": "zhen" /* Zhen */,
176
+ "110": "xun" /* Xun */,
177
+ "010": "kan" /* Kan */,
178
+ "001": "gen" /* Gen */,
179
+ "000": "kun" /* Kun */
180
+ };
181
+ var OPPOSITE_HEXAGRAMS = [
182
+ { upper: "qian" /* Qian */, lower: "kun" /* Kun */, name: "\u5929\u5730\u5426" },
183
+ { upper: "kun" /* Kun */, lower: "qian" /* Qian */, name: "\u5730\u5929\u6CF0" },
184
+ { upper: "kan" /* Kan */, lower: "li" /* Li */, name: "\u6C34\u706B\u65E2\u6D4E" },
185
+ { upper: "li" /* Li */, lower: "kan" /* Kan */, name: "\u706B\u6C34\u672A\u6D4E" },
186
+ { upper: "gen" /* Gen */, lower: "dui" /* Dui */, name: "\u5C71\u6CFD\u635F" },
187
+ { upper: "dui" /* Dui */, lower: "gen" /* Gen */, name: "\u6CFD\u5C71\u54B8" },
188
+ { upper: "zhen" /* Zhen */, lower: "xun" /* Xun */, name: "\u96F7\u98CE\u6052" },
189
+ { upper: "xun" /* Xun */, lower: "zhen" /* Zhen */, name: "\u98CE\u96F7\u76CA" }
190
+ ];
191
+
192
+ // src/utils.ts
193
+ function numberToTrigram(num) {
194
+ let n = num % 8;
195
+ if (n === 0) n = 8;
196
+ return NUMBER_TO_TRIGRAM[n];
197
+ }
198
+ function generateMutualHexagram(hexagram) {
199
+ const upperBinary = TRIGRAM_BINARY_CORRECT[hexagram.upper];
200
+ const lowerBinary = TRIGRAM_BINARY_CORRECT[hexagram.lower];
201
+ const sixYao = [...lowerBinary, ...upperBinary];
202
+ const mutualUpperBinary = `${sixYao[2]}${sixYao[3]}${sixYao[4]}`;
203
+ const mutualLowerBinary = `${sixYao[1]}${sixYao[2]}${sixYao[3]}`;
204
+ return {
205
+ upper: BINARY_TO_TRIGRAM[mutualUpperBinary],
206
+ lower: BINARY_TO_TRIGRAM[mutualLowerBinary]
207
+ };
208
+ }
209
+ function isPureHexagram(hexagram) {
210
+ return hexagram.upper === hexagram.lower;
211
+ }
212
+ function isOppositeHexagram(hexagram) {
213
+ return OPPOSITE_HEXAGRAMS.some(
214
+ (h) => h.upper === hexagram.upper && h.lower === hexagram.lower
215
+ );
216
+ }
217
+ function guiCangAlgorithm(upper, lower) {
218
+ const upperBinary = TRIGRAM_BINARY_CORRECT[upper];
219
+ const lowerBinary = TRIGRAM_BINARY_CORRECT[lower];
220
+ const resultBinary = upperBinary.map((u, i) => u === lowerBinary[i] ? 0 : 1);
221
+ const binaryStr = resultBinary.join("");
222
+ return BINARY_TO_TRIGRAM[binaryStr];
223
+ }
224
+ function calculateCenterPalace(baseHexagram, changedHexagram) {
225
+ const fourTrigrams = [
226
+ baseHexagram.upper,
227
+ baseHexagram.lower,
228
+ changedHexagram.upper,
229
+ changedHexagram.lower
230
+ ];
231
+ const qianCount = fourTrigrams.filter((t) => t === "qian" /* Qian */).length;
232
+ const kunCount = fourTrigrams.filter((t) => t === "kun" /* Kun */).length;
233
+ if (qianCount === 1) return "qian" /* Qian */;
234
+ if (kunCount === 1) return "kun" /* Kun */;
235
+ if (isPureHexagram(baseHexagram) || isPureHexagram(changedHexagram)) {
236
+ return "kun" /* Kun */;
237
+ }
238
+ if (isOppositeHexagram(baseHexagram) || isOppositeHexagram(changedHexagram)) {
239
+ return "qian" /* Qian */;
240
+ }
241
+ return guiCangAlgorithm(baseHexagram.upper, baseHexagram.lower);
242
+ }
243
+ function buildSkyBoard(baseHexagram, changedHexagram, baseMutualHexagram, changedMutualHexagram, centerTrigram) {
244
+ return {
245
+ grid9: baseHexagram.upper,
246
+ // 离宫 ← 本卦上卦
247
+ grid1: baseHexagram.lower,
248
+ // 坎宫 ← 本卦下卦
249
+ grid4: changedHexagram.upper,
250
+ // 巽宫 ← 变卦上卦
251
+ grid3: changedHexagram.lower,
252
+ // 震宫 ← 变卦下卦
253
+ grid8: baseMutualHexagram.upper,
254
+ // 艮宫 ← 本卦互卦上卦
255
+ grid2: baseMutualHexagram.lower,
256
+ // 坤宫 ← 本卦互卦下卦
257
+ grid6: changedMutualHexagram.upper,
258
+ // 乾宫 ← 变卦互卦上卦
259
+ grid7: changedMutualHexagram.lower,
260
+ // 兑宫 ← 变卦互卦下卦
261
+ grid5: centerTrigram
262
+ // 中宫
263
+ };
264
+ }
265
+ function calculateFourImages(skyTrigram, earthTrigram) {
266
+ const skyProp = TRIGRAM_PROPERTIES[skyTrigram];
267
+ const earthProp = TRIGRAM_PROPERTIES[earthTrigram];
268
+ const skyRising = skyProp.dynamicProperty === "rising" /* Rising */;
269
+ const earthRising = earthProp.dynamicProperty === "rising" /* Rising */;
270
+ if (!skyRising && earthRising) {
271
+ return "he" /* He */;
272
+ } else if (skyRising && !earthRising) {
273
+ return "pi" /* Pi */;
274
+ } else if (skyRising && earthRising) {
275
+ return "wang" /* Wang */;
276
+ } else {
277
+ return "lai" /* Lai */;
278
+ }
279
+ }
280
+ function calculateMatchResult(skyTrigram, earthTrigram) {
281
+ const skyProp = TRIGRAM_PROPERTIES[skyTrigram];
282
+ const earthProp = TRIGRAM_PROPERTIES[earthTrigram];
283
+ return skyProp.yinYang !== earthProp.yinYang ? "match" /* Match */ : "mismatch" /* Mismatch */;
284
+ }
285
+ function generateFortuneDescription(fourImage, matchResult) {
286
+ if (fourImage === "he" /* He */ && matchResult === "match" /* Match */) {
287
+ return "\u5927\u5409 - \u5411\u5FC3\u4E14\u9634\u9633\u76F8\u5438\uFF0C\u4E8B\u6210";
288
+ }
289
+ if (fourImage === "pi" /* Pi */ && matchResult === "mismatch" /* Mismatch */) {
290
+ return "\u51F6 - \u79BB\u5FC3\u4E14\u9634\u9633\u76F8\u65A5\uFF0C\u7834\u88C2";
291
+ }
292
+ if (fourImage === "he" /* He */ && matchResult === "mismatch" /* Mismatch */) {
293
+ return "\u5C0F\u51F6 - \u867D\u5411\u5FC3\u4F46\u9634\u9633\u76F8\u65A5\uFF0C\u96BE\u6210";
294
+ }
295
+ if (fourImage === "pi" /* Pi */ && matchResult === "match" /* Match */) {
296
+ return "\u8FC7\u7A0B\u66F2\u6298 - \u867D\u5F97\u914D\u4F46\u79BB\u5FC3\uFF0C\u597D\u805A\u597D\u6563";
297
+ }
298
+ if (fourImage === "wang" /* Wang */ && matchResult === "match" /* Match */) {
299
+ return "\u5409 - \u5916\u5F15\u5F97\u914D\uFF0C\u5B9C\u5916\u51FA\u53D1\u5C55";
300
+ }
301
+ if (fourImage === "wang" /* Wang */ && matchResult === "mismatch" /* Mismatch */) {
302
+ return "\u51F6 - \u5916\u5F15\u5931\u914D\uFF0C\u5954\u6CE2\u5F92\u52B3";
303
+ }
304
+ if (fourImage === "lai" /* Lai */ && matchResult === "match" /* Match */) {
305
+ return "\u5409 - \u5185\u5F15\u5F97\u914D\uFF0C\u5B9C\u5B88\u6210";
306
+ }
307
+ if (fourImage === "lai" /* Lai */ && matchResult === "mismatch" /* Mismatch */) {
308
+ return "\u5C0F\u51F6 - \u5185\u5F15\u5931\u914D\uFF0C\u5185\u90E8\u4E0D\u548C";
309
+ }
310
+ return "\u5F85\u5B9A";
311
+ }
312
+ function analyzePalace(palace, skyTrigram) {
313
+ const earthTrigram = PALACE_TO_EARTH_TRIGRAM[palace];
314
+ const fourImage = calculateFourImages(skyTrigram, earthTrigram);
315
+ const matchResult = calculateMatchResult(skyTrigram, earthTrigram);
316
+ const fortune = generateFortuneDescription(fourImage, matchResult);
317
+ return {
318
+ palace,
319
+ skyTrigram,
320
+ earthTrigram,
321
+ fourImage,
322
+ matchResult,
323
+ fortune
324
+ };
325
+ }
326
+ function getTrigramChineseName(trigram) {
327
+ return TRIGRAM_PROPERTIES[trigram].chineseName;
328
+ }
329
+ function getPalaceChineseName(palace) {
330
+ const names = {
331
+ [1 /* Kan */]: "\u574E\u5BAB\uFF08\u6B63\u5317\uFF09",
332
+ [2 /* Kun */]: "\u5764\u5BAB\uFF08\u897F\u5357\uFF09",
333
+ [3 /* Zhen */]: "\u9707\u5BAB\uFF08\u6B63\u4E1C\uFF09",
334
+ [4 /* Xun */]: "\u5DFD\u5BAB\uFF08\u4E1C\u5357\uFF09",
335
+ [5 /* Center */]: "\u4E2D\u5BAB\uFF08\u4E2D\u592E\uFF09",
336
+ [6 /* Qian */]: "\u4E7E\u5BAB\uFF08\u897F\u5317\uFF09",
337
+ [7 /* Dui */]: "\u5151\u5BAB\uFF08\u6B63\u897F\uFF09",
338
+ [8 /* Gen */]: "\u826E\u5BAB\uFF08\u4E1C\u5317\uFF09",
339
+ [9 /* Li */]: "\u79BB\u5BAB\uFF08\u6B63\u5357\uFF09"
340
+ };
341
+ return names[palace];
342
+ }
343
+
344
+ // src/xiaochengtu.ts
345
+ var XiaoChengTu = class _XiaoChengTu {
346
+ /**
347
+ * 使用卦象初始化
348
+ * @param input - 本卦和变卦
349
+ */
350
+ constructor(input) {
351
+ this.result = null;
352
+ this.baseHexagram = input.baseHexagram;
353
+ this.changedHexagram = input.changedHexagram;
354
+ this.baseMutualHexagram = generateMutualHexagram(this.baseHexagram);
355
+ this.changedMutualHexagram = generateMutualHexagram(this.changedHexagram);
356
+ this.centerTrigram = calculateCenterPalace(
357
+ this.baseHexagram,
358
+ this.changedHexagram
359
+ );
360
+ }
361
+ /**
362
+ * 从数字创建小成图实例
363
+ * Create XiaoChengTu instance from numbers
364
+ * @param input - 数字起卦参数
365
+ * @returns XiaoChengTu 实例
366
+ */
367
+ static fromNumbers(input) {
368
+ return new _XiaoChengTu({
369
+ baseHexagram: {
370
+ upper: numberToTrigram(input.baseUpper),
371
+ lower: numberToTrigram(input.baseLower)
372
+ },
373
+ changedHexagram: {
374
+ upper: numberToTrigram(input.changedUpper),
375
+ lower: numberToTrigram(input.changedLower)
376
+ }
377
+ });
378
+ }
379
+ /**
380
+ * 随机起卦
381
+ * Generate random divination
382
+ * @returns XiaoChengTu 实例
383
+ */
384
+ static random() {
385
+ const randomNum = () => Math.floor(Math.random() * 8) + 1;
386
+ return _XiaoChengTu.fromNumbers({
387
+ baseUpper: randomNum(),
388
+ baseLower: randomNum(),
389
+ changedUpper: randomNum(),
390
+ changedLower: randomNum()
391
+ });
392
+ }
393
+ /**
394
+ * 时间起卦
395
+ * Generate divination from current time
396
+ * @param date - 可选,指定时间。默认使用当前时间
397
+ * @returns XiaoChengTu 实例
398
+ */
399
+ static fromTime(date) {
400
+ const d = date || /* @__PURE__ */ new Date();
401
+ const year = d.getFullYear();
402
+ const month = d.getMonth() + 1;
403
+ const day = d.getDate();
404
+ const hour = d.getHours();
405
+ const minute = d.getMinutes();
406
+ const second = d.getSeconds();
407
+ return _XiaoChengTu.fromNumbers({
408
+ baseUpper: (year + month) % 8 || 8,
409
+ baseLower: (day + hour) % 8 || 8,
410
+ changedUpper: (minute + second) % 8 || 8,
411
+ changedLower: (year + month + day + hour + minute + second) % 8 || 8
412
+ });
413
+ }
414
+ /**
415
+ * 执行排盘
416
+ * Execute divination and generate result
417
+ * @returns 排盘结果
418
+ */
419
+ divine() {
420
+ if (this.result) return this.result;
421
+ const board = buildSkyBoard(
422
+ this.baseHexagram,
423
+ this.changedHexagram,
424
+ this.baseMutualHexagram,
425
+ this.changedMutualHexagram,
426
+ this.centerTrigram
427
+ );
428
+ const palaceAnalyses = [
429
+ analyzePalace(1 /* Kan */, board.grid1),
430
+ analyzePalace(2 /* Kun */, board.grid2),
431
+ analyzePalace(3 /* Zhen */, board.grid3),
432
+ analyzePalace(4 /* Xun */, board.grid4),
433
+ analyzePalace(5 /* Center */, board.grid5),
434
+ analyzePalace(6 /* Qian */, board.grid6),
435
+ analyzePalace(7 /* Dui */, board.grid7),
436
+ analyzePalace(8 /* Gen */, board.grid8),
437
+ analyzePalace(9 /* Li */, board.grid9)
438
+ ];
439
+ this.result = {
440
+ baseHexagram: this.baseHexagram,
441
+ changedHexagram: this.changedHexagram,
442
+ baseMutualHexagram: this.baseMutualHexagram,
443
+ changedMutualHexagram: this.changedMutualHexagram,
444
+ board,
445
+ palaceAnalyses
446
+ };
447
+ return this.result;
448
+ }
449
+ /**
450
+ * 获取指定宫位的分析结果
451
+ * Get analysis result for specific palace
452
+ * @param palace - 宫位
453
+ * @returns 宫位分析结果
454
+ */
455
+ getPalaceAnalysis(palace) {
456
+ const result = this.divine();
457
+ return result.palaceAnalyses.find((p) => p.palace === palace);
458
+ }
459
+ /**
460
+ * 输出盘面字符串(用于调试)
461
+ * Output board as string (for debugging)
462
+ * @returns 盘面字符串
463
+ */
464
+ toString() {
465
+ const result = this.divine();
466
+ const lines = [];
467
+ lines.push("=".repeat(40));
468
+ lines.push("\u5C0F\u6210\u56FE\u6392\u76D8\u7ED3\u679C");
469
+ lines.push("=".repeat(40));
470
+ lines.push(
471
+ `\u672C\u5366: ${getTrigramChineseName(result.baseHexagram.upper)}${getTrigramChineseName(result.baseHexagram.lower)}`
472
+ );
473
+ lines.push(
474
+ `\u53D8\u5366: ${getTrigramChineseName(result.changedHexagram.upper)}${getTrigramChineseName(result.changedHexagram.lower)}`
475
+ );
476
+ lines.push(
477
+ `\u672C\u4E92\u5366: ${getTrigramChineseName(result.baseMutualHexagram.upper)}${getTrigramChineseName(result.baseMutualHexagram.lower)}`
478
+ );
479
+ lines.push(
480
+ `\u53D8\u4E92\u5366: ${getTrigramChineseName(result.changedMutualHexagram.upper)}${getTrigramChineseName(result.changedMutualHexagram.lower)}`
481
+ );
482
+ lines.push("");
483
+ lines.push("\u4E5D\u5BAB\u5E03\u5C40:");
484
+ lines.push("-".repeat(40));
485
+ const g = result.board;
486
+ lines.push(
487
+ `| ${getTrigramChineseName(g.grid4).padEnd(4)} | ${getTrigramChineseName(g.grid9).padEnd(4)} | ${getTrigramChineseName(g.grid2).padEnd(4)} |`
488
+ );
489
+ lines.push(
490
+ `| \u5DFD${" ".repeat(3)} | \u79BB${" ".repeat(3)} | \u5764${" ".repeat(3)} |`
491
+ );
492
+ lines.push("-".repeat(40));
493
+ lines.push(
494
+ `| ${getTrigramChineseName(g.grid3).padEnd(4)} | ${getTrigramChineseName(g.grid5).padEnd(4)} | ${getTrigramChineseName(g.grid7).padEnd(4)} |`
495
+ );
496
+ lines.push(
497
+ `| \u9707${" ".repeat(3)} | \u4E2D${" ".repeat(3)} | \u5151${" ".repeat(3)} |`
498
+ );
499
+ lines.push("-".repeat(40));
500
+ lines.push(
501
+ `| ${getTrigramChineseName(g.grid8).padEnd(4)} | ${getTrigramChineseName(g.grid1).padEnd(4)} | ${getTrigramChineseName(g.grid6).padEnd(4)} |`
502
+ );
503
+ lines.push(
504
+ `| \u826E${" ".repeat(3)} | \u574E${" ".repeat(3)} | \u4E7E${" ".repeat(3)} |`
505
+ );
506
+ lines.push("-".repeat(40));
507
+ lines.push("");
508
+ lines.push("\u5404\u5BAB\u5206\u6790:");
509
+ for (const analysis of result.palaceAnalyses) {
510
+ lines.push(
511
+ `${getPalaceChineseName(analysis.palace)}: \u5929\u76D8${getTrigramChineseName(analysis.skyTrigram)} \u5730\u76D8${getTrigramChineseName(analysis.earthTrigram)} \u2192 ${analysis.fortune}`
512
+ );
513
+ }
514
+ return lines.join("\n");
515
+ }
516
+ };
517
+
518
+ export { BINARY_TO_TRIGRAM, DynamicProperty, FourImages, MatchResult, NUMBER_TO_TRIGRAM, OPPOSITE_HEXAGRAMS, PALACE_TO_EARTH_TRIGRAM, Palace, TRIGRAM_BINARY_CORRECT, TRIGRAM_PROPERTIES, Trigram, WuXing, XiaoChengTu, YinYang, analyzePalace, buildSkyBoard, calculateCenterPalace, calculateFourImages, calculateMatchResult, generateFortuneDescription, generateMutualHexagram, getPalaceChineseName, getTrigramChineseName, guiCangAlgorithm, isOppositeHexagram, isPureHexagram, numberToTrigram };
519
+ //# sourceMappingURL=index.mjs.map
520
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts","../src/constants.ts","../src/utils.ts","../src/xiaochengtu.ts"],"names":["Trigram","WuXing","YinYang","DynamicProperty","FourImages","MatchResult","Palace"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * 八卦枚举\n * Bagua (Eight Trigrams) enumeration\n */\nexport enum Trigram {\n /** 乾 - Heaven */\n Qian = 'qian',\n /** 兑 - Lake */\n Dui = 'dui',\n /** 离 - Fire */\n Li = 'li',\n /** 震 - Thunder */\n Zhen = 'zhen',\n /** 巽 - Wind */\n Xun = 'xun',\n /** 坎 - Water */\n Kan = 'kan',\n /** 艮 - Mountain */\n Gen = 'gen',\n /** 坤 - Earth */\n Kun = 'kun',\n}\n\n/**\n * 五行枚举\n * Wu Xing (Five Elements) enumeration\n */\nexport enum WuXing {\n /** 金 - Metal */\n Metal = 'metal',\n /** 木 - Wood */\n Wood = 'wood',\n /** 水 - Water */\n Water = 'water',\n /** 火 - Fire */\n Fire = 'fire',\n /** 土 - Earth */\n Earth = 'earth',\n}\n\n/**\n * 阴阳枚举\n * Yin-Yang enumeration\n */\nexport enum YinYang {\n /** 阳 */\n Yang = 'yang',\n /** 阴 */\n Yin = 'yin',\n}\n\n/**\n * 动态属性(升/降)\n * Dynamic property (Rising/Falling)\n */\nexport enum DynamicProperty {\n /** 升 - 外引 (Rising/Outward) */\n Rising = 'rising',\n /** 降 - 内引 (Falling/Inward) */\n Falling = 'falling',\n}\n\n/**\n * 四象类型\n * Four Images type\n */\nexport enum FourImages {\n /** 阖 - 向心/凝聚 */\n He = 'he',\n /** 辟 - 离心/发散 */\n Pi = 'pi',\n /** 往 - 外引 */\n Wang = 'wang',\n /** 来 - 内引 */\n Lai = 'lai',\n}\n\n/**\n * 配对结果\n * Matching result\n */\nexport enum MatchResult {\n /** 得配 - 吉 */\n Match = 'match',\n /** 失配 - 凶 */\n Mismatch = 'mismatch',\n}\n\n/**\n * 九宫位置\n * Nine Palace positions\n */\nexport enum Palace {\n /** 坎宫 - 正北 */\n Kan = 1,\n /** 坤宫 - 西南 */\n Kun = 2,\n /** 震宫 - 正东 */\n Zhen = 3,\n /** 巽宫 - 东南 */\n Xun = 4,\n /** 中宫 - 中央 */\n Center = 5,\n /** 乾宫 - 西北 */\n Qian = 6,\n /** 兑宫 - 正西 */\n Dui = 7,\n /** 艮宫 - 东北 */\n Gen = 8,\n /** 离宫 - 正南 */\n Li = 9,\n}\n\n/**\n * 八卦属性\n * Trigram properties\n */\nexport interface TrigramProperties {\n /** 卦名 */\n name: string\n /** 中文名 */\n chineseName: string\n /** 先天数 */\n priorHeavenNumber: number\n /** 五行 */\n wuXing: WuXing\n /** 阴阳 */\n yinYang: YinYang\n /** 动态属性 */\n dynamicProperty: DynamicProperty\n /** 对应地盘宫位 */\n palacePosition: Palace\n}\n\n/**\n * 六十四卦(重卦)\n * Hexagram (64 hexagrams)\n */\nexport interface Hexagram {\n /** 上卦 */\n upper: Trigram\n /** 下卦 */\n lower: Trigram\n}\n\n/**\n * 九宫盘面\n * Nine Palace board\n */\nexport interface NinePalaceBoard {\n /** Grid1 - 坎宫 */\n grid1: Trigram\n /** Grid2 - 坤宫 */\n grid2: Trigram\n /** Grid3 - 震宫 */\n grid3: Trigram\n /** Grid4 - 巽宫 */\n grid4: Trigram\n /** Grid5 - 中宫 */\n grid5: Trigram\n /** Grid6 - 乾宫 */\n grid6: Trigram\n /** Grid7 - 兑宫 */\n grid7: Trigram\n /** Grid8 - 艮宫 */\n grid8: Trigram\n /** Grid9 - 离宫 */\n grid9: Trigram\n}\n\n/**\n * 单宫分析结果\n * Single palace analysis result\n */\nexport interface PalaceAnalysis {\n /** 宫位 */\n palace: Palace\n /** 天盘卦 */\n skyTrigram: Trigram\n /** 地盘卦 */\n earthTrigram: Trigram\n /** 四象 */\n fourImage: FourImages\n /** 配对结果 */\n matchResult: MatchResult\n /** 综合吉凶描述 */\n fortune: string\n}\n\n/**\n * 完整排盘结果\n * Complete divination result\n */\nexport interface XiaoChengTuResult {\n /** 本卦 */\n baseHexagram: Hexagram\n /** 变卦 */\n changedHexagram: Hexagram\n /** 本卦互卦 */\n baseMutualHexagram: Hexagram\n /** 变卦互卦 */\n changedMutualHexagram: Hexagram\n /** 九宫天盘 */\n board: NinePalaceBoard\n /** 各宫分析 */\n palaceAnalyses: PalaceAnalysis[]\n}\n","import {\n Trigram,\n WuXing,\n YinYang,\n DynamicProperty,\n Palace,\n TrigramProperties,\n} from './types'\n\n/**\n * 八卦属性表\n * Trigram properties lookup table\n */\nexport const TRIGRAM_PROPERTIES: Record<Trigram, TrigramProperties> = {\n [Trigram.Qian]: {\n name: 'Qian',\n chineseName: '乾',\n priorHeavenNumber: 1,\n wuXing: WuXing.Metal,\n yinYang: YinYang.Yang,\n dynamicProperty: DynamicProperty.Rising,\n palacePosition: Palace.Qian,\n },\n [Trigram.Dui]: {\n name: 'Dui',\n chineseName: '兑',\n priorHeavenNumber: 2,\n wuXing: WuXing.Metal,\n yinYang: YinYang.Yin,\n dynamicProperty: DynamicProperty.Falling,\n palacePosition: Palace.Dui,\n },\n [Trigram.Li]: {\n name: 'Li',\n chineseName: '离',\n priorHeavenNumber: 3,\n wuXing: WuXing.Fire,\n yinYang: YinYang.Yin,\n dynamicProperty: DynamicProperty.Falling,\n palacePosition: Palace.Li,\n },\n [Trigram.Zhen]: {\n name: 'Zhen',\n chineseName: '震',\n priorHeavenNumber: 4,\n wuXing: WuXing.Wood,\n yinYang: YinYang.Yang,\n dynamicProperty: DynamicProperty.Rising,\n palacePosition: Palace.Zhen,\n },\n [Trigram.Xun]: {\n name: 'Xun',\n chineseName: '巽',\n priorHeavenNumber: 5,\n wuXing: WuXing.Wood,\n yinYang: YinYang.Yin,\n dynamicProperty: DynamicProperty.Falling,\n palacePosition: Palace.Xun,\n },\n [Trigram.Kan]: {\n name: 'Kan',\n chineseName: '坎',\n priorHeavenNumber: 6,\n wuXing: WuXing.Water,\n yinYang: YinYang.Yang,\n dynamicProperty: DynamicProperty.Rising,\n palacePosition: Palace.Kan,\n },\n [Trigram.Gen]: {\n name: 'Gen',\n chineseName: '艮',\n priorHeavenNumber: 7,\n wuXing: WuXing.Earth,\n yinYang: YinYang.Yang,\n dynamicProperty: DynamicProperty.Rising,\n palacePosition: Palace.Gen,\n },\n [Trigram.Kun]: {\n name: 'Kun',\n chineseName: '坤',\n priorHeavenNumber: 8,\n wuXing: WuXing.Earth,\n yinYang: YinYang.Yin,\n dynamicProperty: DynamicProperty.Falling,\n palacePosition: Palace.Kun,\n },\n}\n\n/**\n * 先天数到八卦的映射\n * Prior Heaven number to Trigram mapping\n */\nexport const NUMBER_TO_TRIGRAM: Record<number, Trigram> = {\n 1: Trigram.Qian,\n 2: Trigram.Dui,\n 3: Trigram.Li,\n 4: Trigram.Zhen,\n 5: Trigram.Xun,\n 6: Trigram.Kan,\n 7: Trigram.Gen,\n 8: Trigram.Kun,\n}\n\n/**\n * 宫位到地盘八卦的映射\n * Palace to Earth trigram mapping\n */\nexport const PALACE_TO_EARTH_TRIGRAM: Record<Palace, Trigram> = {\n [Palace.Kan]: Trigram.Kan,\n [Palace.Kun]: Trigram.Kun,\n [Palace.Zhen]: Trigram.Zhen,\n [Palace.Xun]: Trigram.Xun,\n [Palace.Center]: Trigram.Kun, // 中宫无固定地盘,默认坤\n [Palace.Qian]: Trigram.Qian,\n [Palace.Dui]: Trigram.Dui,\n [Palace.Gen]: Trigram.Gen,\n [Palace.Li]: Trigram.Li,\n}\n\n/**\n * 八卦二进制表示(用于归藏算法)\n * Trigram binary representation (for Guicang algorithm)\n * 阳爻 = 1, 阴爻 = 0\n */\nexport const TRIGRAM_BINARY: Record<Trigram, [number, number, number]> = {\n [Trigram.Qian]: [1, 1, 1], // ☰\n [Trigram.Dui]: [1, 1, 0], // ☱\n [Trigram.Li]: [1, 0, 1], // ☲\n [Trigram.Zhen]: [0, 0, 1], // ☳\n [Trigram.Xun]: [1, 1, 0], // ☴ (注意:巽卦二进制 110)\n [Trigram.Kan]: [0, 1, 0], // ☵\n [Trigram.Gen]: [1, 0, 0], // ☶\n [Trigram.Kun]: [0, 0, 0], // ☷\n}\n\n// 修正巽卦的二进制表示\n// 巽 ☴ = 初爻阳、中爻阳、上爻阴 = [1, 1, 0]\n// 但根据标准易学:巽 = 初爻阴、中爻阳、上爻阳 = [0, 1, 1]\n// 以下是正确的二进制表示\nexport const TRIGRAM_BINARY_CORRECT: Record<Trigram, [number, number, number]> =\n{\n [Trigram.Qian]: [1, 1, 1], // ☰ 乾:三阳\n [Trigram.Dui]: [0, 1, 1], // ☱ 兑:上阴中阳下阳\n [Trigram.Li]: [1, 0, 1], // ☲ 离:上阳中阴下阳\n [Trigram.Zhen]: [1, 0, 0], // ☳ 震:上阳中阴下阴\n [Trigram.Xun]: [0, 1, 1], // ☴ 巽:上阴中阳下阳(与兑相同?需核实)\n [Trigram.Kan]: [0, 1, 0], // ☵ 坎:上阴中阳下阴\n [Trigram.Gen]: [0, 0, 1], // ☶ 艮:上阴中阴下阳\n [Trigram.Kun]: [0, 0, 0], // ☷ 坤:三阴\n}\n\n/**\n * 从二进制转换到八卦\n * Binary to Trigram conversion\n */\nexport const BINARY_TO_TRIGRAM: Record<string, Trigram> = {\n '111': Trigram.Qian,\n '011': Trigram.Dui,\n '101': Trigram.Li,\n '100': Trigram.Zhen,\n '110': Trigram.Xun,\n '010': Trigram.Kan,\n '001': Trigram.Gen,\n '000': Trigram.Kun,\n}\n\n/**\n * 同位异性卦列表(用于定中宫判断)\n * Same position, opposite nature hexagrams\n */\nexport const OPPOSITE_HEXAGRAMS: Array<{\n upper: Trigram\n lower: Trigram\n name: string\n}> = [\n { upper: Trigram.Qian, lower: Trigram.Kun, name: '天地否' },\n { upper: Trigram.Kun, lower: Trigram.Qian, name: '地天泰' },\n { upper: Trigram.Kan, lower: Trigram.Li, name: '水火既济' },\n { upper: Trigram.Li, lower: Trigram.Kan, name: '火水未济' },\n { upper: Trigram.Gen, lower: Trigram.Dui, name: '山泽损' },\n { upper: Trigram.Dui, lower: Trigram.Gen, name: '泽山咸' },\n { upper: Trigram.Zhen, lower: Trigram.Xun, name: '雷风恒' },\n { upper: Trigram.Xun, lower: Trigram.Zhen, name: '风雷益' },\n ]\n","import {\n Trigram,\n Hexagram,\n FourImages,\n MatchResult,\n DynamicProperty,\n YinYang,\n NinePalaceBoard,\n PalaceAnalysis,\n Palace,\n} from './types'\nimport {\n TRIGRAM_PROPERTIES,\n NUMBER_TO_TRIGRAM,\n BINARY_TO_TRIGRAM,\n TRIGRAM_BINARY_CORRECT,\n OPPOSITE_HEXAGRAMS,\n PALACE_TO_EARTH_TRIGRAM,\n} from './constants'\n\n/**\n * 数字取余转换为八卦\n * Convert number to trigram (with modulo 8)\n * @param num - 输入数字\n * @returns 对应的八卦\n */\nexport function numberToTrigram(num: number): Trigram {\n let n = num % 8\n if (n === 0) n = 8\n return NUMBER_TO_TRIGRAM[n]\n}\n\n/**\n * 生成互卦\n * Generate mutual hexagram from a hexagram\n * 互卦:取原卦的 3-5 爻为上卦,2-4 爻为下卦\n * @param hexagram - 原卦\n * @returns 互卦\n */\nexport function generateMutualHexagram(hexagram: Hexagram): Hexagram {\n const upperBinary = TRIGRAM_BINARY_CORRECT[hexagram.upper]\n const lowerBinary = TRIGRAM_BINARY_CORRECT[hexagram.lower]\n\n // 合并为六爻 [下1, 下2, 下3, 上1, 上2, 上3]\n const sixYao = [...lowerBinary, ...upperBinary]\n\n // 互卦上卦 = 3-5爻 = sixYao[2], sixYao[3], sixYao[4]\n const mutualUpperBinary = `${sixYao[2]}${sixYao[3]}${sixYao[4]}`\n // 互卦下卦 = 2-4爻 = sixYao[1], sixYao[2], sixYao[3]\n const mutualLowerBinary = `${sixYao[1]}${sixYao[2]}${sixYao[3]}`\n\n return {\n upper: BINARY_TO_TRIGRAM[mutualUpperBinary],\n lower: BINARY_TO_TRIGRAM[mutualLowerBinary],\n }\n}\n\n/**\n * 判断是否为八纯卦\n * Check if hexagram is pure (upper = lower)\n * @param hexagram - 卦象\n * @returns 是否为八纯卦\n */\nexport function isPureHexagram(hexagram: Hexagram): boolean {\n return hexagram.upper === hexagram.lower\n}\n\n/**\n * 判断是否为同位异性卦\n * Check if hexagram is an opposite-nature hexagram\n * @param hexagram - 卦象\n * @returns 是否为同位异性卦\n */\nexport function isOppositeHexagram(hexagram: Hexagram): boolean {\n return OPPOSITE_HEXAGRAMS.some(\n (h) => h.upper === hexagram.upper && h.lower === hexagram.lower\n )\n}\n\n/**\n * 归藏算法计算中宫\n * Guicang algorithm for center palace calculation\n * 同性为阴,异性为阳\n * @param upper - 上卦\n * @param lower - 下卦\n * @returns 归藏结果卦\n */\nexport function guiCangAlgorithm(upper: Trigram, lower: Trigram): Trigram {\n const upperBinary = TRIGRAM_BINARY_CORRECT[upper]\n const lowerBinary = TRIGRAM_BINARY_CORRECT[lower]\n\n // XOR 变体:同性为阴(0),异性为阳(1)\n const resultBinary = upperBinary.map((u, i) => (u === lowerBinary[i] ? 0 : 1))\n const binaryStr = resultBinary.join('')\n\n return BINARY_TO_TRIGRAM[binaryStr]\n}\n\n/**\n * 计算中宫\n * Calculate center palace trigram\n * @param baseHexagram - 本卦\n * @param changedHexagram - 变卦\n * @returns 中宫八卦\n */\nexport function calculateCenterPalace(\n baseHexagram: Hexagram,\n changedHexagram: Hexagram\n): Trigram {\n const fourTrigrams = [\n baseHexagram.upper,\n baseHexagram.lower,\n changedHexagram.upper,\n changedHexagram.lower,\n ]\n\n // 1. 独阴独阳原则\n const qianCount = fourTrigrams.filter((t) => t === Trigram.Qian).length\n const kunCount = fourTrigrams.filter((t) => t === Trigram.Kun).length\n\n if (qianCount === 1) return Trigram.Qian\n if (kunCount === 1) return Trigram.Kun\n\n // 2. 八纯卦原则\n if (isPureHexagram(baseHexagram) || isPureHexagram(changedHexagram)) {\n return Trigram.Kun\n }\n\n // 3. 同位异性原则\n if (isOppositeHexagram(baseHexagram) || isOppositeHexagram(changedHexagram)) {\n return Trigram.Qian\n }\n\n // 4. 归藏法(默认)\n return guiCangAlgorithm(baseHexagram.upper, baseHexagram.lower)\n}\n\n/**\n * 装天盘\n * Build sky palace board\n * @param baseHexagram - 本卦\n * @param changedHexagram - 变卦\n * @param baseMutualHexagram - 本卦互卦\n * @param changedMutualHexagram - 变卦互卦\n * @param centerTrigram - 中宫卦\n * @returns 九宫天盘\n */\nexport function buildSkyBoard(\n baseHexagram: Hexagram,\n changedHexagram: Hexagram,\n baseMutualHexagram: Hexagram,\n changedMutualHexagram: Hexagram,\n centerTrigram: Trigram\n): NinePalaceBoard {\n return {\n grid9: baseHexagram.upper, // 离宫 ← 本卦上卦\n grid1: baseHexagram.lower, // 坎宫 ← 本卦下卦\n grid4: changedHexagram.upper, // 巽宫 ← 变卦上卦\n grid3: changedHexagram.lower, // 震宫 ← 变卦下卦\n grid8: baseMutualHexagram.upper, // 艮宫 ← 本卦互卦上卦\n grid2: baseMutualHexagram.lower, // 坤宫 ← 本卦互卦下卦\n grid6: changedMutualHexagram.upper, // 乾宫 ← 变卦互卦上卦\n grid7: changedMutualHexagram.lower, // 兑宫 ← 变卦互卦下卦\n grid5: centerTrigram, // 中宫\n }\n}\n\n/**\n * 计算四象\n * Calculate four images\n * @param skyTrigram - 天盘卦\n * @param earthTrigram - 地盘卦\n * @returns 四象类型\n */\nexport function calculateFourImages(\n skyTrigram: Trigram,\n earthTrigram: Trigram\n): FourImages {\n const skyProp = TRIGRAM_PROPERTIES[skyTrigram]\n const earthProp = TRIGRAM_PROPERTIES[earthTrigram]\n\n const skyRising = skyProp.dynamicProperty === DynamicProperty.Rising\n const earthRising = earthProp.dynamicProperty === DynamicProperty.Rising\n\n if (!skyRising && earthRising) {\n return FourImages.He // 阖:天降地升\n } else if (skyRising && !earthRising) {\n return FourImages.Pi // 辟:天升地降\n } else if (skyRising && earthRising) {\n return FourImages.Wang // 往:皆升\n } else {\n return FourImages.Lai // 来:皆降\n }\n}\n\n/**\n * 计算配对结果\n * Calculate matching result\n * @param skyTrigram - 天盘卦\n * @param earthTrigram - 地盘卦\n * @returns 配对结果\n */\nexport function calculateMatchResult(\n skyTrigram: Trigram,\n earthTrigram: Trigram\n): MatchResult {\n const skyProp = TRIGRAM_PROPERTIES[skyTrigram]\n const earthProp = TRIGRAM_PROPERTIES[earthTrigram]\n\n // 阴阳不同为得配,相同为失配\n return skyProp.yinYang !== earthProp.yinYang\n ? MatchResult.Match\n : MatchResult.Mismatch\n}\n\n/**\n * 生成吉凶描述\n * Generate fortune description\n * @param fourImage - 四象\n * @param matchResult - 配对结果\n * @returns 吉凶描述\n */\nexport function generateFortuneDescription(\n fourImage: FourImages,\n matchResult: MatchResult\n): string {\n if (fourImage === FourImages.He && matchResult === MatchResult.Match) {\n return '大吉 - 向心且阴阳相吸,事成'\n }\n if (fourImage === FourImages.Pi && matchResult === MatchResult.Mismatch) {\n return '凶 - 离心且阴阳相斥,破裂'\n }\n if (fourImage === FourImages.He && matchResult === MatchResult.Mismatch) {\n return '小凶 - 虽向心但阴阳相斥,难成'\n }\n if (fourImage === FourImages.Pi && matchResult === MatchResult.Match) {\n return '过程曲折 - 虽得配但离心,好聚好散'\n }\n if (fourImage === FourImages.Wang && matchResult === MatchResult.Match) {\n return '吉 - 外引得配,宜外出发展'\n }\n if (fourImage === FourImages.Wang && matchResult === MatchResult.Mismatch) {\n return '凶 - 外引失配,奔波徒劳'\n }\n if (fourImage === FourImages.Lai && matchResult === MatchResult.Match) {\n return '吉 - 内引得配,宜守成'\n }\n if (fourImage === FourImages.Lai && matchResult === MatchResult.Mismatch) {\n return '小凶 - 内引失配,内部不和'\n }\n\n return '待定'\n}\n\n/**\n * 分析单宫\n * Analyze single palace\n * @param palace - 宫位\n * @param skyTrigram - 天盘卦\n * @returns 宫位分析结果\n */\nexport function analyzePalace(\n palace: Palace,\n skyTrigram: Trigram\n): PalaceAnalysis {\n const earthTrigram = PALACE_TO_EARTH_TRIGRAM[palace]\n const fourImage = calculateFourImages(skyTrigram, earthTrigram)\n const matchResult = calculateMatchResult(skyTrigram, earthTrigram)\n const fortune = generateFortuneDescription(fourImage, matchResult)\n\n return {\n palace,\n skyTrigram,\n earthTrigram,\n fourImage,\n matchResult,\n fortune,\n }\n}\n\n/**\n * 获取八卦的中文名称\n * Get Chinese name of trigram\n * @param trigram - 八卦\n * @returns 中文名称\n */\nexport function getTrigramChineseName(trigram: Trigram): string {\n return TRIGRAM_PROPERTIES[trigram].chineseName\n}\n\n/**\n * 获取宫位的中文名称\n * Get Chinese name of palace\n * @param palace - 宫位\n * @returns 中文名称\n */\nexport function getPalaceChineseName(palace: Palace): string {\n const names: Record<Palace, string> = {\n [Palace.Kan]: '坎宫(正北)',\n [Palace.Kun]: '坤宫(西南)',\n [Palace.Zhen]: '震宫(正东)',\n [Palace.Xun]: '巽宫(东南)',\n [Palace.Center]: '中宫(中央)',\n [Palace.Qian]: '乾宫(西北)',\n [Palace.Dui]: '兑宫(正西)',\n [Palace.Gen]: '艮宫(东北)',\n [Palace.Li]: '离宫(正南)',\n }\n return names[palace]\n}\n","import {\n Trigram,\n Hexagram,\n XiaoChengTuResult,\n Palace,\n PalaceAnalysis,\n} from './types'\nimport {\n numberToTrigram,\n generateMutualHexagram,\n calculateCenterPalace,\n buildSkyBoard,\n analyzePalace,\n getTrigramChineseName,\n getPalaceChineseName,\n} from './utils'\n\n/**\n * 小成图排盘输入参数\n */\nexport interface XiaoChengTuInput {\n /** 本卦 */\n baseHexagram: Hexagram\n /** 变卦 */\n changedHexagram: Hexagram\n}\n\n/**\n * 数字起卦输入参数\n */\nexport interface NumberDivinationInput {\n /** 本卦上卦数字 */\n baseUpper: number\n /** 本卦下卦数字 */\n baseLower: number\n /** 变卦上卦数字 */\n changedUpper: number\n /** 变卦下卦数字 */\n changedLower: number\n}\n\n/**\n * 小成图排盘主类\n * XiaoChengTu main class\n */\nexport class XiaoChengTu {\n private baseHexagram: Hexagram\n private changedHexagram: Hexagram\n private baseMutualHexagram: Hexagram\n private changedMutualHexagram: Hexagram\n private centerTrigram: Trigram\n private result: XiaoChengTuResult | null = null\n\n /**\n * 使用卦象初始化\n * @param input - 本卦和变卦\n */\n constructor(input: XiaoChengTuInput) {\n this.baseHexagram = input.baseHexagram\n this.changedHexagram = input.changedHexagram\n this.baseMutualHexagram = generateMutualHexagram(this.baseHexagram)\n this.changedMutualHexagram = generateMutualHexagram(this.changedHexagram)\n this.centerTrigram = calculateCenterPalace(\n this.baseHexagram,\n this.changedHexagram\n )\n }\n\n /**\n * 从数字创建小成图实例\n * Create XiaoChengTu instance from numbers\n * @param input - 数字起卦参数\n * @returns XiaoChengTu 实例\n */\n static fromNumbers(input: NumberDivinationInput): XiaoChengTu {\n return new XiaoChengTu({\n baseHexagram: {\n upper: numberToTrigram(input.baseUpper),\n lower: numberToTrigram(input.baseLower),\n },\n changedHexagram: {\n upper: numberToTrigram(input.changedUpper),\n lower: numberToTrigram(input.changedLower),\n },\n })\n }\n\n /**\n * 随机起卦\n * Generate random divination\n * @returns XiaoChengTu 实例\n */\n static random(): XiaoChengTu {\n const randomNum = () => Math.floor(Math.random() * 8) + 1\n return XiaoChengTu.fromNumbers({\n baseUpper: randomNum(),\n baseLower: randomNum(),\n changedUpper: randomNum(),\n changedLower: randomNum(),\n })\n }\n\n /**\n * 时间起卦\n * Generate divination from current time\n * @param date - 可选,指定时间。默认使用当前时间\n * @returns XiaoChengTu 实例\n */\n static fromTime(date?: Date): XiaoChengTu {\n const d = date || new Date()\n const year = d.getFullYear()\n const month = d.getMonth() + 1\n const day = d.getDate()\n const hour = d.getHours()\n const minute = d.getMinutes()\n const second = d.getSeconds()\n\n return XiaoChengTu.fromNumbers({\n baseUpper: (year + month) % 8 || 8,\n baseLower: (day + hour) % 8 || 8,\n changedUpper: (minute + second) % 8 || 8,\n changedLower: (year + month + day + hour + minute + second) % 8 || 8,\n })\n }\n\n /**\n * 执行排盘\n * Execute divination and generate result\n * @returns 排盘结果\n */\n divine(): XiaoChengTuResult {\n if (this.result) return this.result\n\n const board = buildSkyBoard(\n this.baseHexagram,\n this.changedHexagram,\n this.baseMutualHexagram,\n this.changedMutualHexagram,\n this.centerTrigram\n )\n\n const palaceAnalyses: PalaceAnalysis[] = [\n analyzePalace(Palace.Kan, board.grid1),\n analyzePalace(Palace.Kun, board.grid2),\n analyzePalace(Palace.Zhen, board.grid3),\n analyzePalace(Palace.Xun, board.grid4),\n analyzePalace(Palace.Center, board.grid5),\n analyzePalace(Palace.Qian, board.grid6),\n analyzePalace(Palace.Dui, board.grid7),\n analyzePalace(Palace.Gen, board.grid8),\n analyzePalace(Palace.Li, board.grid9),\n ]\n\n this.result = {\n baseHexagram: this.baseHexagram,\n changedHexagram: this.changedHexagram,\n baseMutualHexagram: this.baseMutualHexagram,\n changedMutualHexagram: this.changedMutualHexagram,\n board,\n palaceAnalyses,\n }\n\n return this.result\n }\n\n /**\n * 获取指定宫位的分析结果\n * Get analysis result for specific palace\n * @param palace - 宫位\n * @returns 宫位分析结果\n */\n getPalaceAnalysis(palace: Palace): PalaceAnalysis | undefined {\n const result = this.divine()\n return result.palaceAnalyses.find((p) => p.palace === palace)\n }\n\n /**\n * 输出盘面字符串(用于调试)\n * Output board as string (for debugging)\n * @returns 盘面字符串\n */\n toString(): string {\n const result = this.divine()\n const lines: string[] = []\n\n lines.push('='.repeat(40))\n lines.push('小成图排盘结果')\n lines.push('='.repeat(40))\n\n lines.push(\n `本卦: ${getTrigramChineseName(result.baseHexagram.upper)}${getTrigramChineseName(result.baseHexagram.lower)}`\n )\n lines.push(\n `变卦: ${getTrigramChineseName(result.changedHexagram.upper)}${getTrigramChineseName(result.changedHexagram.lower)}`\n )\n lines.push(\n `本互卦: ${getTrigramChineseName(result.baseMutualHexagram.upper)}${getTrigramChineseName(result.baseMutualHexagram.lower)}`\n )\n lines.push(\n `变互卦: ${getTrigramChineseName(result.changedMutualHexagram.upper)}${getTrigramChineseName(result.changedMutualHexagram.lower)}`\n )\n\n lines.push('')\n lines.push('九宫布局:')\n lines.push('-'.repeat(40))\n\n // 按九宫格式输出\n const g = result.board\n lines.push(\n `| ${getTrigramChineseName(g.grid4).padEnd(4)} | ${getTrigramChineseName(g.grid9).padEnd(4)} | ${getTrigramChineseName(g.grid2).padEnd(4)} |`\n )\n lines.push(\n `| 巽${' '.repeat(3)} | 离${' '.repeat(3)} | 坤${' '.repeat(3)} |`\n )\n lines.push('-'.repeat(40))\n lines.push(\n `| ${getTrigramChineseName(g.grid3).padEnd(4)} | ${getTrigramChineseName(g.grid5).padEnd(4)} | ${getTrigramChineseName(g.grid7).padEnd(4)} |`\n )\n lines.push(\n `| 震${' '.repeat(3)} | 中${' '.repeat(3)} | 兑${' '.repeat(3)} |`\n )\n lines.push('-'.repeat(40))\n lines.push(\n `| ${getTrigramChineseName(g.grid8).padEnd(4)} | ${getTrigramChineseName(g.grid1).padEnd(4)} | ${getTrigramChineseName(g.grid6).padEnd(4)} |`\n )\n lines.push(\n `| 艮${' '.repeat(3)} | 坎${' '.repeat(3)} | 乾${' '.repeat(3)} |`\n )\n lines.push('-'.repeat(40))\n\n lines.push('')\n lines.push('各宫分析:')\n for (const analysis of result.palaceAnalyses) {\n lines.push(\n `${getPalaceChineseName(analysis.palace)}: 天盘${getTrigramChineseName(analysis.skyTrigram)} 地盘${getTrigramChineseName(analysis.earthTrigram)} → ${analysis.fortune}`\n )\n }\n\n return lines.join('\\n')\n }\n}\n"]}