Bresenham算法--计算机图形学

Bresenham算法用于在计算机图形学中近似绘制直线,通过对每个x位置的像素决策来确定最接近线段路径的像素。适用于斜率小于1的线段,通过计算决策参数Pk来决定选择上或下像素。算法流程包括输入端点、计算Δx和Δy、递归更新决策参数并判断绘制像素。对于斜率大于1的线段,可通过交换坐标轴实现。
摘要由CSDN通过智能技术生成

Bresenham画线算法:

在计算机中由像素构成的点很难直接画成直线,一般通过确定离散在直线附近的点来近似的确定直线。Bresenham算法可以通过确定直线附近的离散点来画线,同样可以运用于画圆。
(1)具体例子解释:在这个例子中,我们以单位x间隔取样,需要确定每次取样时两个可能的像素位置中的哪一个更接近于线段的路径
在这里插入图片描述

如图,从图6.4的左侧开始,第一个点如果是(10,11),那么下一个点可能是(11,11),也可能是(11,12),同理图6.5的左侧开始,第一个点如果是(50,50),那么下一个点可能是(51,50)或者(51,49),这时就要运用bresenham算法来确定具体选择哪个点。
(2)首先考虑斜率小于1的直线的扫描转换过程。沿先路径的像素位置由以x单位间隔取样来确定。从给定线段的左端点(x0,y0)开始,逐步处理每个后继位(x的位置),并在其扫描线y值最接近线段的像素上绘出一点。假设第k步的已经决定要显示的像素位置在(xk,yk),那么下一步就需要确定在列xk+1=xk+1上绘制哪个像素,即是在(xk+1,yk)还是在(xk+1,yk+1)。
(3)在取样位置xk+1,我们使用dlower和dupper来标识两个像素与数学上先路径的垂直便宜如图(6.7)
在这里插入图片描述

在像素列位置xk+1处的直线上的y坐标可计算为:y=m(xk+1)+b
那么 dlower=y-yk 同理 dupper=(yk+1)-y
=m(xk+1)+b-yk =yk+1-m(xk+1)-b

要确定两像素中那个更接近先路径,需测试这两个像素偏移的差:dlower-dupper=2m(xk+1)-2yk+2b-1
通过重新转换上式子,可以获得化纤算法第k步的决策参数pk,从而可以仅使用整数进行计算。设通过Δy和Δx分别为两端点从垂直和水平偏移量,令m=Δy/Δx,将决策参数定义为:Pk=Δx(dlower-dupper)
=2Δyxk-2Δxyk+c
线段上的坐标会沿x或y方向的单位步长而彼岸花。因此,可以利用递增整数运算得到后继的决策参数值。在k+1步,决策参数可以从上述式子中计算得出:
Pk+1=2Δyxk+1-2Δxyk+1+c
所以Pk+1-Pk=2Δy(xk+1-xk)-2Δx(yk+1-yk)
所以得到Pk+1=2Δy(xk+1-xk)-2Δx(yk+1-yk)+Pk
其中yk+1-yk取值0或1,取决于参数Pk的符号

当Pk>0的时候即dlower>dupper选择上面的像素,同理当Pk<0,选择下面的像素

决策参数的递归计算从线段左端点开始的每个整数x位置进行。起始像素位置(x0,y0)的第一个参数p0=2Δy-Δx

(4)算法流程:
|m|<1时的bresenham画线算法:
1)输入线段的两个端点,并将左端点储存在(x0,y0)中;
2)将(x0,y0)装入帧缓存,画出第一个点;
3)通过两个端点计算出Δx和Δy,并得到第一个决策参数值
4)从k=0开始,在沿线段路径的每个xk处,进行如下检测
《1》如果pk<0,下一个要绘制的点是(xk+1,yk),并且计算出Pk+1
《2》否则,下一个要绘制的点是(xk+1,yk+1)
5)重复步骤4,共进行Δx-1次
6)对于斜率大于1.0的线段,只要交换x和y方向的规则,即沿y方向以单位步长移动并计算最接近线路径的连续x值

参考资料:《计算机图形学第四版》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值