當前位置:編程學習大全網 - 源碼下載 - Opengl鼠標事件源代碼

Opengl鼠標事件源代碼

// 6.Bresenham畫線算法。卡片打印處理機(Card Print Processor的縮寫)

#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();//程序的最後壹個函數激活窗口和圖形。使程序進入檢查鼠標和鍵盤的循環。

}

  • 上一篇:如何設計實現真正的響應式微服務系統
  • 下一篇:2021哪個月的牛好?它屬於牛出生的月份。
  • copyright 2024編程學習大全網