c语言画谢宾斯基三角形
謝賓斯基三角形是一個(gè)有意思的圖形,(英語(yǔ):Sierpinski triangle)是一種分形,由波蘭數(shù)學(xué)家謝爾賓斯基在1915年提出,它是一種典型的自相似集。
先畫一個(gè)三角形,然后呢,取三角形的中點(diǎn),組成一個(gè)新的三角形,把新的三角形挖空。
依次遞歸,就出現(xiàn)了后面的那個(gè)圖形。
如果用C語(yǔ)言來(lái)畫一個(gè)這樣的三角形,我們需要怎么畫呢?
我們先看看這樣一段代碼,思路還是跟之前一樣,在屏幕上畫出一個(gè)矩形,x行和y列。
代碼輸出
為了方便大家觀看,我做了一些調(diào)整
為了測(cè)試,我把代碼改成這樣,方便大家看到輸出。
#include?<stdio.h>#define?SIZE?(1?<<?3) int?main() {int?x,?y,?i;printf("%d\n",SIZE);/*y用來(lái)控制列數(shù)*/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 長(zhǎng)度是用來(lái)控制輸出多少行,可以看到一共有 8 行。
i ?的長(zhǎng)度是用來(lái)輸出?^ 字符的,這個(gè)字符隨著 y的減少也會(huì)相應(yīng)減小。
x 也受到y(tǒng) 的限制,主要是在另一半輸出?# 號(hào)字符。
知道了上面,我們來(lái)看看核心代碼
#include?<stdio.h>#define?SIZE?(1?<<?3) int?main() {int?x,?y,?i;printf("%d\n",SIZE);/*y用來(lái)控制列數(shù)*/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 ^^^^^^^* ^^^^^^** ^^^^^*?* ^^^^**** ^^^*???* ^^**??** ^*?*?*?* ********已經(jīng)有了我們題目上所的三角形的模樣了,這里只要再稍微修改下,就可以得到我們題目中所的那樣的三角形了。不對(duì)稱的原因主要是因?yàn)?strong>字符高度是寬度的兩倍。
代碼修改成這樣
代碼輸出
然后我們把?^?字符替換成空格,也就是我們想要的東西了。
然后空格和 * 的字符輸出,主要是靠 x & y 來(lái)控制的,他們又是如何控制的呢?
我們計(jì)算一下上面的算法
綠色的地方是我們輸出?* 字符的位置,藍(lán)色的 是我們輸出?空格的位置,空格是兩個(gè)空格,所以就出現(xiàn)了我們看到的那樣。
我們?cè)傩薷南麓a
代碼輸出
weiqifa@bsp-ubuntu1804:~/c$?gcc?shengdanshu.c?&&?./a.out 32**?**???**?*?*?**???????**?*?????*?**???*???*???**?*?*?*?*?*?*?**???????????????**?*?????????????*?**???*???????????*???**?*?*?*?????????*?*?*?**???????*???????*???????**?*?????*?*?????*?*?????*?**???*???*???*???*???*???*???**?*?*?*?*?*?*?*?*?*?*?*?*?*?*?**???????????????????????????????**?*?????????????????????????????*?**???*???????????????????????????*???**?*?*?*?????????????????????????*?*?*?**???????*???????????????????????*???????**?*?????*?*?????????????????????*?*?????*?**???*???*???*???????????????????*???*???*???**?*?*?*?*?*?*?*?????????????????*?*?*?*?*?*?*?**???????????????*???????????????*???????????????**?*?????????????*?*?????????????*?*?????????????*?**???*???????????*???*???????????*???*???????????*???**?*?*?*?????????*?*?*?*?????????*?*?*?*?????????*?*?*?**???????*???????*???????*???????*???????*???????*???????**?*?????*?*?????*?*?????*?*?????*?*?????*?*?????*?*?????*?**???*???*???*???*???*???*???*???*???*???*???*???*???*???*???* *?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?* weiqifa@bsp-ubuntu1804:~/c$這樣看起來(lái)是不是很酷了。
我在我的另一個(gè)號(hào)里面用這樣方法畫了一個(gè)圣誕樹,我覺(jué)得也挺有意思的,喜歡的同學(xué)可以看看,當(dāng)時(shí)寫那個(gè)代碼的時(shí)候是圣誕夜,我們剛好在開會(huì),覺(jué)得有點(diǎn)無(wú)聊。
鏈接如下
如何用 C 語(yǔ)言畫一個(gè)「圣誕樹」?
知乎上的大神畫圣誕樹,基礎(chǔ)理論也是基于這個(gè),后續(xù)剖析一下,我覺(jué)得非常有意思。
附上幾張謝賓斯基三角形的圖片
參考:
[1]https://www.cnblogs.com/lfri/p/10128073.html
[2]https://codegolf.stackexchange.com/questions/6281/draw-a-sierpinski-triangle/6292#6292
推薦閱讀:
專輯|Linux文章匯總
專輯|程序人生
專輯|C語(yǔ)言
我的知識(shí)小密圈
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的c语言画谢宾斯基三角形的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Hikvision (海康威视) 摄像机
- 下一篇: 如何正确的使用微信公众号