Merry Chrismas! Today I will teach you how to draw a Christmas tree in C language.
The following is my attempt to draw an abstract Christmas tree with the least amount of code, so there is no trunk. Then, I try to use a more realistic style. Since a tree is a relatively self-similar shape, this time the trunk and branches are described recursively.
Attach the code:
#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));
}
}
}
Then... other methods:
#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 ?'*':' ');
}
Finally, add decorations, ribbons and other items, ah! It looks better... The full version of the code is as follows:
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()
Hurry up and plant trees!
Zhifei 0202
2018.12.25