分形之科赫(Koch)雪花

摘要:
分别向外做正三角形,然后擦除“底部”线段,得到一个有12条边的六边形。重复这个过程,你会得到一个“雪花”般的曲线。这条曲线称为科赫曲线或雪花曲线。

      科赫曲线是一种分形。其形态似雪花,又称科赫雪花、雪花曲线.瑞典人科赫于1904年提出了著名的“雪花”曲线,这种曲线的作法是,从一个正三角形开始,把每条边分成三等份,然后以各边的中间长度为底边。分别向外作正三角形,再把“底边”线段抹掉,这样就得到一个六角形,它共有12条边。再把每条边三等份,以各中间部分的长度为底边,向外作正三角形后,抹掉底边线段。反复进行这一过程,就会得到一个“雪花”样子的曲线。这曲线叫做科赫曲线或雪花曲线。

      给定线段AB,科赫曲线可以由以下步骤生成:
      (1)将线段分成三等份(AC,CD,DB)
      (2)以CD为底,向外(内外随意)画一个等边三角形DMC
      (3)将线段CD移去
      (4)分别对AC,CM,MD,DB重复1~3。
      反复进行这一作图过程,得到的曲线越来越精细。

  科赫曲线有着极不寻常的特性,不但它的周长为无限大,而且曲线上任两点之间的距离也是无限大。该曲线长度无限,却包围着有限的面积。很神奇的一个曲线,他说明了一个悖论:“无限长度包围着有限面积。”

      程序中实现了0~8级的科赫雪花分形.程序设计时,将这9级曲线的顶点数据全部放置在一个内存中.并使用如下结构体进行设置:

    struct SnowLevel
    {
        Yuint vertexStart;
        Yuint verticesCount;
    };
    SnowLevel m_snowLevels[SNOW_LEVELS_COUNT];
    Yuint m_currentLevel;

      分形图形的顶点生成算法代码如下:

static void Zhe(const Vector3& vStart, const Vector3& vEnd, Vector3* pVertices)
{
    Vector3 vSub = vEnd - vStart;

    pVertices[0] = vStart;
    pVertices[1] = vStart + vSub/3;
    pVertices[3] = vStart + vSub*2/3;
    pVertices[4] = vEnd;

    Yreal alfa = atan2f(vSub.y, vSub.x);
    alfa += YD_REAL_PI/3;

    Yreal l = D3DXVec3Length(&vSub)/3;
    pVertices[2].x = pVertices[1].x + cosf(alfa)*l;
    pVertices[2].y = pVertices[1].y + sinf(alfa)*l;
    pVertices[2].z = 0.0f;
}

void        CFractalSnowEntity::Fractal(Vector3* pVertices)
{
    pVertices[0].x = 0.0f;
    pVertices[0].y = YD_SNOW_RADIUS;
    pVertices[0].z = 0.0f;

    pVertices[1].x = YD_SNOW_RADIUS*sinf(YD_REAL_PI/3);
    pVertices[1].y = -YD_SNOW_RADIUS*sinf(YD_REAL_PI/6);
    pVertices[1].z = 0.0f;

    pVertices[2].x = -pVertices[1].x;
    pVertices[2].y = pVertices[1].y;
    pVertices[2].z = 0.0f;

    for (Yuint i = 1; i < SNOW_LEVELS_COUNT; i++)
    {
        const Vector3* pSrc = pVertices + m_snowLevels[i - 1].vertexStart;
        Vector3* pDest = pVertices + m_snowLevels[i].vertexStart;

        Yuint c = m_snowLevels[i - 1].verticesCount;

        for (Yuint j = 0; j < c; j++)
        {
            Zhe(pSrc[j], pSrc[(j + 1)%c], pDest);
            pDest += 4;
        }
    }
}

下载地址:http://files.cnblogs.com/WhyEngine/FractalSnow.7z

科赫雪花第0级

分形之科赫(Koch)雪花第1张

科赫雪花第1级

分形之科赫(Koch)雪花第2张

科赫雪花第2级

分形之科赫(Koch)雪花第3张

科赫雪花第3级

分形之科赫(Koch)雪花第4张

科赫雪花第4级

分形之科赫(Koch)雪花第5张

科赫雪花第5级

分形之科赫(Koch)雪花第6张

科赫雪花第6级

分形之科赫(Koch)雪花第7张

科赫雪花第7级

分形之科赫(Koch)雪花第8张

科赫雪花第8级

分形之科赫(Koch)雪花第9张

软件使用说明
键盘0~8,分别设置第0级到第8级分形.
这是个3D程序,鼠标右键的拖动可以改变视角.
键盘X用于恢复为默认视角.
键盘F11用于全屏切换.

分形之科赫(Koch)雪花第10张

免责声明:文章转载自《分形之科赫(Koch)雪花》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇spring boot项目中Tomcat会对URL中的特殊字符进行拦截 报400(java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986)ios图片添加文字或者水印下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

玩客云安装Armbian

首先,轻扫uboot。阿里云的网卡非常痛苦。如果您没有滑动特定的uboot,则无法驱动它。有三个命令可以滑动uboot,可以按顺序执行:usbstart;fatloadusb01200000u引导。binstorerom_write12000000060000 saveenv三个命令执行后,关闭并重新启动Play Keyun一次,然后再次进入中断模式。再次插...

iOS学习——内存泄漏检查及原因分析

由于我刚刚加入项目团队,我不熟悉所讨论的模块的代码,所以当我遇到问题时,我感到非常困难。此外,作为一名iOS新手,我真的不知道如何排除内存泄漏以及原因。因此,我也借此机会研究了iOS开发中内存泄漏的故障排除方法和原因分析。尽管当前的iOS开发基本上采用ARC模式进行内存管理,但如果不小心,就会发生内存泄漏。...

Json 的日期格式转化(时区标准化)

在JavaScript中,这无疑可以通过初始化Data()对象//converttomsecsinceJan11970localTime=d轻松完成。获取时间();步骤2:接下来,通过Data()对象的getTimezoneOffset()方法//obtainlocalUTCoffsetandconverttomseclocalOffset=d找出本地时间偏...

kernel: blk_update_request: I/O error, dev fd0, sector 0

检查后,控制台无法登录。重新启动虚拟机,报告下图,然后执行journalctl以显示以下系统消息日志原因搜索。。。...

Wayland 源码解析之代码结构

Wayland实现的代码组成可以分为以下四个部分:1.Wayland库的核心部分,大部分Wayland协议实现都位于该库中。1) 该工具程序分析Wayland协议文件并生成相应的头文件和代码文件。源代码文件列表:wayland/cursor/wayland cursor。通道/光标/通道光标。cwyland/cursor/os兼容性。cwyland/curs...

mysql状态查看 QPS/TPS/缓存命中率查看

showglobalstatusslike'Com_ commit';showstatslike“无缓冲池读取%”;Thread_cache_Hits=(1-Thread_created/connections)*100%(8)锁定状态mysql&gt;showstatslike“Binlog_缓存%”;...