1. 程式人生 > >使用C語言列印不同星號圖案

使用C語言列印不同星號圖案


一、畫圖方法

畫一個圖,通常可以選擇如下方法:

1、畫每一個圖形,填充形狀覆蓋的畫素。

2、對於影象中每個畫素,取樣該畫素覆蓋了什麼形狀。

第一種就是光柵化(rasterization)演算法,第二種包括光線追蹤(ray tracing)、光線步進(ray marching)等演算法。

第二種做法可以理解為設計一個數學函式,這種方式可以用較少的程式碼畫出複雜的形狀。如果要輸出文字模式,只用兩個符號表示圖形,可用這個程式碼框架:

#include <stdio.h> 
const int w = 30; 
const int h = 30; 
int f(int x, int y) 
{ 
	return /*...*/; 
} 
int main() 
{ 
	int x, y; 
	for (y = 0; y < h; y++) 
	{ 
		for (x = 0; x < w; x++) 
			printf(f(x, y) ? "* " : "  "); 
		puts(""); 
	} 
}

二、三角形

1、直角三角形,可以模擬用  x \le y ;

#include <stdio.h> 
const int w = 19; 
const int h = 10; 
int a(int x, int y) 
{ 
	return x <= y;
} 
int main() 
{ 
	int x, y; 
	for (y = 0; y < h; y++) 
	{ 
		for (x = 0; x < w; x++) 
			printf(a(x, y) ? "* " : "  "); 
		puts(""); 
	} 
	system("pause");
	return 0;
}

2、等腰三角形我們可以使用絕對值 \lvert x - c_x\rvert \le yc_x 表示對稱軸的x 座標:

#include <stdlib.h>
#include <stdio.h>
#include<math.h>
const int w = 19;
const int h = 10;
int main()
{
int x, y;
for (y = 0; y < h; y++) 
{ 
	for (x = 0; x < w; x++) 
		printf(a(x, y) ? "* " : "  "); 
	puts(""); 
}

	system("pause");
	return 0;
}
    
int a(int x, int y) {
    return abs(x - 9) <= y;
}


三、圓盤

圓盤在數學上可定義為一個隱函式 (x - c_x)^2 + (y - c_y)^2 \le r^2,那麼畫一個置於畫布中心(10, 10)、半徑 8 的圓盤只需要定義f(x, y) 為:

int a(int x, int y) 
{
    return (x - 10) * (x - 10) + (y - 10) * (y - 10) <= 8 * 8;
}

剩下的程式碼如一種所示。