c语言画谢宾斯基三角形
謝賓斯基三角形是一個有意思的圖形,(英語:Sierpinski triangle)是一種分形,由波蘭數學家謝爾賓斯基在1915年提出,它是一種典型的自相似集。
先畫一個三角形,然后呢,取三角形的中點,組成一個新的三角形,把新的三角形挖空。
依次遞歸,就出現了后面的那個圖形。
如果用C語言來畫一個這樣的三角形,我們需要怎么畫呢?
我們先看看這樣一段代碼,思路還是跟之前一樣,在屏幕上畫出一個矩形,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++){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 ^^^^^^^* ^^^^^^** ^^^^^*?* ^^^^**** ^^^*???* ^^**??** ^*?*?*?* ********已經有了我們題目上所的三角形的模樣了,這里只要再稍微修改下,就可以得到我們題目中所的那樣的三角形了。不對稱的原因主要是因為字符高度是寬度的兩倍。
代碼修改成這樣
代碼輸出
然后我們把?^?字符替換成空格,也就是我們想要的東西了。
然后空格和 * 的字符輸出,主要是靠 x & y 來控制的,他們又是如何控制的呢?
我們計算一下上面的算法
綠色的地方是我們輸出?* 字符的位置,藍色的 是我們輸出?空格的位置,空格是兩個空格,所以就出現了我們看到的那樣。
我們再修改下代碼
代碼輸出
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语言画谢宾斯基三角形的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hikvision (海康威视) 摄像机
- 下一篇: 如何正确的使用微信公众号