C語言使用Bresenham演算法生成直線(easyx圖形庫)
阿新 • • 發佈:2020-03-25
Bresenham演算法是計算機圖形學領域使用最廣泛的直線掃描轉換方法。
其原理是:過各行、各列畫素中心構造一組虛擬網格線,按直線從起點到終點的順序計算直線各垂直網格線的交點,然後確定該列畫素中與此交點最近的畫素。
Bresenham演算法也是一種計算機圖形學中常見的繪製直線的演算法,其本質思想也是步進的思想,但由於避免了浮點運算,相當於DDA演算法的一種改進演算法。
原始碼展示:
#include<stdio.h> #include<graphics.h> #include<math.h> #include<conio.h> #define x0 400 //定義全域性變數x0,y0:座標軸中心(x0,y0) #define y0 300 void Bresenham(int x1,int y1,int x2,int y2) { int x,y,dx,dy,p1,i; dx = x2 - x1; dy = y2 - y1; if (abs(dx) > abs(dy)) //斜率絕對值在(0,1),步進方向為x軸 { if (x1 < x2) //預設畫點從左往右畫 { x = x1; y = y1; } else { x = x2; y = y2; } putpixel(x + x0,y0 - y,RED); Sleep(50); p1 = 2 * abs(dy) - abs(dx); //計算初始pi的值 for (i = min(x1,x2); i < max(x1,x2); i++) { x = x + 1; if (p1 >= 0) { if (dx*dy >= 0) y = y + 1; else y = y - 1; //若Pi>=0,y(i+1)=y(i)±1 p1 = p1 + 2 * (abs(dy) - abs(dx)); //更新pi } else { y = y; //若Pi<0,y(i+1)=y(i) p1 = p1 + 2 * abs(dy); //更新pi } putpixel(x + x0,RED); Sleep(50); } } else { if (y1 < y2) { //步進方向為y軸,預設畫點從下往上畫 x = x1; y = y1; } else { x = x2; y = y2; } putpixel(x + x0,RED); Sleep(50); p1 = 2 * abs(dx) - abs(dy); for (i = min(y1,y2); i < max(y1,y2); i++) { y = y + 1; if (p1 >= 0) { if (dx*dy >= 0) //判斷x方向是增加還是減少,很關鍵 x = x + 1; else x = x - 1; p1 = p1 + 2 * (abs(dx) - abs(dy)); } else { x = x; p1 = p1 + 2 * abs(dx); } putpixel(x + x0,RED); Sleep(50); } } } void main() { int x1,x2,y1,y2; printf("請輸入兩個整數點的座標(x1,y1),(x2,y2)\n"); scanf("%d %d %d %d",&x1,&y1,&x2,&y2); initgraph(800,600); //初始化圖形視窗大小 setbkcolor(WHITE); cleardevice(); setcolor(BLACK); line(0,y0,x0 * 2,y0); //座標軸X line(x0,x0,y0 * 2); //座標軸Y Bresenham(x1,y2); //Bresenham畫線演算法 _getch(); //等待一個任意輸入結束 closegraph(); //關閉圖形視窗 }
結果顯示:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。