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