C語言使用Bresenham算法生成直線(easyx圖形庫)
Bresenham算法是計(jì)算機(jī)圖形學(xué)領(lǐng)域使用最廣泛的直線掃描轉(zhuǎn)換方法。
其原理是:過各行、各列像素中心構(gòu)造一組虛擬網(wǎng)格線,按直線從起點(diǎn)到終點(diǎn)的順序計(jì)算直線各垂直網(wǎng)格線的交點(diǎn),然后確定該列像素中與此交點(diǎn)最近的像素。
Bresenham算法也是一種計(jì)算機(jī)圖形學(xué)中常見的繪制直線的算法,其本質(zhì)思想也是步進(jìn)的思想,但由于避免了浮點(diǎn)運(yùn)算,相當(dāng)于DDA算法的一種改進(jìn)算法。
源代碼展示:
#include<stdio.h> #include<graphics.h> #include<math.h> #include<conio.h> #define x0 400 //定義全局變量x0,y0:坐標(biāo)軸中心(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)) //斜率絕對(duì)值在(0,1),步進(jìn)方向?yàn)閤軸 { if (x1 < x2) //默認(rèn)畫點(diǎn)從左往右畫 { x = x1; y = y1; } else { x = x2; y = y2; } putpixel(x + x0, y0 - y, RED); Sleep(50); p1 = 2 * abs(dy) - abs(dx); //計(jì)算初始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, y0 - y, RED); Sleep(50); } } else { if (y1 < y2) { //步進(jìn)方向?yàn)閥軸,默認(rèn)畫點(diǎn)從下往上畫 x = x1; y = y1; } else { x = x2; y = y2; } putpixel(x + x0, y0 - y, 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方向是增加還是減少,很關(guān)鍵 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, y0 - y, RED); Sleep(50); } } } void main() { int x1, x2, y1, y2; printf("請(qǐng)輸入兩個(gè)整數(shù)點(diǎn)的坐標(biāo)(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); //坐標(biāo)軸X line(x0, 0, x0, y0 * 2); //坐標(biāo)軸Y Bresenham(x1, y1, x2, y2); //Bresenham畫線算法 _getch(); //等待一個(gè)任意輸入結(jié)束 closegraph(); //關(guān)閉圖形窗口 }
結(jié)果顯示:
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C/C++中g(shù)etline函數(shù)案例總結(jié)
這篇文章主要介紹了C/C++中g(shù)etline函數(shù)案例總結(jié),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09C語言中for循環(huán)問題(一個(gè)小坑需注意)
這篇文章主要給大家介紹了關(guān)于C語言中for循環(huán)問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03