實驗二:
一、 實驗目的:
理解Bresenham畫線算法
二、 實驗內容:
編寫程序,用Bresenham畫線算法實現水平、垂直、斜率大於1、斜率小於1、斜率爲正、斜率爲負等各種情況。
三、 實現效果及步驟(或流程)
實現效果如下圖:
四、 創新設計和實現方法
(1)鍵盤事件,按F1清空屏幕,按F2退出應用。
實現方法:
1.第一步,main函數內添加對該方法的調用。
2.第二步,申請全局變量。
3.最後,編輯函數void ProcessSpecialKeyboead(int key,int x,int y)。
(2)鼠標事件,點擊窗口內兩點,劃線。
實現方法:
1.第一步,main函數內添加對該方法的調用。
2.第二步,申請全局變量。分別用以代表鼠標的左鍵、右鍵、按壓以及擡起。
3.最後,編輯函數DrawLine(int button,int state,int x,int y)。參數button代表鼠標按鍵、state代表狀態(擡起或按壓)以及x、y代表座標(以窗口左上角爲起點)。
核心畫線碼如下:
void lineBres(int x0, int y0, int xEnd, int yEnd)
{
glPointSize(2);
glColor3f(0.1, 0.0, 0.0);
glBegin(GL_POINTS);
//畫第一個點
if (x0 > xEnd)
{
int t;
t = x0; x0 = xEnd; xEnd = t;
t = y0; y0 = yEnd; yEnd = t;
}
int x = x0;
int y = y0;
glVertex2i(x, y);
//當線段垂直時。
if (x0 == xEnd)
{
while (y < yEnd)
{
y++;
glVertex2i(x, y);
}
glEnd();
glFlush();
return;
}
//當線段水平時。
if (y0 == yEnd)
{
while (x < xEnd)
{
x++;
glVertex2i(x, y);
}
glEnd();
glFlush();
return;
}
int dx = xEnd - x0;
int dy = yEnd - y0;
int twoDx = 2 * dx;
int twoDy = 2 * dy;
int twoDyMinusDx = 2 * (dy - dx);
int twoDxMinusDy = 2 * (dx - dy);
int twoDxAddDy = 2 * (dx + dy);
int p;
double k = (double)(yEnd - y0) / (double)(xEnd - x0);//斜率
//當線段斜率0<k<=1時。
if (0 < k && k <= 1)
{
p = 2 * dy - dx;
while (x < xEnd)
{
x++;
if (p < 0)
{
p += twoDy;
}
else
{
y++;
p += twoDyMinusDx;
}
glVertex2i(x, y);
}
glEnd();
glFlush();
return;
}
//當線段斜率-1<=k<0時。
if (k < 0 && k >= -1)
{
p = 2 * dy + dx;
while (x < xEnd)
{
x++;
if (p >= 0)
p += twoDy;
else
{
y--;
p += twoDxAddDy;
}
glVertex2i(x, y);
}
glEnd();
glFlush();
return;
}
//當線段斜率k<-1時。
if (k < -1)
{
p = 2 * dx - dy;
while (y > yEnd)
{
y--;
if (p >= 0)
p -= twoDx;
else
{
x++;
p -= twoDxAddDy;
}
glVertex2i(x, y);
}
glEnd();
glFlush();
return;
}
//當線段斜率k>1時。
if (k > 1)
{
p = dy;
while (y < yEnd)
{
y++;
if (p < 0)
{
p += twoDx;
}
else
{
x++;
p -= twoDyMinusDx;
}
glVertex2i(x, y);
}
glEnd();
glFlush();
return;
}
}