直线段的扫描转换算法

直线的扫描转换就是确定最佳逼近于该直线的一组象素,并且按扫描线顺序,对这些象素进行写操作。

通常有数值微分法(DDA)、中点画线法、Bresenham算法这三个算法。

数值微分法(DDA):

void LineDDA ( int x0,int y0,int x1,int y1,int color)
{
int x,y;
float dx,dy,k;
dx= float(x1-x0);
dy= float(y1-y0);
k=dy/dx;
if(abs(k)<1)
{
for(x=x0; x<=x1, x++)
{
Setpixel(x, int(y+0.5), color);
y+=k;
}
}
else
{
for(y=y0; y<=y1, y++)
{
Setpixel(int(x+0.5),y,color);
x+=1/k;
}
}
}


中点画线法:

MidPointLine(x0,y0,x1,y1,color)
{
int x0,y0,x1,y1,color;
int a,b,d,d1,d2,x,y;
a = y0-y1;b = x1-x0;
d = 2 * a +b;
d1 = 2*a;d2 = 2*(a+b);
x = x0;y = y0;
Setpixel(x,y,color);
while(x<x1)
{
if(d<0)
{
x++; y++; d+=d2;
}
else
{
x++; d+=d1;
}
Setpixel(x,y,color);
}
}


Bresenham算法:

void InterBresenhamline(int x0,int y0,int x1, int y1,int color)
{
int dx,dy,x,y,i;
float e;
dx = x1-x0; dy = y1- y0;
e=-dx;
x=x0; y=y0;
for(i=0; i<= dx; i++)
{
Setpixel(x, y, color);
x++;
e=e+2*dy;
if(e>=0)
{
y++;
e=e-2*dx;
}
}
}



转载于:https://www.cnblogs.com/xiacl/archive/2012/03/22/2410926.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值