用C语言卷了一棵圣诞树

5318fd786e7c827a61704ee6b67390c5.gif

正文


大家好,我是bug菌~

圣诞节来了,意味着各种圣诞树来临。

各路大佬们用各种编程语言开始卷圣诞树了,有java、C++、C#等等各种版本,实在是太 ~ 卷 ~ 了!

4b39889760662dc8c8afdbd45d19f950.png

好吧,在这龙"卷"风中,bug菌按耐不住了,还得用熟门熟路的C语言跟粉丝朋友们画个圣诞树。

拍了拍脑门,蒙了~

用C语言卷个圣诞树?像这样?

01bf142c0940c42cc6fdeac16d2beae6.png

这也太难了吧?算了算了,弄个显示屏跟大家贴个图吧~

一不小心看到还真有朋友直接用C画过圣诞树,见阅读原文,于是我编译了一下其中代码,代码没有问题,效果如下:

caf6c9c3bc2600c05eee570f55b6850b.png

远远的看去还真是一棵有灵魂的圣诞树,不过感觉太花了~

于是简单的修改了设置颜色函数,改成纯白看看效果。

1void SetColor() { 
2  int color = rand()%16;
3  if (color == 0) color = 0x04;
4  HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); 
5  //SetConsoleTextAttribute(hCon, color); 
6  SetConsoleTextAttribute(hCon, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); //白底
7}

535d145d31c8c1359c3c6244d3e1589d.png

感觉改为纯白色,这棵树直观了很多,但没有了颜色又显得单调了一些。

为了跟前面图片展示的圣诞树实物图片尽可能的相似,我修改几点:

1、整个树大体呈绿色;

2、在树的外层增加彩色点缀。

如下代码是为了实现如上两点在源代码基础上进行了修改,大家可以直接编译看看效果:

1#include <math.h>
  2#include <stdio.h>
  3#include <stdlib.h>
  4#include <string.h>
  5#include <windows.h>
  6#include <time.h>
  7
  8void SetColor(int Mode) 
  9{ 
 10  int color = rand()%16;
 11  if (color == 0) color = 0x04;
 12  HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); 
 13
 14  if(Mode == 0)
 15  {
 16
 17     //SetConsoleTextAttribute(hCon, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); //白底
 18     SetConsoleTextAttribute(hCon,  FOREGROUND_GREEN ); 
 19  }
 20  else
 21  {
 22       SetConsoleTextAttribute(hCon, color); 
 23  }
 24
 25} 
 26
 27#define PI 3.14159265359
 28
 29float sx, sy;
 30
 31float sdCircle(float px, float py, float r) {
 32    float dx = px - sx, dy = py - sy;
 33    return sqrtf(dx * dx + dy * dy) - r;
 34}
 35
 36float opUnion(float d1, float d2) {
 37    return d1 < d2 ? d1 : d2;
 38}
 39
 40#define T px + scale * r * cosf(theta), py + scale * r * sin(theta)
 41
 42float f(float px, float py, float theta, float scale, int n) {
 43    float d = 0.0f;
 44    for (float r = 0.0f; r < 0.8f; r += 0.02f)
 45        d = opUnion(d, sdCircle(T, 0.05f * scale * (0.95f - r)));
 46
 47    if (n > 0)
 48        for (int t = -1; t <= 1; t += 2) {
 49            float tt = theta + t * 1.8f;
 50            float ss = scale * 0.9f;
 51            for (float r = 0.2f; r < 0.8f; r += 0.1f) {
 52                d = opUnion(d, f(T, tt, ss * 0.5f, n - 1));
 53                ss *= 0.8f;
 54            }
 55        }
 56
 57    return d;
 58}
 59
 60int main(int argc, char* argv[]) {
 61  srand((int)time(NULL));
 62    int n = argc > 1 ? atoi(argv[1]) : 3;
 63
 64    int SetCnt = 0;
 65    int CntTotal = 0;
 66    float fReverseCnt = 0;
 67    int ColorIndex = 0;
 68
 69    for (sy = 0.8f; sy > 0.0f; sy -= 0.02f, putchar('\n'))
 70    {
 71
 72        ColorIndex++;
 73
 74        SetCnt = 0; //每行进行清零
 75
 76        for (sx = -0.35f; sx < 0.35f; sx += 0.01f) 
 77        {
 78            if(f(0, 0, PI * 0.5f, 1.0f, n) < 0)
 79            {
 80
 81                if(ColorIndex%5 == 0)
 82                {
 83                    SetColor(1);  
 84                }
 85                else
 86                {
 87                    if(SetCnt < 3)
 88                    {
 89                        SetCnt ++;
 90                        SetColor(1);  
 91
 92                        fReverseCnt = sx + 0.01f;
 93                    }
 94                    else if(sx >= fabs(fReverseCnt) )
 95                    {
 96                        SetColor(1);  
 97                    }
 98                    else
 99                    {
100                        SetColor(0); 
101                    }
102
103                }                   
104                putchar('*');
105            }
106            else
107            {
108                putchar(' ');
109            }
110        }
111    }
112    return 0;       
113}

那么最后看一下效果:

9a4773dee6594576da2ca148fc1fee68.png

最后

      好了,今天就跟大家分享这么多了,祝大家圣诞节快乐~

      如果觉得这棵树还行,记得点个~

最后一个bug,bug菌唯一创作平台~

e7d0097ca5392b1939a6ca563dc0ddc9.png

推荐专辑  点击蓝色字体即可跳转

☞  MCU进阶专辑 21f90c260c905b240169f1f3866c032c.gif

☞  嵌入式C语言进阶专辑 2e39ce7e7d4ace5c880cf0a5fef3de74.gif

☞  “bug说”专辑 e51c26b75ba8e93acd7629bcd223600a.gif

☞ 专辑|Linux应用程序编程大全

☞ 专辑|学点网络知识

☞ 专辑|手撕C语言

☞ 专辑|手撕C++语言

☞ 专辑|经验分享

☞ 专辑|电能控制技术

☞ 专辑 | 从单片机到Linux

20bc9a63dd7b5855cbfe97bd790095cd.gif

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值