`

[EasyTao(道)系列文章之一]太极之道

阅读更多

综述

周易是中国传统文化的基石. 涵盖了包括哲学在内的多个学科. 对于周易的理解, 可谓见仁见智. 在最近一个项目中需要使用农历, 并进行简单的五行关系比较. 我上网找了一下, 这方面的资料很多, 道理也不复杂, 但是真正可以使用的类库却完全没有. 所以我打算把自己建立的类库共享出来, 使其他人不需要做相同的重复劳动.

本人并非专门研究周易, 甚至还算不上易学爱好者. 只是在日常生活中偶有接触, 感概于其精妙. 本系列文章与周易等哲学和无直接关系, 这里只是粗浅地使用计算机语言(Java)来对周易中一些概念进行建模, 以其能复用于不同项目中.

 

太极

周易之中, 万象均始于太极(道生一,一生万物). 故先定义接口太极(Taiji). 由于万象均有其名称及其它属性, 为了便于计算机理解, 这里为万物定义一个值(value)属性,该属性是万物在特定领域的一个特征值. 另外再定义一个属性(name)用于表示对象的标识, 使得人可以易于理解计算机所表达.

/**
 * <B>Taiji</B>
 *  太极.万象均循此道.
 * 
 */
public interface Taiji {

    public String getName();

    public int getValue();

}

/**
 * <B>AbstractTaiji</B>
 * 太极的抽象实现*/
public abstract class AbstractTaiji implements Taiji {
    protected int value;
    protected String name;
    
    protected AbstractTaiji(int value,String name) {
        this.value = value;
        this.name = name;
    }
    
    @Override
    public String getName(){
        return name;
    }
    
    @Override
    public int getValue(){
        return value;
    }
    @Override
    public String toString() {
        return name;
    }
    @Override
    public boolean equals(Object other) {
        if (other == null) {
            return false;
        }
        if (other instanceof AbstractTaiji) {
            return ((AbstractTaiji) other).value == value;
        }
        return false;
    }
    @Override
    public int hashCode() {
        return ((Integer)value).hashCode();
    }
}

易有太极,是生两仪. 有了太极,接下来就要定义两仪.两仪也就是阴阳, <<素问>>曰:" 阴阳者,天地之道也,万物之纲纪,变化之父母". 两仪变化生四象. 四象由两仪变化而来, 为了方便, 这里直接定义四象, 而不单独定义两仪. 

/**
 * <B>FourQuadrant</B>
 * 四象
*/
public class FourQuadrant extends AbstractTaiji{
    /**  少阳 */
    public static final int SHAO_YANG = 0;
    /** 少阴*/
    public static  final int SHAO_YIN = 1;
    /** 太阳  */
    public static  final int TAI_YANG = 2;
    /** 太阴 */
    public static  final int TAI_YIN = 3;
        
    private static final String[] QUADRANT_NAMES=new String[]{
        LiuyaoStringSymbol.FourQuadrant_SHAO_YANG,
        LiuyaoStringSymbol.FourQuadrant_SHAO_YIN,
        LiuyaoStringSymbol.FourQuadrant_TAI_YANG,
        LiuyaoStringSymbol.FourQuadrant_TAI_YIN
    };
    
    public static FourQuadrant getFourQuadrant(int value) {
        return create(value);
    }

    public static FourQuadrant[] getFourQuadrant() {
        FourQuadrant[] fourQuadrants=new FourQuadrant[4];
        for(int i=0;i<4;i++){
            fourQuadrants[i] =create(i);
        }
        return fourQuadrants;
    }
    
    private static FourQuadrant create(int value) {
        return new FourQuadrant(value, QUADRANT_NAMES[value%4]);
    }

    private FourQuadrant(int v, String name) {
        super(v, name);
    }
    
    @Override
    public boolean equals(Object obj) {
        if (super.equals(obj) && (obj instanceof FourQuadrant)) {
            return true;
        }
        return false;
    }

    /** 老阳动化为少阳 */
    public FourQuadrant toTwoForms() {
        if (value == TAI_YANG) {
            return getFourQuadrant(SHAO_YANG);
        } else if (value == TAI_YIN){
            return getFourQuadrant(SHAO_YIN);
        } else if (value == SHAO_YANG || value == SHAO_YIN) {
            return this;
        } else {
            return null;
        }
    }


    /** 返回变爻:阳动返回少阴 */
    public FourQuadrant getChanged() {//FIXME
        if(value ==TAI_YANG){
            return getFourQuadrant(SHAO_YIN);
        }
        if (value == TAI_YIN) {
            return getFourQuadrant(SHAO_YANG);
        }
        return new FourQuadrant(value, name);
    }
    /** 动: 阴变阴动;阳变阳动 */
    public void activate(){
        changeValue(value%2+2);
    }


    private void changeValue(int newValue) {
        this.value=newValue;
        this.name = QUADRANT_NAMES[newValue];
    }

    /**  阳转为阴,阴转为阳     */
    public FourQuadrant reverse() {
        if(isChanged()){
            throw new IllegalArgumentException();
        }
        return getFourQuadrant((value+1)%2);
    }

    /** 是否为老阳O 老阴X */
    public boolean isChanged() {
        return (value==TAI_YANG ||value==TAI_YIN);
    }
}

 

 

这里为什么不定义为枚举(enum)类?

这主要考虑古人对概念的抽象性过高. 比如阴阳或后面要说的五行, 其字面意义看起来比较简单, 但在现实中,不同领域的应用却又有不同属性. 比如五行在中医里面所代表的事物和天文学甚至预测学中的意义是相差很大的. 我们知道Java的enum类不支持继承,若将这些基本属性定义为枚举类, 会带来一些重复工作. 所以为了简便起见, 这里不使用枚举类.

 

四象定义好了, 接下来要定义万物了. 万物都离不开道的原始属性, 却又有其自身特有的属性. 万物之间又有各种各样的联系,我们无法一一将其列举.为了简单地表示万物之间的关系, 古人将世间事物分为五种(五行),即金木水火土. 并用五行之间的相生相克的关系来解释事物之间的关系. 五行的定义和四象基本一样, 代码也几乎完全重复, 但这里又不得不将其区分出来. 

/**
 * <B>FiveElements</B>
 * 五行
 */
public class FiveElements extends AbstractTaiji {
    public static final int GOLD=0;
    public static final int WATER=1;
    public static final int WOOD=2;
    public static final int FIRE=3;
    public static final int SOIL=4;
    
    private static final String[] ELEMENTS_NAMES=new String[]{
        LiuyaoStringSymbol.FIVE_ELEMENT_GOLD,
        LiuyaoStringSymbol.FIVE_ELEMENT_WATER,
        LiuyaoStringSymbol.FIVE_ELEMENT_WOOD,
        LiuyaoStringSymbol.FIVE_ELEMENT_FIRE,
        LiuyaoStringSymbol.FIVE_ELEMENT_SOIL
    };
    public static FiveElements getElement(int value) {
        return create(value);
    }
    private static FiveElements create(int value) {
        return new FiveElements(value, ELEMENTS_NAMES[value%4]);
    }
    
    /** 相生 */
    public static final int Generate = 1<<1;
    /** 相克 */
    public static final int Restricte = 1<<2;
    
    private FiveElements(int v, String name) {
        super(v, name);
    }

    /***/
    public boolean isGenerate(FiveElements other) {
        return (value + 1) % 5 == other.value;
    }

    /***/
    public boolean isRestricte(FiveElements other) {
        return (value + 2) % 5 == other.value;
    }
}

五行还可以再细分. 比如黄历中使用的五行和周易其它分支使用的五行有所不同, 这时可以按照自己的需要定义五行的具体类. 这里, 如果金木水火土各有其明确且不同的定义,也可以将其作为五行的子类来定义 . 如果具体的五行实现类之间又有复杂的关系, 不推荐将这些关系定义到具体的五行类里面(会使类变得臃肿且难以复用), 这里可以另外定义一个工具类来计算之间的关系. 如下图

 五行子类定义示意图

 

 

下一篇 天干与地支

1
14
分享到:
评论
5 楼 c.zhiwu 2012-07-22  
BEA 写道
我想你大概没有明白五行的意思,五行就是指金木水火土,同时还有相生相克的关系,至于黄历中使用的五行和周易其它分支使用的五行只是在这基础上加些专业的东西,比如中医就是加了相乘、相侮、制化、胜复等。

我同意你的说法, 但是这和你所说的"我想你大概没有明白五行的意思"有什么关系呢? 是我哪里理解错误了? 还是其它原因?
4 楼 c.zhiwu 2012-07-22  
BEA 写道
    public static final int SHAO_YANG = 0;
    /** 少阴*/
    public static  final int SHAO_YIN = 1;
    /** 太阳  */
    public static  final int TAI_YANG = 2;
    /** 太阴 */
    public static  final int TAI_YIN = 3;

这个定义不太好,我想想看有什么好一点的。


我也发觉这里有问题, 但是不知道如何改进
3 楼 BEA 2012-07-22  
    public static final int SHAO_YANG = 0;
    /** 少阴*/
    public static  final int SHAO_YIN = 1;
    /** 太阳  */
    public static  final int TAI_YANG = 2;
    /** 太阴 */
    public static  final int TAI_YIN = 3;

这个定义不太好,我想想看有什么好一点的。
2 楼 BEA 2012-07-22  
中医使用五行,其实也是想借助中国哲学这个强大的工具。
1 楼 BEA 2012-07-22  
我想你大概没有明白五行的意思,五行就是指金木水火土,同时还有相生相克的关系,至于黄历中使用的五行和周易其它分支使用的五行只是在这基础上加些专业的东西,比如中医就是加了相乘、相侮、制化、胜复等。

相关推荐

    武当道家清修研学古典道教服饰 官网 太极服饰 养心民宿 武当山道家门户网 道教网站 道家服饰官网 道家养生源码模板.rar

    武当山道家养生门户网源码模板,武当山悟道网 武当山武术源码 武当山道家养生模板 武当山道家服饰 悟道太极鞋服 武当山太极鞋服源码 武当山旅游模板 武当道家清修研学古典道教服饰 官网 太极服饰 养心民宿

    软件开发的太极之道软件开发的太极之道软件开发的太极之道

    软件业作为一种产业,很多团队管理者都希望将其过程变得更有效率并且更加可预测。但是他们同时也担心采取这样的措施后会降低开发团队的创造性,这对软件项目而言是至关重要的。

    太极_python_太极python代码_

    用于绘画太极图像,通过代码便于了解绘画太极的代码,对于初始接触python的同学能很好;了解其中语句含义

    chirunning 太极跑

    非常难下的介绍跑步的书,有人称之为太极跑。祝IT人员多多跑步,摆脱亚健康! 长跑跑步姿势很重要。跑步姿势是一切跑步技巧的基础。在这儿,我自己总结了太极跑的思想,但是一直没法清晰化、系统化。突然,我发现了...

    太极图VB源代码

    太极图VB源代码。 用VB编写的简易太极图。

    C语言画图之画个太极图

    呵呵昨天花了一个圆,想画个太极图,我知道没啥技术含量,但是挺有意思的,希望各位看官不要鄙视我不务正业,画完此图,不再做这些事情。  先展示下画出来的图像的情况,因为不支持pgm格式的图像,所以我用的 QQ...

    太极框架-模块集合下载

    太极模块的一些小功能模块的下载,如WXred包助手,改步数,企鹅红包助手,网抑模块等

    画太极图的C++代码实现

    绘制太极图的原理简单来说就是画两个半圆一黑一白 拼成一个正圆 再在大圆的左侧和右侧画两个恰好相切的黑圆和白圆作为突出端 最后分别在这两个突出端里面画两个一黑一白的小洞 MFC里利用void CDrawView::OnDraw CDC ...

    太极拳理及太极拳技术分析.ppt

    太极拳理及太极拳技术分析.ppt

    太极图的二维方程描述方法

    一种用二维方程描述太极图的方法

    32式太极拳口令音乐mp3.mp3

    32式太极拳口令音乐mp3 《32式太极拳》所演述的即是中国武术段位制太极拳“四段”的规定套路。全套32个动作。

    一个不停的旋转的太极图案

    Win32 C++ 太极 有部分注释 VS2010可以直接打开运行 一个不停的旋转的太极图案

    基于canvas画一个太极图

    基于canvas画一个太极图

    48式太极拳口令音乐mp3.mp3

    48式太极拳口令音乐mp3 48式太极拳是在继承与发展传统太极拳特点的同时,本着提高与普及的理念,取其精华,更加体现了动作柔和,圆活饱满,虚实分明,连绵不断的运动特点及心静体松,柔中寓刚的基本。要求,展现了它的优美,...

    陈氏太极拳图说简体版(陈鑫)

    有兴趣的人可以了解一下,是陈氏拳的权威拳理及解说...陈鑫(1849-1929),字品三,陈仲牲三子,陈氏第十六世,陈氏太极拳第八代传人。清末岁贡生,近代中国武术史上著名的太极拳理论家。 如是有缘人,可下载来看看。

    太极越狱工具

    1. 太极越狱Mac版V1.1.0修复了在OS X 10.9系统上部分界面无图标的问题。 2. 太极越狱V2.4.3版集成了最新Cydia1.1.23版,同时进一步优化了越狱程序。具体情况,请 查看更新日志。 3. 已使用太极V2.0.0版越狱的用户...

    Android-太极·Magisk是增强版的太极

    普通版的 太极 无法作用于系统APP,并且创建 APP 需要先卸载。太极·Magisk 借助一个 magisk 模块注入系统,从而可以作用所有的 APP;可以实现 Xposed 框架的完整功能。

    迷你简太极迷你简太极

    太极。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    一个简单的HTML写的太极图

    简单的太极界面

    太极拳介绍ppt模板.rar

    太极拳ppt模板,太极拳的介绍,太极拳,武术,体育运动,太极拳介绍ppt模板。

Global site tag (gtag.js) - Google Analytics