【闲趣】【转载】如何用C语言画出一棵圣诞树
圣诞节快乐!今天教你用C语言画出一棵圣诞树 下面的是我尝试尽量用最少代码来画一个抽象一点的圣诞树,因此树干都没有。然后,我尝试用更真实一点的风格。因为树是一个比较自相似的形状,这次使用递归方式描述树干和分支。
附上代码:
#include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { int n= argc > 1? atoi(argv[1]) : 4; for (int j= 1;j <=n; j++) { int s= 1<< j,k=(1<< n)-s,x; for (int y=s -j; y>= 0; y--, putchar( )) { for(x=0;x<y+k; x++) printf(" "); for(x=0;x+y<s;x++) printf("%c ", !^y & x); for(x=1;x+y<s;x++) printf("%c ",! ^y &(s-y-x-1)); } } }
然后…其他方法:
#include <math.h> #include <stdio.h> #include <stdlib.h> #define PI 3.14159265359 float sx, sy; float sdCircle(float px, float py, float r) { float dx= px- sx, dy = py-sy; return sqrtf(dx*dx+dy* dy)- r; } float opUnion(float d1, float d2) { return d1<d2? d1: d2;} #define T px + scale * r* cosf(theta), py + scale * r * sin(theta) float f(float px, float py, float theta, float scale, int n){ float d= 0.0f; for (float r= 0.0f; r< 0.8f;r += 0.02f) d = opUnion(d, sdCircle(T, 0.05f * scale * (0.95f - r))); if (n>0) for (int t = -1;t<=1; t+=2){ float tt = theta+t* 1.8f; float ss = scale * 0.9f; for (float r= 0.2f; r< 0.8f; r +=0.1f) { d = opUnion(d, f(T, tt, ss * 0.5f, n- 1)); ss *= 0.8f;}} return d;} int main(int argc, char* argv[]) { int n=argc > 1 ?atoi(argv[1]) : 3; for (sy = 0.8f; sy > 0.0f; sy -= 0.02f, putchar( )) for (sx = -0.35f;sx< 0.35f; sx += 0.01f) putchar(f(0, 0, PI * 0.5f, 1.0f, n)< 0 ?*: ); }
最后,加上装饰物,丝带等物品,呀!更好看了呢…完整版代码如下:
import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle() circle.shape(circle) circle.color(red) circle.speed(fastest) circle.up() square = turtle.Turtle() square.shape(square) square.color(green) square.speed(fastest) square.up() circle.goto(0,280) circle.stamp() k = 0 for i in range(1, 17): y = 30*i for j in range(i-k): x = 30*j square.goto(x,-y+280) square.stamp() square.goto(-x,-y+280) square.stamp() if i % 4 == 0: x = 30*(j+1) circle.color(red) circle.goto(-x,-y+280) circle.stamp() circle.goto(x,-y+280) circle.stamp() k += 2 if i % 4 == 3: x = 30*(j+1) circle.color(yellow) circle.goto(-x,-y+280) circle.stamp() circle.goto(x,-y+280) circle.stamp() square.color(brown) for i in range(17,20): y =30*i for j in range(3): x = 30*j square.goto(x,-y+280) square.stamp() square.goto(-x,-y+280) square.stamp() turtle.exitonclick()
赶快来种树吧! 知非0202 2018.12.25