Bresenham 线绘制算法
背景理论:Bresenham 的线绘制算法是由 Bresenham 开发的一种高效准确的栅格线生成算法。它只涉及整数计算,因此准确,快速。它还可以扩展为显示另一条曲线的圆圈。
在 Bresenham 线描算法中:
对于斜率| m | <1:
x 的值都增加
或者使用决策参数增加 x 和 y。
对于斜率| m |> 1: 使用决策参数增加 y 的
值或者增加
x 和 y。
**斜率算法| m | <1:
-
输入线的两个端点(x1, y1)和(x2, y2)。
-
绘制第一个点(x1, y1)。
-
计算
Delx = | x2 - x1 |
Dely = | y2 - y1 | -
获得初始决策参数为
P = 2 * dely - delx -
对于 I = 0 到 delx 的步长为 1
如果 p <0 则
X1 = x1 + 1
Pot(x1, y1)
P = p + 2 *delyElse
X1 = x1 + 1
Y1 = y1 + 1
Plot(x1, y1)
P = p + 2* dely - 2 * delx如果
结束则结束
-
结束
源代码:
/* 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:
-
输入线的两个端点(x1, y1)和(x2, y2)。
-
绘制第一个点(x1, y1)。
-
计算
Delx = | x2 - x1 |
Dely = | y2 - y1 | -
获得初始决策参数为
P = 2 * delx - dely -
如果 I = 0,则步骤为 1
如果 p <0 则
y1 = y1 + 1
Pot(x1, y1)
P = p + 2 *delxElse
X1 = x1 + 1
Y1 = y1 + 1
Plot(x1, y1)
P = p + 2* delx - 2 * delyEnd if
end for
-
结束
源代码:
/* 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;
}