導航:首頁 > 源碼編譯 > 滑鼠分離演算法

滑鼠分離演算法

發布時間:2024-07-03 17:32:53

1. 在線等opengl程序 。要求是用滑鼠取兩個點,然後用bresenham演算法自動連成一條線。要可以運行的程序!!!

// 6.Bresenham畫線演算法.cpp
#pragma comment(lib, "openGL32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")

#include<iostream.h> // cout,cin
#include<math.h> // abs
#define GLUT_DISABLE_ATEXIT_HACK

#include<glut.h>
int x0,y01,xEnd,yEnd; // 全局變數(y0與math.h中的變數重名,故用y01代替)
int width=400,height=400;
void setPixel(GLint x,GLint y) // OpenGL畫點函數
{
glBegin(GL_POINTS); // 開始畫點
glVertex2i(x,y); // 根據2個整型值畫1個點
glEnd(); // 結束畫點
}
void lineBresenham()
{ // Bresenham畫線演算法。其中x0,y01,xEnd,yEnd是全局變數
int dx=xEnd-x0,dy=yEnd-y01; // Δx,Δy
int x,y,p;
int twoDy,twoDyMinusDx,twoDyAddDx; // 2Δy,2(Δy-Δx)
glClear(GL_COLOR_BUFFER_BIT); // 清除原顯示窗口,讓新顯示窗口出現(顏色緩存)
if(dy==0) // m=0,水平線,x坐標每次增1,y不變
{
if(x0>xEnd) // (x0,y01)為右端點
{ // 交換兩端的坐標,並令(x,y01)指示左端點
x=xEnd;
xEnd=x0;
x0=x;
}
else // (x0,y01)為左端點
x=x0; // 令(x,y01)指示左端點
while(x<=xEnd)
{
setPixel(x,y01);
x++;
}
}
else if(dx==0) // m=∞,垂直線,y坐標每次增1,x不變
{
if(y01>yEnd) // (x0,y01)為下端點
{ // 交換兩端的坐標,並令(x0,y)指示上端點
y=yEnd;
yEnd=y01;
y01=y;
}
else // (x0,y01)為上端點
y=y01; // 令(x0,y)指示上端點
while(y<=yEnd)
{
setPixel(x0,y);
y++;
}
}
else if(dx==dy) // 45度(撇),m=1,x、y坐標每次各增1
{
if(x0>xEnd) // (x0,y01)為右端點
{ // 交換兩端的坐標,並令(x,y)指示左端點
x=xEnd;
y=yEnd;
xEnd=x0;
yEnd=y01;
x0=x;
y01=y;
}
else // (x0,y01)為左端點
{ // 令(x,y)指示左端點
x=x0;
y=y01;
}
while(x<=xEnd)
{
setPixel(x,y);
x++;
y++;
}
}
else if(dx==-dy) // -45度(捺),m=-1,x坐標每次增1,y坐標每次減1
{
if(x0>xEnd) // (x0,y01)為右端點
{ // 交換兩端的坐標,並令(x,y)指示左端點
x=xEnd;
y=yEnd;
xEnd=x0;
yEnd=y01;
x0=x;
y01=y;
}
else // (x0,y01)為左端點
{ // 令(x,y)指示左端點
x=x0;
y=y01;
}
while(x<=xEnd)
{
setPixel(x,y);
x++;
y--;
}
}
else if(abs(dx)>abs(dy)) // 0<|m|<1.0,x坐標每次增1
{
if(x0>xEnd) // (x0,y01)為右端點
{ // 交換兩端的坐標,並令(x,y)指示左端點
x=xEnd;
y=yEnd;
xEnd=x0;
yEnd=y01;
x0=x;
y01=y;
dx=-dx; // Δx
dy=-dy; // Δy
}
else // (x0,y01)為左端點
{ // 令(x,y)指示左端點
x=x0;
y=y01;
}
twoDy=2*dy; // 2Δy
twoDyMinusDx=2*(dy-dx); // 2(Δy-Δx)
twoDyAddDx=2*(dy+dx); // 2(Δy+Δx)
if(dy>0) // 0<m<1.0
{
p=2*dy-dx; // p0=2Δy-Δx
while(x<=xEnd)
{
setPixel(x,y);
x++;
if(p<0)
p+=twoDy;
else
{
y++;
p+=twoDyMinusDx;
}
}
}
else // -1<m<0
{
p=2*dy+dx; // p0=2Δy+Δx
while(x<=xEnd)
{
setPixel(x,y);
x++;
if(p<0)
{
y--;
p+=twoDyAddDx;
}
else
p+=twoDy;
}
}
}
else if(abs(dx)<abs(dy)) // 1.0<|m|<∞,y坐標每次增1
{
if(y01>yEnd) // (x0,y01)為下端點
{ // 交換兩端的坐標,並令(x,y)指示上端點
x=xEnd;
y=yEnd;
xEnd=x0;
yEnd=y01;
x0=x;
y01=y;
dx=-dx; // Δx
dy=-dy; // Δy
}
else // (x0,y01)為上端點
{ // 令(x,y)指示上端點
x=x0;
y=y01;
}
twoDy=2*dx; // 2Δx
twoDyMinusDx=2*(dx-dy); // 2(Δx-Δy)
twoDyAddDx=2*(dx+dy); // 2(Δx+Δy)
if(dx>0) // 1.0<m<∞
{
p=2*dx-dy; // p0=2Δx-Δy
while(y<=yEnd)
{
setPixel(x,y);
y++;
if(p<0)
p+=twoDy;
else
{
x++;
p+=twoDyMinusDx;
}
}
}
else // -1<m<0
{
p=2*dx+dy; // p0=2Δx+Δy
while(y<=yEnd)
{
setPixel(x,y);
y++;
if(p<0)
{
x--;
p+=twoDyAddDx;
}
else
p+=twoDy;
}
}
}
glFlush(); // 盡可能快地處理畫圖
}

