谢宾斯基三角形是一个有意思的图形,(英语:Sierpinski triangle)是一种分形,由波兰数学家谢尔宾斯基在1915年提出,它是一种典型的自相似集。

先画一个三角形,然后呢,取三角形的中点,组成一个新的三角形,把新的三角形挖空。

依次递归,就出现了后面的那个图形。

如果用C语言来画一个这样的三角形,我们需要怎么画呢?

我们先看看这样一段代码,思路还是跟之前一样,在屏幕上画出一个矩形,x行和y列。

#include <stdio.h>
#include <time.h>
#include <sys/select.h>#define SIZE (1 << 5)/*64*//* 毫秒级 延时 */
void msleep(int ms)
{struct timeval delay;delay.tv_sec = 0;delay.tv_usec = ms * 1000; // 20 msselect(0, NULL, NULL, NULL, &delay);
}int main()
{int x, y, i;printf("%d\n",SIZE);/*y用来控制列数*/for (y = SIZE - 1; y >= 0; y--, msleep(20),putchar('\n')) {/*控制行输出*/for (i = 0; i < y; i++) {msleep(20);putchar('^');}}return 0;
}

代码输出

为了方便大家观看,我做了一些调整

为了测试,我把代码改成这样,方便大家看到输出。

#include <stdio.h>#define SIZE (1 << 3)
int main()
{int x, y, i;printf("%d\n",SIZE);/*y用来控制列数*/for (y = SIZE - 1; y >= 0; y--,putchar('\n')) {/*控制行输出*/for (i = 0; i < y; i++) {putchar('^');}for (x = 0; x + y < SIZE; x++){putchar('#');}}return 0;
}

代码输出

weiqifa@bsp-ubuntu1804:~/c$ gcc shengdanshu.c && ./a.out
8
^^^^^^^#
^^^^^^##
^^^^^###
^^^^####
^^^#####
^^######
^#######
########
weiqifa@bsp-ubuntu1804:~/c$

这里可以好好分析一下

y 长度是用来控制输出多少行,可以看到一共有 8 行。

i  的长度是用来输出 ^ 字符的,这个字符随着 y的减少也会相应减小。

x 也受到y 的限制,主要是在另一半输出 # 号字符。

知道了上面,我们来看看核心代码

#include <stdio.h>#define SIZE (1 << 3)
int main()
{int x, y, i;printf("%d\n",SIZE);/*y用来控制列数*/for (y = SIZE - 1; y >= 0; y--,putchar('\n')) {/*控制行输出*/for (i = 0; i < y; i++) {putchar('^');}for (x = 0; x + y < SIZE; x++){printf((x & y) ? " " : "*");}}return 0;
}

代码输出

8
^^^^^^^*
^^^^^^**
^^^^^* *
^^^^****
^^^*   *
^^**  **
^* * * *
********

已经有了我们题目上所的三角形的模样了,这里只要再稍微修改下,就可以得到我们题目中所的那样的三角形了。不对称的原因主要是因为字符高度是宽度的两倍。

代码修改成这样

#include <stdio.h>#define SIZE (1 << 3)
int main()
{int x, y, i;printf("%d\n",SIZE);/*y用来控制列数*/for (y = SIZE - 1; y >= 0; y--,putchar('\n')) {/*控制行输出*/for (i = 0; i < y; i++) {putchar('^');}for (x = 0; x + y < SIZE; x++){printf((x & y) ? "  " : "* ");}}return 0;
}

代码输出

weiqifa@bsp-ubuntu1804:~/c$ gcc shengdanshu.c && ./a.out
8
^^^^^^^*
^^^^^^* *
^^^^^*   *
^^^^* * * *
^^^*       *
^^* *     * *
^*   *   *   *
* * * * * * * *
weiqifa@bsp-ubuntu1804:~/c$

然后我们把 ^ 字符替换成空格,也就是我们想要的东西了。

然后空格和 * 的字符输出,主要是靠 x & y 来控制的,他们又是如何控制的呢?

我们计算一下上面的算法

绿色的地方是我们输出 * 字符的位置,蓝色的 是我们输出 空格的位置,空格是两个空格,所以就出现了我们看到的那样。

我们再修改下代码

#include <stdio.h>#define SIZE (1 << 5)
int main()
{int x, y, i;printf("%d\n",SIZE);/*y用来控制列数*/for (y = SIZE - 1; y >= 0; y--,putchar('\n')) {/*控制行输出*/for (i = 0; i < y; i++) {putchar(' ');}for (x = 0; x + y < SIZE; x++){printf((x & y) ? "  " : "* ");}}return 0;
}

代码输出

weiqifa@bsp-ubuntu1804:~/c$ gcc shengdanshu.c && ./a.out
32** **   ** * * **       ** *     * **   *   *   ** * * * * * * **               ** *             * **   *           *   ** * * *         * * * **       *       *       ** *     * *     * *     * **   *   *   *   *   *   *   ** * * * * * * * * * * * * * * **                               ** *                             * **   *                           *   ** * * *                         * * * **       *                       *       ** *     * *                     * *     * **   *   *   *                   *   *   *   ** * * * * * * *                 * * * * * * * **               *               *               ** *             * *             * *             * **   *           *   *           *   *           *   ** * * *         * * * *         * * * *         * * * **       *       *       *       *       *       *       ** *     * *     * *     * *     * *     * *     * *     * **   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
weiqifa@bsp-ubuntu1804:~/c$

这样看起来是不是很酷了。

我在我的另一个号里面用这样方法画了一个圣诞树,我觉得也挺有意思的,喜欢的同学可以看看,当时写那个代码的时候是圣诞夜,我们刚好在开会,觉得有点无聊。

