計算機圖形學-實驗2-Bresenham畫線算法

實驗二:

一、 實驗目的:

理解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;
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章