Bresenham 算法

概述

Bresenham 是一个快速画直线的算法。在现实中,我们可以根据直线方程 y = k x + b y=kx+b y=kx+b 画出任意直线,但在计算机中却稍有不同。由于计算机屏幕是由很多栅格(像素点)组成,所以直线在放大后会变成这个样子:

在这里插入图片描述
所以如何画出这样一条直线就成了问题。而 Bresenham 算法就可以快速解决这个问题。


原理

设线段端点为 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) ( x 2 , y 2 ) (x_2,y_2) (x2,y2) Δ x , Δ y \Delta x,\Delta y Δx,Δy 为偏移量,直线方程为 f ( x ) = k x + b f(x)=kx+b f(x)=kx+b。则有:
k = y 2 − y 1 x 2 − x 1 = Δ y Δ x k=\frac{y_2-y_1}{x_2-x_1}=\frac{\Delta y}{\Delta x} k=x2x1y2y1=ΔxΔy

假设已经确定了直线上某个点正好在像素 P i ( x i , y i ) P_i(x_i,y_i) Pi(xi,yi),我们要确定下一个像素 P i + 1 P_{i+1} Pi+1 ( x i + 1 , y i ) (x_i+1,y_i) (xi+1,yi) 还是 ( x i + 1 , y i + 1 ) (x_i+1,y_i+1) (xi+1,yi+1)。此时的情况如下:

在这里插入图片描述
可以算出:
d 1 = f ( x i + 1 ) − y i d 2 = ( y i + 1 ) − f ( x i + 1 ) d 1 − d 2 = 2 k ( x i + 1 ) + 2 b − 2 y i − 1 \begin{align}d_1&=f(x_i+1)-y_i\\d_2&=(y_i+1)-f(x_i+1)\\d_1-d_2&=2k(x_i+1)+2b-2y_i-1\end{align} d1d2d1d2=f(xi+1)yi=(yi+1)f(xi+1)=2k(xi+1)+2b2yi1

我们可以把 g ( x i ) = d 1 − d 2 g(x_i)=d_1-d_2 g(xi)=d1d2 作为决策函数,用来判断下一个像素点的坐标,则有:

y i + 1 = { y i g ( x i ) ≤ 0 y i + 1 g ( x i ) > 0 y_{i+1}=\begin{cases}y_i&g(x_i)\le0\\y_i+1&g(x_i)>0\end{cases} yi+1={yiyi+1g(xi)0g(xi)>0

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SP FA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值