圣诞节快乐!今天教你用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('\n')) {
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('\n'))
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