#pragma註釋(lib,“openGL32.lib”)
#pragma註釋(lib," glu32.lib ")
#pragma註釋(lib," glaux.lib ")
# include & ltiostream.h & gt//CIN cout
# include & ltmath.h & gt// abs
# define GLUT _ DISABLE _ ate xit _ HACK
# include & ltglut.h & gt
int x0,y01,xEnd,yEnd//全局變量(y0與math.h中的變量同名,所以替換為y01)。
int width=400,height = 400
Voidsetpixel (glint x,glint y)//OpenGL繪圖函數
{
GL begin(GL _ POINTS);//開始畫點
glVertex2i(x,y);//根據2個整數值畫出1個點。
glEnd();//結束繪圖點
}
void lineBresenham()
{// Bresenham畫線算法。其中x0、y01、xend和yend是全局變量。
int dx=xEnd-x0,dy = yEnd-y 01;//δx,δy
int x,y,p;
int twoDy,twoDyMinusDx,twoDyAddDx//2δy,2(δy-δx)
GL clear(GL _ COLOR _ BUFFER _ BIT);//清除原來的顯示窗口,讓新的顯示窗口出現(顏色緩存)
如果(dy==0) // m=0,水平線和X坐標每次增加1,Y不變。
{
如果(x0 & gtXEnd) // (x0,y01)是右端點。
{//交換兩端坐標,使(x,y01)表示左端點。
x = xEnd
xEnd = x0
x0 = x;
}
Else // (x0,y01)為左端點。
x = x0//Order (x,y01)表示左端點。
while(x & lt;=xEnd)
{
setPixel(x,y 01);
x++;
}
}
Else if(dx==0) // m=∞,垂直線和y坐標每次增加1,x不變。
{
if(y 01 & gt;YEnd) // (x0,y01)是下端點。
{//交換兩端坐標,使(x0,y)表示上端點。
y = yEnd
yEnd = y 01;
y 01 = y;
}
Else // (x0,y01)是上端點。
y = y 01;//Order (x0,y)表示上端點。
while(y & lt;=日元)
{
setPixel(x0,y);
y++;
}
}
Else if(dx==dy) // 45度(撇號),m=1,x,y坐標每次增加1。
{
如果(x0 & gtXEnd) // (x0,y01)是右端點。
{//交換兩端坐標,使(x,y)表示左端點。
x = xEnd
y = yEnd
xEnd = x0
yEnd = y 01;
x0 = x;
y 01 = y;
}
Else // (x0,y01)為左端點。
{//Order (x,y)表示左端點。
x = x0
y = y 01;
}
while(x & lt;=xEnd)
{
setPixel(x,y);
x++;
y++;
}
}
Else如果(dx = =-dy)/-45度(si),m=-1,x坐標增加1,y坐標減少1。
{
如果(x0 & gtXEnd) // (x0,y01)是右端點。
{//交換兩端坐標,使(x,y)表示左端點。
x = xEnd
y = yEnd
xEnd = x0
yEnd = y 01;
x0 = x;
y 01 = y;
}
Else // (x0,y01)為左端點。
{//Order (x,y)表示左端點。
x = x0
y = y 01;
}
while(x & lt;=xEnd)
{
setPixel(x,y);
x++;
y-;
}
}
else if(abs(dx)>ABS(dy))//0 & lt;| m | & lt1.0,x坐標每次增加1。
{
如果(x0 & gtXEnd) // (x0,y01)是右端點。
{//交換兩端坐標,使(x,y)表示左端點。
x = xEnd
y = yEnd
xEnd = x0
yEnd = y 01;
x0 = x;
y 01 = y;
dx =-dx;//δx
dy =-dy;//δy
}
Else // (x0,y01)為左端點。
{//Order (x,y)表示左端點。
x = x0
y = y 01;
}
twoDy = 2 * dy//2δy
twoDyMinusDx = 2 *(dy-dx);//2(δy-δx)
twoDyAddDx = 2 *(dy+dx);//2(δy+δx)
if(dy & gt;0)//0 & lt;m & lt1.0
{
p = 2 * dy-dx;//P0 = 2δy-δx
while(x & lt;=xEnd)
{
setPixel(x,y);
x++;
如果(p & lt0)
p+= twoDy;
其他
{
y++;
p+= twoDyMinusDx;
}
}
}
else//-1 & lt;m & lt0
{
p = 2 * dy+dx;//P0 = 2δy+δx
while(x & lt;=xEnd)
{
setPixel(x,y);
x++;
如果(p & lt0)
{
y-;
p+= twoDyAddDx;
}
其他
p+= twoDy;
}
}
}
else if(ABS(dx)& lt;ABS(dy))//1.0 & lt;| m | & lt∞,y坐標每次增加1。
{
if(y 01 & gt;YEnd) // (x0,y01)是下端點。
{//交換兩端坐標,使(x,y)表示上端點。
x = xEnd
y = yEnd
xEnd = x0
yEnd = y 01;
x0 = x;
y 01 = y;
dx =-dx;//δx
dy =-dy;//δy
}
Else // (x0,y01)是上端點。
{//命令(x,y)表示上端點。
x = x0
y = y 01;
}
twoDy = 2 * dx//2δx
twoDyMinusDx = 2 *(dx-dy);//2(δx-δy)
twoDyAddDx = 2 *(dx+dy);//2(δx+δy)
if(dx & gt;0)//1.0 & lt;m & lt∞
{
p = 2 * dx-dy;//P0 = 2δx-δy
while(y & lt;=日元)
{
setPixel(x,y);
y++;
如果(p & lt0)
p+= twoDy;
其他
{
x++;
p+= twoDyMinusDx;
}
}
}
else//-1 & lt;m & lt0
{
p = 2 * dx+dy;//P0 = 2δx+δy
while(y & lt;=日元)
{
setPixel(x,y);
y++;
如果(p & lt0)
{
x-;
p+= twoDyAddDx;
}
其他
p+= twoDy;
}
}
}
GL flush();//盡快處理繪圖。
}
Void main(int argc,char** argv) //不需要輸入參數。
{
cout & lt& lt"請輸入x 0 y0 xx end:"
CIN & gt;& gtx0 & gt& gty01 >& gtxEnd & gt& gtyEnd
明膠(& ampargc,argv);//初始化GLUT
glutInitDisplayMode(GLUT _ SINGLE | GLUT _ RGB);//設置窗口的緩存和顏色模型。
glutInitWindowPosition(0,0);//設置窗口左上角的坐標(在屏幕的左上角)
glutInitWindowSize(寬度,高度);//設置窗口的大小
GlutCreateWindow("畫線算法1 ");//創建壹個窗口,並在標題欄中顯示壹個字符串。
glClearColor(1.0,1.0,1.0,0.0);//設置白色背景(R,G,B,透明),默認為黑色。
glColor3f(1.0,0.0,0.0);//用3個浮點數表示前景色(紅色),默認值為白色。
glMatrixMode(GL _ PROJECTION);//三維圖形的正投影
glload identity();//初始化模型轉換矩陣
glutortho 2d(0.0,寬度,0.0,高度);//二維笛卡爾坐標系,X和y的起止坐標。
glutDisplayFunc(lineBresenham);//顯示畫線函數lineBresenham()
glutMainLoop();//程序的最後壹個函數激活窗口和圖形。使程序進入檢查鼠標和鍵盤的循環。
}