c语言画谢宾斯基三角形
谢宾斯基三角形是一个有意思的图形,(英语: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语言画谢宾斯基三角形相关推荐
- 递归--谢宾斯基三角形、赛尔平斯基地毯
递归 为实现一个结果,需要调用多次类似的方法,因此会产生重复代码,那么,我们就可以用到递归:递归的正确使用需要条件来退出循环,否则产生存储溢出现象. 谢宾斯基三角形 每一个正三角形三条边中点的连线产生 ...
- c 递归实现谢宾斯基三角形
1.谢宾斯基三角形c 代码实现 #include<stdio.h> #include<stdlib.h>//全局变量 char a[1000][1000];//输入边长n 与底 ...
- 谢宾斯基三角形的几种生成方法
简介 谢宾斯基三角形(Sierpinski triangle)是一种分形,由波兰数学家谢宾斯基在1915年提出.它是一种自相似集. 几种生成方法 方法一:去掉中心 取一个实心的三角形(多数用等边三角形 ...
- sierpinski三角形的维数_谢宾斯基三角形的几种生成方法
简介 谢宾斯基三角形(Sierpinski triangle)是一种分形,由波兰数学家谢宾斯基在1915年提出.它是一种自相似集. 几种生成方法 方法一:去掉中心 取一个实心的三角形(多数用等边三角形 ...
- [分形学] 谢宾斯基 (Sierpinski) 三角形,也叫垫片
先说一个程序的实现过程: 随机生成 3 个点 P[0].P[1].P[2]: 随机生成 1 个点 P: 绘制点 P: 随机生成 [0, 2] 内的整数 n: 令 P = P 与 P[n] 的中点: 重 ...
- Python数据结构15:turtle模块制图,画直线,正方形,星星,递归可视化:分形树,谢尔宾斯基三角形
1. Python中的turtle模块制图 前面已经讲了递归的原理,这里用递归作图来直观的理解递归. 首先了解以下Python中用于作图的内置海龟作图系统turtle module. Python内置 ...
- 按钮动作监听器和鼠标监听器的同时实现,在画图板上画出三角形,射线,曲笔,谢尔宾斯基三角形,谢尔宾斯基地毯Random类的实现,数组的实现,Thread.sleep的实现
按钮动作监听器和鼠标监听器的实现 实例化 实现 监听器的类 DrawListener dl = new DrawListener();// 在界面上添加鼠标监听器对象(鼠标监听器的对象可以是界面和按钮 ...
- 混沌与分形(一):谢尔宾斯基三角形与门格海绵
研究混沌运动,少不了对分形理论的探讨.分形:通常被定义为"一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状",即具有自相似的性质. 本篇将从 ...
- turtle库使用教程 及 绘制 浪漫樱花 五角星 彩虹玫瑰 谢尔宾斯基三角形 实例
目录 一.turtle简介 二.绘图坐标体系 三.笔画控制函数 四.形状绘制函数 五.颜色填充 六.浪漫樱花代码实例 七.五角星代码实例 八.彩虹玫瑰代码实例 九.谢尔宾斯基三角形代码实例 一.tur ...
最新文章
- 300亿美元,AMD为什么要买Xilinx?
- 预告:Javascript全栈开发的系列文章
- Eclipse调试Bug的七种常用技巧(转)
- oracle数据泵导入提示00972,oracle数据库使用expdp指定FLASHBACK_TIME遇到ORA-39150错误 | 信春哥,系统稳,闭眼上线不回滚!...
- how is object structure really created - when the child equipment is downloaded
- php 结构体_php基础知识集合
- Task04:集合运算-表的加减法和join等-天池龙珠计划SQL训练营
- vim编辑器使用详解
- 全网首发:JAVA中的+=,会直接把float赋值给int变量,编译器不报错
- 基于RV1126平台imx291分析 --- mipi-csi-phy注册
- 读InfoGan文章
- 正则表达式最好的书籍_正则表达式的最佳做法
- homeassistant搭建_安卓环境home assistant搭建
- BFM-总线功能模型
- 产品经理是做什么的?
- 茜在人名可以读xi吗_茜读xi还是qian?
- 【HTML——粒子 特效】
- php开发证书转换工具,各类证件生成器
- 2014年 IT 行业校招待遇
- 【图文详解】【pycharm】pycharm更换背景颜色
热门文章
- Oracle手边常用70则脚本知识汇总
- 8大排序算法图文讲解转
- jquery 操作日期、星期、元素的追加
- MYSQL性能调优及架构设计学习笔记-影响MYSQL性能的相关因素之实例分析
- 喜讯,Asp.net Ajax 文档提供下载
- 数据库与数据库管理系统
- 二、【List、Set、数据结构、Collections】
- s4800扫描电镜的CSS3_Hitachi S-4800型场发射扫描电子显微镜+能谱
- oracle 未找到段的存储定义,Exp-00003 no storage definition found issue in oracle 11g (未找到段 (0,0) 的存储定义)...
- Deepin 下安装 LAMP