链接如下

如何用 C 语言画一个「圣诞树」?

知乎上的大神画圣诞树,基础理论也是基于这个,后续剖析一下,我觉得非常有意思。

附上几张谢宾斯基三角形的图片

参考:

[1]https://www.cnblogs.com/lfri/p/10128073.html

[2]https://codegolf.stackexchange.com/questions/6281/draw-a-sierpinski-triangle/6292#6292

推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

c语言画谢宾斯基三角形相关推荐

  1. 递归--谢宾斯基三角形、赛尔平斯基地毯

    递归 为实现一个结果,需要调用多次类似的方法,因此会产生重复代码,那么,我们就可以用到递归:递归的正确使用需要条件来退出循环,否则产生存储溢出现象. 谢宾斯基三角形 每一个正三角形三条边中点的连线产生 ...

  2. c 递归实现谢宾斯基三角形

    1.谢宾斯基三角形c 代码实现 #include<stdio.h> #include<stdlib.h>//全局变量 char a[1000][1000];//输入边长n 与底 ...

  3. 谢宾斯基三角形的几种生成方法

    简介 谢宾斯基三角形(Sierpinski triangle)是一种分形,由波兰数学家谢宾斯基在1915年提出.它是一种自相似集. 几种生成方法 方法一:去掉中心 取一个实心的三角形(多数用等边三角形 ...

  4. sierpinski三角形的维数_谢宾斯基三角形的几种生成方法

    简介 谢宾斯基三角形(Sierpinski triangle)是一种分形,由波兰数学家谢宾斯基在1915年提出.它是一种自相似集. 几种生成方法 方法一:去掉中心 取一个实心的三角形(多数用等边三角形 ...

  5. [分形学] 谢宾斯基 (Sierpinski) 三角形,也叫垫片

    先说一个程序的实现过程: 随机生成 3 个点 P[0].P[1].P[2]: 随机生成 1 个点 P: 绘制点 P: 随机生成 [0, 2] 内的整数 n: 令 P = P 与 P[n] 的中点: 重 ...

  6. Python数据结构15:turtle模块制图,画直线,正方形,星星,递归可视化:分形树,谢尔宾斯基三角形

    1. Python中的turtle模块制图 前面已经讲了递归的原理,这里用递归作图来直观的理解递归. 首先了解以下Python中用于作图的内置海龟作图系统turtle module. Python内置 ...

  7. 按钮动作监听器和鼠标监听器的同时实现,在画图板上画出三角形,射线,曲笔,谢尔宾斯基三角形,谢尔宾斯基地毯Random类的实现,数组的实现,Thread.sleep的实现

    按钮动作监听器和鼠标监听器的实现 实例化 实现 监听器的类 DrawListener dl = new DrawListener();// 在界面上添加鼠标监听器对象(鼠标监听器的对象可以是界面和按钮 ...

  8. 混沌与分形(一):谢尔宾斯基三角形与门格海绵

    研究混沌运动,少不了对分形理论的探讨.分形:通常被定义为"一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状",即具有自相似的性质. 本篇将从 ...

  9. turtle库使用教程 及 绘制 浪漫樱花 五角星 彩虹玫瑰 谢尔宾斯基三角形 实例

    目录 一.turtle简介 二.绘图坐标体系 三.笔画控制函数 四.形状绘制函数 五.颜色填充 六.浪漫樱花代码实例 七.五角星代码实例 八.彩虹玫瑰代码实例 九.谢尔宾斯基三角形代码实例 一.tur ...

最新文章

  1. 300亿美元,AMD为什么要买Xilinx?
  2. 预告:Javascript全栈开发的系列文章
  3. Eclipse调试Bug的七种常用技巧(转)
  4. oracle数据泵导入提示00972,oracle数据库使用expdp指定FLASHBACK_TIME遇到ORA-39150错误 | 信春哥,系统稳,闭眼上线不回滚!...
  5. how is object structure really created - when the child equipment is downloaded
  6. php 结构体_php基础知识集合
  7. Task04:集合运算-表的加减法和join等-天池龙珠计划SQL训练营
  8. vim编辑器使用详解
  9. 全网首发:JAVA中的+=,会直接把float赋值给int变量,编译器不报错
  10. 基于RV1126平台imx291分析 --- mipi-csi-phy注册
  11. 读InfoGan文章
  12. 正则表达式最好的书籍_正则表达式的最佳做法
  13. homeassistant搭建_安卓环境home assistant搭建
  14. BFM-总线功能模型
  15. 产品经理是做什么的?
  16. 茜在人名可以读xi吗_茜读xi还是qian?
  17. 【HTML——粒子 特效】
  18. php开发证书转换工具,各类证件生成器
  19. 2014年 IT 行业校招待遇
  20. 【图文详解】【pycharm】pycharm更换背景颜色

热门文章

  1. Oracle手边常用70则脚本知识汇总
  2. 8大排序算法图文讲解转
  3. jquery 操作日期、星期、元素的追加
  4. MYSQL性能调优及架构设计学习笔记-影响MYSQL性能的相关因素之实例分析
  5. 喜讯,Asp.net Ajax 文档提供下载
  6. 数据库与数据库管理系统
  7. 二、【List、Set、数据结构、Collections】
  8. s4800扫描电镜的CSS3_Hitachi S-4800型场发射扫描电子显微镜+能谱
  9. oracle 未找到段的存储定义,Exp-00003 no storage definition found issue in oracle 11g (未找到段 (0,0) 的存储定义)...
  10. Deepin 下安装 LAMP