《計算機圖形學》第四版練習題——用對稱法畫正弦函數

《計算機圖形學》第四版 課後練習題——用對稱法畫正弦函數代碼

剛開始閱讀《計算機圖形學》,看到其中有些練習題蠻有意思,決定試試看上機實驗。這篇文章記錄的是《計算機圖形學》第四版第6章練習題中:使用對稱發繪製正弦函數代碼,其中添加了多個週期展示,橫貫窗口。
允許用戶自定義函數週期和振幅。
實現效果如下所示:
在這裏插入圖片描述

完整代碼:https://download.csdn.net/download/wqy248/12440583
核心代碼如下所示:

//繪製主函數
//drawpixelfunc爲畫點函數
//cyclex爲x方向週期
//maxy爲y方向最大值
//x0,y0爲起始點
void drawSinx::Draw(DrawPixelFunc drawpixelfunc)
{
	//假設正弦函數爲:Asin(x/B)
	//則根據週期和y方向最大值可分別求出A、B
	double A = _maxy;
	double B = _cyclex / (2 * PI);
	int x = 0;
	int y = 0;
	
	double cyclexexceptfour = _cyclex / 4;
	
	if (A <= B)
	{
		//永遠K<1 X方向自增
		while (x <= cyclexexceptfour)
		{
			drawpixels(drawpixelfunc, x, y);
			x++;
			double xeb = x / B;
			y = A*sin(xeb);
		}
	}
	else{
		//斜率轉折點		
		double y_turn = (sqrt(A*A - B*B));
		//y<=y_turn時K>=1 Y方向自增
		while (y <= y_turn)
		{
			drawpixels(drawpixelfunc, x, y);
			y++;
			x = B*asin(y / A);
		}
		//y>y_turn時K<1 X方向自增
		while (x <= cyclexexceptfour)
		{
			drawpixels(drawpixelfunc, x, y);
			x++;
			double xeb = x / B;
			y = A*sin(xeb);
		}
	}
}

void drawSinx::drawpixels(DrawPixelFunc drawpixelfunc, int x, int y)
{
	double cyclexexceptfour = _cyclex / 4;
	//右邊
	int i = 0;
	do
	{
		drawpixelfunc(_x0 + x + 4 * i*cyclexexceptfour, _y0 - y);
		drawpixelfunc(_x0 + 2 * cyclexexceptfour - x + 4 * i*cyclexexceptfour, _y0 - y);
		drawpixelfunc(_x0 + 2 * cyclexexceptfour + x + 4 * i*cyclexexceptfour, _y0 + y);
		drawpixelfunc(_x0 + 4 * cyclexexceptfour - x + 4 * i*cyclexexceptfour, _y0 + y);
		i++;
	} while (_x0 + x + 4 * i*cyclexexceptfour <= _width);

	i = 0;
	//左邊
	do
	{
		drawpixelfunc(_x0 - x - 4 * i*cyclexexceptfour, _y0 + y);
		drawpixelfunc(_x0 - 2 * cyclexexceptfour + x - 4 * i*cyclexexceptfour, _y0 + y);
		drawpixelfunc(_x0 - 2 * cyclexexceptfour - x - 4 * i*cyclexexceptfour, _y0 - y);
		drawpixelfunc(_x0 - 4 * cyclexexceptfour + x - 4 * i*cyclexexceptfour, _y0 - y);
		i++;
	} while (_x0 - x - 4 * i*cyclexexceptfour >= 0);

}

其中Draw函數第一個參數DrawPixelFunc爲畫點函數,從主窗體傳入,目的是在當前窗口句柄hdc上畫一個點。
drawpixels函數是爲了在窗口width範圍內(width參數從主窗體中傳入)按照對稱性重複繪製0-90°內函數曲線。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章