1. 程式人生 > 程式設計 >C語言使用Bresenham演算法生成直線(easyx圖形庫)

C語言使用Bresenham演算法生成直線(easyx圖形庫)

Bresenham演算法是計算機圖形學領域使用最廣泛的直線掃描轉換方法。

其原理是:過各行、各列畫素中心構造一組虛擬網格線,按直線從起點到終點的順序計算直線各垂直網格線的交點,然後確定該列畫素中與此交點最近的畫素。

Bresenham演算法也是一種計算機圖形學中常見的繪製直線的演算法,其本質思想也是步進的思想,但由於避免了浮點運算,相當於DDA演算法的一種改進演算法。

C語言使用Bresenham演算法生成直線(easyx圖形庫)

C語言使用Bresenham演算法生成直線(easyx圖形庫)

C語言使用Bresenham演算法生成直線(easyx圖形庫)

原始碼展示:

#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();     //關閉圖形視窗
}

結果顯示:

C語言使用Bresenham演算法生成直線(easyx圖形庫)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。