shu-var

六爻排盤

Usage no npm install needed!

<script type="module">
  import shuVar from 'https://cdn.skypack.dev/shu-var';
</script>

README

六爻裝卦

npm install shu-var
npm install chinese-calendar-indexer

code:

/**
 * 只提供兩種起卦法:按中國北京時間起卦,指定時間及卦象與變爻起卦。
 * 定應期以中國北京時間爲準。
 */
const Prediction = require('shu-var');
const CalendarIndexer = require('chinese-calendar-indexer');

const moment = require('moment-timezone');

const timeZone = 'Asia/Shanghai';
const tiangan = '甲乙丙丁戊己庚辛壬癸';
const dizhi = '子丑寅卯辰巳午未申酉戌亥';
const shu8Map = ['000','111','011','101','001','110','010','100'];
const yaoVarMap = ['100000','000001','000010','000100','001000','010000'];
const shuHourMap = [1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,1];

/*
 * 打印或渲染函數
 * 默認是後臺打印
 */
function display(arg) {
    if(arg!=null) {
        console.log(arg);
    } else {
        console.log();
    }
}


/**
 * 由數取象
 * 這兩個函數只爲研究
 * 查表法最簡單
 */
function getSymbolFromNum (value, bits=3) {
    let base=2;
    let padChar  = '0';
    let modVal = Math.pow(base,bits);
    let mask = modVal-1;
    let n = parseInt(value,10);
    n = (n-1+modVal)%modVal;
    //不適合三進制的太玄經,或因這一步算法是二進制的,進制或可以是2的倍數
    n = n^mask;
    n = parseInt(n.toString(base).padStart(bits,padChar).split('').reverse().join(''),base);
    return n;
}

/**
 * 由象取數
 * 這兩個函數只爲研究
 * 查表法最簡單
 */
function getNumFromSymbol (value, bits=3) {
    let base=2;
    let padChar  = '0';
    let modVal = Math.pow(base,bits);
    let mask = modVal-1;
    let n = parseInt(value.toString(base).padStart(bits,padChar).split('').reverse().join(''),base);
    //不適合三進制的太玄經,或因這一步算法是二進制的,進制或可以是2的倍數
    n = n^mask;
    n = (n+1+modVal)%modVal;
    n = parseInt(n,10);
    return n;
}


/**
 * 以時間起卦取數,取中國北京時間的年月日時的農曆日期,定應期也是以北京時間推算。
 * 根據經驗,以他國時間定卦,似頗不驗。
 */
async function doPredictionByTime(dateObj, memo='備注') {
    let calendarIndexer = new CalendarIndexer();
    let curDate = moment.tz(dateObj, timeZone)
    let lunarData = await calendarIndexer.indexChineseLunar(curDate);
    //console.log(lunarData);
    let shuYear = dizhi.indexOf(lunarData.chineseYear[1])+1;
    let shuMonth = lunarData.lunarMonthDigit;
    let shuDay = lunarData.lunarDayDigit;
    let shuHour = shuHourMap[parseInt(curDate.format('HH'))];
    let yaoTu = shu8Map[(shuYear+shuMonth+shuDay)%8]+ shu8Map[(shuYear+shuMonth+shuDay+shuHour)%8];
    //let yaoVar = 1<<(((((shuYear+shuMonth+shuDay+shuHour)%6)-1)+6)%6);
    let yaoVar = yaoVarMap[((shuYear+shuMonth+shuDay+shuHour)%6)];  //查表最簡單
    //console.log(yaoTu);
    return new Prediction(`北京時間 ${curDate.format()}\n${lunarData.chineseMonth}月${lunarData.chineseDay}日`,yaoTu,yaoVar,memo);
}

/**
 * 指定時間及卦象與變爻起卦
 */
async function doPredictionBySpecify(dateObj, original, mask, memo='備注') {
    let calendarIndexer = new CalendarIndexer();
    let curDate = moment.tz(dateObj, timeZone);
    let lunarData = await calendarIndexer.indexChineseLunar(curDate);
    return new Prediction(`北京時間 ${curDate.format()}\n${lunarData.chineseMonth}月${lunarData.chineseDay}日`,original,mask,memo);
}



(async () => {


    console.log('>>----------');
    let curDate = moment().clone().tz(timeZone);
    let result = await doPredictionByTime(curDate);
    result.getInfo().print(display);

    console.log('>>----------');
    result = await doPredictionBySpecify('2020-05-05','001011','010100');
    result.getInfo().print(display);

    console.log('>>----------');
    result = await doPredictionBySpecify(curDate,'010000','000010','考試');
    result.getInfo().print(display);

    console.log();
    for(let inNum=0; inNum<8; inNum++) {
        let bits = 3;
        let base = 2;
        let padChar = '0';
        console.log(inNum, getSymbolFromNum(inNum).toString(base).padStart(bits,padChar),
            inNum.toString(base).padStart(bits,padChar), getNumFromSymbol(inNum));
    }

})();  //end top async()

output:

>>----------
北京時間 2020-10-28T06:58:05+08:00
丙戌月甲辰日 戌亥空

[ '備注' ]

水澤節䷻ 之 水雷屯䷂

子水兄弟⚋  子水兄弟⚋
戌土官鬼⚊  戌土官鬼⚊
申金父母⚋應 申金父母⚋
丑土官鬼⚋  辰土官鬼⚋
卯木子孫○  寅木子孫⚋
巳火妻財⚊世 子水兄弟⚊
>>----------
北京時間 2020-05-05T00:00:00+08:00
辛巳月戊申日 戌亥空

[ '備注' ]

雷澤歸妹䷵ 之 澤天夬䷪

戌土父母⚋應 未土父母⚋
申金兄弟ㄨ  酉金兄弟⚊
午火官鬼⚊  亥水子孫⚊
丑土父母ㄨ世 辰土父母⚊
卯木妻財⚊  寅木妻財⚊
巳火官鬼⚊  子水子孫⚊
>>----------
北京時間 2020-10-28T06:58:05+08:00
丙戌月甲辰日 戌亥空

[ '考試' ]

水地比䷇ 之 坎爲水䷜

子水妻財⚋應 子水妻財⚋
戌土兄弟⚊  戌土兄弟⚊
申金子孫⚋  申金子孫⚋
卯木官鬼⚋世 午火父母⚋
巳火父母ㄨ  辰土兄弟⚊
未土兄弟⚋  寅木官鬼⚋

0 000 000 0
1 111 001 4
2 011 010 6
3 101 011 2
4 001 100 7
5 110 101 3
6 010 110 5
7 100 111 1