图形学————直线扫描转换

1 对图形的扫描转换一般分为两个步骤:先确定有关像素,在用图形的颜色或其他属性,对像素进行某种写操作。后者是通过调用设备驱动程序来实现的。

2 画一个像素宽的直线一般有三种常用的方法:数值微分法(DDA)   中心点画线法    Bresenham算法

3 DDA:确定斜率,然后算出来进行四舍五入 确定点的位置 

            优点:直观 可行

            缺点: 效率低

DDALine(x0,y0,x1,y1,color) (迭代算法)
int x0,y0,x1,y1,color;
{
int x;
float dx,dy,k,y;
dx=x1-x0;
dy=y1-y0;
k=dy/dx;
y=y0;

for(x=x0;x<=x1;x++)
{
drawpixel(x,int(y+0.5),color);
y=y+k;
}

}

注意:这个算法适用于|k|<=1,如果斜率超过了1,必须将x,y地位相换,y每加1,x加1/k

4 中心画线法:通过比对线的交点和中点的上下关系,进行确定。交点在上,y+1;交点在下,y。

   中心思想:F(x,y)=ax+by+c (a=y0-y1;b=x1-x0;c=x0y1-x1y0)

若点在F(x,y),则,F(x,y)=0

若F(x,y)>0,则中点在交点之上,选用下方的点

若F(x,y)<0,则中点在交点之下,选用上方的点

   提高效率:采用增量计算

d0=F(x0+1,y0+0.5)=ax0+by0+c+a+0.5b=F(x0,y0)+a+0.5b=a+0.5b

d1=F(x+2,y+0.5)=a(x+2)+b(y+0.5)+c=d+a;

d2=F(x+2,y+1.5)=a(x+2)+b(y+1.5)+c=d+a+b'

MidpointLine(x0,y0,x1,y1,color)
int x0,y0,x1,y1,color;
{
int a,b,delta1,delta2,d,x,y;
a=y0-y1;
b=x1-x0;
d=2*a+b;
delta1=2*a;
delta2=2*(a+b);

x=x0;
y=y0;
drawpixel(x,y,color);
while(x<x1)
{
if(d<0)
{
x++;y++;
d=d+delta1;
}
else
{
x++;
d=d+delta2;

}
drawpixel(x,y,color);
}
}


5 Bresenham 算法:过各行各列像素中心构造一组虚拟网格线,按照直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与此交点最近的像素


                    Bresenham_Line(x0,y0,x1,y1,color)
int x0,y0,x1,y1,color;
{
int x,y,dx,dy;
float k,e;
dx=x1-x0;
dy=y1-y0;
k=dy/dx;
e=-0.5//e=d-0.5;
x=x0;y=y0;

for(int i=0;i<=dx;i++)
{
drawpixel(x,y,color);
x=x+1;
e=e+k;

if(e>1)
{
y=y+1;
e=e-1;
}
}
}




若F(x,y)>0,则中点在交点之上
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值