正文
大家好,我是bug菌~
圣诞节来了,意味着各种圣诞树来临。
各路大佬们用各种编程语言开始卷圣诞树了,有java、C++、C#等等各种版本,实在是太 ~ 卷 ~ 了!
好吧,在这龙"卷"风中,bug菌按耐不住了,还得用熟门熟路的C语言跟粉丝朋友们画个圣诞树。
拍了拍脑门,蒙了~
用C语言卷个圣诞树?像这样?
这也太难了吧?算了算了,弄个显示屏跟大家贴个图吧~
一不小心看到还真有朋友直接用C画过圣诞树,见阅读原文,于是我编译了一下其中代码,代码没有问题,效果如下:
远远的看去还真是一棵有灵魂的圣诞树,不过感觉太花了~
于是简单的修改了设置颜色函数,改成纯白看看效果。
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}
感觉改为纯白色,这棵树直观了很多,但没有了颜色又显得单调了一些。
为了跟前面图片展示的圣诞树实物图片尽可能的相似,我修改几点:
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}
那么最后看一下效果:
最后
好了,今天就跟大家分享这么多了,祝大家圣诞节快乐~
如果觉得这棵树还行,记得点个赞~
最后一个bug,bug菌唯一创作平台~
推荐专辑 点击蓝色字体即可跳转
☞ MCU进阶专辑
☞ “bug说”专辑
☞ 专辑|手撕C语言
☞ 专辑|经验分享