fengshui.js
Version:
javascript lib for fengshui
148 lines (135 loc) • 5.24 kB
JavaScript
var mountains = ['子','癸','丑','艮','寅','甲','卯','乙','辰','巽','巳','丙','午','丁','未','坤','申','庚','酉','辛','戌','乾','亥','壬'];
var yang = ['甲','庚','壬','丙','乾','坤','艮','巽','寅','申','巳','亥'];
var yin = ['辰','戌','丑','未','子','午','卯','酉','癸','丁','乙','辛'];
var tianyuanlong = ['乾','坤','艮','巽','子','午','卯','酉'];
var diyuanlong = ['甲','庚','壬','丙','辰','戌','丑','未'];
var renyuanlong = ['寅','申','巳','亥','癸','丁','乙','辛'];
var number = ['一','二','三','四','五','六','七','八','九'];
var base_pan = [7,2,3,0,4,8,5,6,1];
var mountain_direction = {
'壬':7,'子':7,'癸':7,
'丑':6,'艮':6,'寅':6,
'甲':3,'卯':3,'乙':3,
'辰':0,'巽':0,'巳':0,
'丙':1,'午':1,'丁':1,
'未':2,'坤':2,'申':2,
'庚':5,'酉':5,'辛':5,
'戌':8,'乾':8,'亥':8
};
var direction_mountain = [['辰','巽','巳'],
['丙','午','丁'],
['未','坤','申'],
['甲','卯','乙'],
[],
['庚','酉','辛'],
['丑','艮','寅'],
['壬','子','癸'],
['戌','乾','亥']];
module.exports = {
getMountain: function(degree){
var index = Math.floor((degree + 7.5) % 360 / 15);
return mountains[index];
},
getOppositeMountain: function(mountain){
var index = mountains.indexOf(mountain);
return mountains[(index+12) % 24];
},
getYun: function(year) {
var yun = Math.floor((year - 64) % 180 / 20) + 1;
return yun;
},
getDragon: function(mountain) {
if(tianyuanlong.indexOf(mountain) >= 0){
return 'tian';
}else if(diyuanlong.indexOf(mountain) >= 0){
return 'di';
}else if(renyuanlong.indexOf(mountain) >= 0){
return 'ren';
}
},
getMountainFromDirection: function(direction, dragon){
var mountain = direction_mountain[direction];
for (var index = 0 ; index < mountain.length; index++){
if(module.exports.getDragon(mountain[index]) == dragon){
return mountain[index];
}
}
},
getShunNi: function(mountain, star) {
var dragon = module.exports.getDragon(mountain);
var direction = base_pan[star - 1];
var newMountain = module.exports.getMountainFromDirection(direction, dragon);
if(yang.indexOf(newMountain) >= 0){
return true;
}else{
return false;
}
},
getPan: function(yun, shun_ni) {
var shift = yun - 5;
var pan = base_pan.slice(0);
if(!shun_ni){
pan = pan.reverse();
}
if( shift == 0){
return pan;
}else if(shift < 0) {
var firsthalf = pan.slice(0, Math.abs(shift));
var secondhalf = pan.slice(Math.abs(shift), pan.length);
return secondhalf.concat(firsthalf);
}else {
var firsthalf = pan.slice(0, pan.length - Math.abs(shift));
var secondhalf = pan.slice(pan.length - Math.abs(shift), pan.length);
return secondhalf.concat(firsthalf);
}
},
drawFeiXing: function(svgContainer, yun, shan, xiang, width, height) {
var pan = module.exports.getPan(yun, true);
for(var x = 0; x<=width; x+= width/3){
for(var y =0; y<=height; y+= height/3){
svgContainer.append("rect")
.attr("x", x)
.attr("y", y)
.attr("width", width/3)
.attr("height", height/3)
.attr('fill', 'rgba(0,0,0,0)')
.attr('stroke', 'black')
.attr('stroke-width', 3);
}
}
module.exports.drawPan(svgContainer, pan, false, 36, width/6 - 18, height/6 + 18/2, 'black', width, height);
module.exports.drawShan(svgContainer, shan, pan, width, height);
module.exports.drawXiang(svgContainer, xiang, pan, width, height);
},
drawPan: function(svgContainer, pan, useNumber, fontSize, xOffset, yOffset, color, width, height){
for(var i=0; i<pan.length; i++){
var pos = pan[i];
var x = pos % 3;
var y = Math.floor(pos / 3);
var number = i+1;
if( !useNumber){
number = number[i];
}
svgContainer.append("text")
.text(number)
.attr('x', x * width/3 + xOffset)
.attr('y', y * height/3 + yOffset)
.attr('font-size', fontSize)
.attr('fill', color);
}
},
drawShan: function(svgContainer, shan, pan, width, height) {
var direction = mountain_direction[shan];
var mountain_star = pan.indexOf(direction) + 1;
var shunni = module.exports.getShunNi(shan, mountain_star);
var shan_pan = module.exports.getPan(mountain_star, shunni);
module.exports.drawPan(svgContainer, shan_pan, true, 28, width/12, height/12, 'black', width, height);
},
drawXiang: function(svgContainer, xiang, pan, width, height) {
var direction = mountain_direction[xiang];
var face_star = pan.indexOf(direction) + 1;
var shunni = module.exports.getShunNi(xiang, face_star);
var xiang_pan = module.exports.getPan(face_star, shunni);
module.exports.drawPan(svgContainer, xiang_pan, true, 28,width *0.25 - 18/2, height/12, 'black', width, height);
}
};