【闲趣】如何用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('\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

猜你喜欢

转载自blog.csdn.net/weixin_43717839/article/details/85241406