1. 程式人生 > >計算機圖形學實驗--DDA演算法的實現

計算機圖形學實驗--DDA演算法的實現

1. DDA演算法(數值微分法)原理:

    1)網上或者計算機圖形學書本上有詳細介紹。

    2)最核心的是選定(x2-x1)和(y2-y1)中較大者為步進方向。

2. 實現工具:     1) VS2017(C++)     2) 下載外掛:Easyx 。使用方法和下載見官網: [https://www.easyx.cn/]

3. 原始碼展示:

#include<iostream>
#include<graphics.h>
#include<math.h>
#include<conio.h>
using namespace std;
void DDA(int x1, int y1, int x2, int y2) {
	int i, steps, dx, dy;
	int x0 = 400, y0 = 300;
	float x, y, delta_x, delta_y;
	dx = x2 - x1;
	dy = y2 - y1;
	if (abs(dx) >= abs(dy))
		steps = abs(dx);
	else
		steps = abs(dy);
	delta_x = float(1.0*dx / steps);                        //讓結果為浮點數
	delta_y = float(1.0*dy / steps);
	x = x1;
	y = y1;
	putpixel((x + x0), (y0 - y), RED);                      //畫第一個點
	//cout << "("<<x  << ","<<y <<")"<< endl;               //輸出第一個點的文字資訊
	Sleep(50);                 
	for (i = 1; i <= steps; i ++) {
		x = x + delta_x;
		y = y + delta_y;
		putpixel((x + x0), (y0 - int(y + 0.5)), RED);
		//cout <<"(" << x << ","<<int(y + 0.5) <<")"<< endl;//可以選擇輸出點來驗證結果
		Sleep(50);                                          //兩個點間隔50毫秒
	}
}
int main() {
	int x1,x2,y1,y2;
	int x0=400, y0=300;			//座標軸中心(x0,y0)
	cout << "請輸入兩個整數點的座標(x1,y1),(x2,y2)" << endl;
	cin >> x1 >> y1 >> x2 >> y2;
        initgraph(x0*2,y0*2);		        //初始化圖形視窗大小
	line(0,y0,x0*2,y0);			//座標軸X
	line(x0,0,x0,y0*2);			//座標軸Y
        DDA(x1,y1,x2,y2);                       //DDA畫線演算法
	_getch();                               //等待一個任意輸入結束
	closegraph();                           //關閉圖形視窗
	return 0;
}

4. 結果展示:

    1)輸出點座標驗證DDA演算法:鍵盤輸入13 20 -10 5(把相關圖形視窗的程式碼註釋掉然後加上輸出點的程式碼即可)

         上課時老師給的DDA練習:

程式輸出截圖:

    2)圖形化展示:(鍵盤輸入0 0 400 300)

5. 個人感悟:

    1)DDA演算法上課的時候理解了,寫程式還是會有很多不容易發現的錯誤例如小數與整數之間轉換,困擾了很久。

    2)剛開始下載VS的時候,執行hello world需要一分鐘,系統顯示一直在載入各種各樣的符號。

          解決辦法:VS選單欄 工具>選項> 除錯>符號>取消Microsoft符號伺服器

    3)畫圖環境就弄了一晚上,水平太菜,DDA演算法又是一晚上,效率不行。

    4)第一次寫部落格,程式碼和排版有限,請大家多多指教。