《計算機圖形學》第四版 課後練習題——用對稱法畫正弦函數代碼
剛開始閱讀《計算機圖形學》,看到其中有些練習題蠻有意思,決定試試看上機實驗。這篇文章記錄的是《計算機圖形學》第四版第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°內函數曲線。