void main(int argc,char** argv) // 可不輸入參數
{
cout<<"請輸入x0 y0 xEnd yEnd:"<<endl;
cin>>x0>>y01>>xEnd>>yEnd;
glutInit(&argc,argv); // 初始化GLUT
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); // 設置窗口的緩存和顏色模型
glutInitWindowPosition(0,0); // 設置窗口左上角的坐標(在屏幕左上角)
glutInitWindowSize(width,height); // 設置窗口的大小
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); // 對三維圖形作正投影
glLoadIdentity(); // 初始化模型變換矩陣
gluOrtho2D(0.0,width,0.0,height); // 二維笛卡爾坐標系,x和y的起止坐標
glutDisplayFunc(lineBresenham); // 顯示畫線函數lineBresenham()
glutMainLoop(); // 程序的最後一個函數,激活窗口及圖形。使程序進入檢查滑鼠鍵盤的循環中
}

閱讀全文

與滑鼠分離演算法相關的資料

熱點內容
海康錄像機怎麼關視頻加密 瀏覽:786
編程以後有可能被機器人代替嗎 瀏覽:522
windows創建文件命令 瀏覽:986
linuxcopy文件內容 瀏覽:383
程序員帥哥禿頂 瀏覽:839
阿里雲伺服器開通流程 瀏覽:105
如何開雲伺服器 瀏覽:979
網站小說源碼 瀏覽:301
php用什麼ide 瀏覽:867
網上預約課程app哪個好 瀏覽:152
android兼容測試工具 瀏覽:96
雲伺服器不支持虛擬化怎麼辦 瀏覽:189
加密方式的演變 瀏覽:364
java常用演算法pdf 瀏覽:734
伺服器數據遇到異常什麼原因 瀏覽:450
phpexif信息 瀏覽:543
單片機三位元組浮點數 瀏覽:756
命令與征服泰伯利亞戰爭下載 瀏覽:378
c窗口界面編程 瀏覽:24
hypermill編程能做模板嗎 瀏覽:783