Bresenham 線繪製演算法

背景理論:Bresenham 的線繪製演算法是由 Bresenham 開發的一種高效準確的柵格線生成演算法。它只涉及整數計算,因此準確,快速。它還可以擴充套件為顯示另一條曲線的圓圈。

在 Bresenham 線描演算法中:

對於斜率| m | <1:
x 的值都增加
或者使用決策引數增加 x 和 y。

對於斜率| m |> 1: 使用決策引數增加 y 的
值或者增加
x 和 y。

**斜率演算法| m | <1:

  1. 輸入線的兩個端點(x1, y1)和(x2, y2)。

  2. 繪製第一個點(x1, y1)。

  3. 計算
    Delx = | x2 - x1 |
    Dely = | y2 - y1 |

  4. 獲得初始決策引數為
    P = 2 * dely - delx

  5. 對於 I = 0 到 delx 的步長為 1

    如果 p <0 則
    X1 = x1 + 1
    Pot(x1, y1)
    P = p + 2 *dely

    Else
    X1 = x1 + 1
    Y1 = y1 + 1
    Plot(x1, y1)
    P = p + 2* dely - 2 * delx

    如果

    結束則結束

  6. 結束

原始碼:

/* A C program to implement Bresenham line drawing algorithm for |m|<1 */
#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>

int main()
{    
 int gdriver=DETECT,gmode;
 int x1,y1,x2,y2,delx,dely,p,i;
 initgraph(&gdriver,&gmode,"c:\\TC\\BGI");

printf("Enter the intial points: ");
scanf("%d",&x1);
scanf("%d",&y1);
printf("Enter the end points: ");
scanf("%d",&x2);
scanf("%d",&y2);

putpixel(x1,y1,RED);

delx=fabs(x2-x1);
dely=fabs(y2-y1);
p=(2*dely)-delx;
for(i=0;i<delx;i++){
if(p<0)
{
 x1=x1+1;
 putpixel(x1,y1,RED);
 p=p+(2*dely);
}
else
{
 x1=x1+1;
 y1=y1+1;
 putpixel(x1,y1,RED);
 p=p+(2*dely)-(2*delx);
}
}
 getch();
 closegraph();
 return 0;
}

斜率演算法| m |> 1:

  1. 輸入線的兩個端點(x1, y1)和(x2, y2)。

  2. 繪製第一個點(x1, y1)。

  3. 計算
    Delx = | x2 - x1 |
    Dely = | y2 - y1 |

  4. 獲得初始決策引數為
    P = 2 * delx - dely

  5. 如果 I = 0,則步驟為 1

    如果 p <0 則
    y1 = y1 + 1
    Pot(x1, y1)
    P = p + 2 *delx

    Else
    X1 = x1 + 1
    Y1 = y1 + 1
    Plot(x1, y1)
    P = p + 2* delx - 2 * dely

    End if

    end for

  6. 結束

原始碼:

/* A C program to implement Bresenham line drawing algorithm for |m|>1 */
#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>
int main()
{
int gdriver=DETECT,gmode;
int x1,y1,x2,y2,delx,dely,p,i;
initgraph(&gdriver,&gmode,"c:\\TC\\BGI");
printf("Enter the intial points: ");
scanf("%d",&x1);
scanf("%d",&y1);
printf("Enter the end points: ");
scanf("%d",&x2);
scanf("%d",&y2);
putpixel(x1,y1,RED);
delx=fabs(x2-x1);
dely=fabs(y2-y1);
p=(2*delx)-dely;
for(i=0;i<delx;i++){
if(p<0)
{
y1=y1+1;
putpixel(x1,y1,RED);
p=p+(2*delx);
}
else
{
x1=x1+1;
y1=y1+1;
putpixel(x1,y1,RED);
p=p+(2*delx)-(2*dely);
}
}
getch();
closegraph();
 return 0;
}