《计算机图形学》第四版练习题——用对称法画正弦函数

《计算机图形学》第四版 课后练习题——用对称法画正弦函数代码

刚开始阅读《计算机图形学》,看到其中有些练习题蛮有意思,决定试试看上机实验。这篇文章记录的是《计算机图形学》第四版第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°内函数曲线。

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