`

[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

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

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

    陈氏太极拳图说简体版是太极拳领域的重要文献,其原作者为近代著名的太极拳理论家陈鑫(1849-1929),字品三。陈鑫是陈氏太极拳第十六世传人、第八代传人,他将自己对太极拳的深刻理解和丰富实践心得著述成书。...

    安卓应用-教育学习-太极道手机版 v5.4.9.zip

    【太极道手机版 v5.4.9】是一款专为安卓用户设计的教育学习应用程序,集成了丰富的太极文化和道家哲学知识,旨在帮助用户在忙碌的生活中寻找内心的平静和身体健康。这款应用不仅适合太极拳爱好者,也适合对中华传统...

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

    ### 软件开发的太极之道 在软件开发领域,如何在提高效率的同时保持创造力,是一直以来备受关注的问题。本文旨在探讨如何实现这一看似矛盾的目标,并介绍五种最佳实践方法,帮助团队达到效率与创造性的和谐共存。 ...

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

    太极图是一种古典的中国象征符号,表示宇宙的平衡和对立统一。太极图的二维方程描述方法是将太极图转化为数学方程式,以便更好地理解和分析太极图的结构和特征。 在太极图的二维方程描述中,我们可以将太极图分解为...

    C语言画图之画个太极图

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

    太极_python_太极python代码_

    在Python编程语言中,"太极_python_太极python代码_"这个标题暗示了我们将探讨如何使用Python来绘制太极图,这是一种常见的图形艺术,同时也是一种很好的实践项目,可以帮助初学者更好地理解Python的基本语法和流程...

    chirunning 太极跑

    尤其对于IT行业的工作者来说,通过练习太极跑不仅可以改善身体状态,还能在忙碌的工作之余找到一种放松身心的方式。最重要的是,无论采用何种跑步姿势,都要享受跑步带来的乐趣,让跑步成为生活中的一部分。

    四十八式太极拳教学视频.zip

    四十八式太极拳是一种融合了中国传统武术精髓的健身运动,它在太极拳原有的基础上,结合了多种拳式的精妙动作,旨在提高身体的协调性、灵活性和内在力量。此套教学视频是为了帮助初学者及进阶者更深入地理解和掌握四...

    数字孪生-太极开发者平台软件

    在太极开发者平台中,数据可视化是核心功能之一。通过将复杂的数据以图表、地图、仪表盘等形式展示,使得用户能够直观理解系统状态,发现潜在问题,进行决策支持。数据可视化不仅提升了信息的传递效率,也增强了...

    迷你简太极迷你简太极

    【迷你简太极】是一款小巧而精致的太极主题应用,它可能是专门为那些对太极文化感兴趣,却又没有太多时间或空间去实地学习的人群设计的。这款应用可能包含了太极的基本理论、动作演示以及指导教程,旨在帮助用户在...

    太极图VB源代码

    【太极图VB源代码】是基于Visual Basic(VB)编程语言实现的一个图形程序,它能够绘制出具有中国传统哲学象征意义的太极图案。VB是一种面向对象的编程语言,由微软公司开发,广泛应用于Windows平台上的应用软件开发...

    太极神器-全网各种资源免费爬取下载

    太极软件是一款功能全面的资源获取工具,专为追求便捷与高效的用户设计。它支持全网免费爬取图片、音乐、小说、学习资源及漫画资源,涵盖娱乐、教育与信息等多个领域。用户只需简单操作,即可快速搜索并下载所需内容...

    武当太极拳源码

    武当山作为太极拳的重要发源地之一,其独特的太极拳流派受到许多太极拳爱好者的推崇。将"武当太极拳"与"源码"结合,意味着这个软件项目在设计与功能上都力求体现武当山太极拳的文化特色。 根据给出的描述,"武当...

    Android 太极(免Root框架)

    太极是一个能够运行 Xposed 模块的框架,模块能通过它改变系统和应用的行为。太极既能以传统的 Root/刷机方式运作,也能免 Root/ 免刷机运行;并且它支持 Android 5.0 ~ 12。 简单来说,太极就是一个 类Xposed框架...

    蓝云版太极PC资源详解.pdf

    最后,作为一个充满东方智慧的软件解决方案,“太极”的存在本身就是对当前软件生态的一种补充与完善。无论是在技术层面还是在文化层面,它都为用户带来了全新的选择和体验,让人期待它在未来的发展和创新。

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

    在本项目中,我们主要探讨的是如何利用Win32 C++编程语言来创建一个持续旋转的太极图案。这个程序在Microsoft Visual Studio 2010环境下可以顺利编译和运行,为用户展示了一个动态的图形效果。让我们深入了解一下...

    关于太极框架进行虚拟WIFI的使用举例飞书4.0(附带旧版本飞书链接).doc

    ### 关于太极框架进行虚拟WIFI的使用举例与飞书4.0操作指南 #### 工作原理 太极框架能够实现虚拟WIFI的功能主要是通过修改应用程序(APP)的基础架构来达到目的。它允许用户在不改变原生系统环境的情况下运行经过...

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

    太极图由两个相反颜色的半圆组成,中间通过两个小圆来形成阴阳鱼眼,整体呈现出一种平衡和谐的视觉效果。 在MFC中,我们通常会在`CDrawView`类的`OnDraw`函数中处理图形绘制,这个函数接收一个`CDC`指针,它是设备...

    OpenGL实现的太极图

    这就是个用OpenGL实现的太极图没有什么的了就是画几个圆

Global site tag (gtag.js) - Google Analytics