【闲趣】【转载】如何用C语言画出一棵圣诞树

圣诞节快乐!今天教你用C语言画出一棵圣诞树
知乎作者:Milo Yip
来源:知乎 著作权归作者所有。
链接:
http://www.zhihu.com/question/27015321/answer/35028446

下面的是我尝试尽量用最少代码来画一个抽象一点的圣诞树,因此树干都没有。然后,我尝试用更真实一点的风格。因为树是一个比较自相似的形状,这次使用递归方式描述树干和分支。

【闲趣】【转载】如何用C语言画出一棵圣诞树_第1张图片
附上代码:

#include 
#include 

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

然后…其他方法:

#include 
#include 
#include 
#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 d10)
		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 ?'*':' ');
		}








最后,加上装饰物,丝带等物品,呀!更好看了呢…

#include 
#include 
#include 
#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= x - 0.05f && sx <=x + 0.05f;
}


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;
float zoom= argc >2 ? atof(argv[2]) : 1.0f;
for (sy= 0.8f; sy > 0.0f; sy -= 0.02f / zoom, putchar('\n' ))
for (sx = -0.35f;sx < 0.35f; sx += 0.01f / zoom) {
if (f(0, 0, PI * 0.5f, 1.0f, n)< 0.0f) {
if (sy<0.1f)
putchar('.');
else {
if (ribbon())
putchar('=');
else
putchar("...................................#j&o"[rand()% 32]);

}
}
else
putchar(' ');

}
}



赶快来种树吧!
知非0202
2018.12.25

你可能感兴趣的:(闲来无事敲代码)