【计算机图形学|直线生成算法】Bresenham画法详解

这篇具有很好参考价值的文章主要介绍了【计算机图形学|直线生成算法】Bresenham画法详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

Bresenham画法是一种用于计算计算机图形中线条的算法,其原理是沿着所需绘制的线段中的像素点进行递增或递减,来进行准确的点阵绘制。

实现该算法的关键在于确定像素在基准线上的位置,以及在每次迭代时进行相应的调整。该算法比传统的直线算法更快且更准确,在低速处理器和低效内存设备上尤其适用。

Bresenham画法的思想可以拓展到曲线绘制、圆形绘制等其他图像绘制领域。

一、判别式推导

假设直线的表达式为 y = m x + b y = mx + b y=mx+b,并且线段 A D AD AD 与线段 T S TS TS 相交于点 M M M T M TM TM 的长度为 t t t M S MS MS 的长度为 s s s。实现算法需要计算 s s s t t t 的大小关系来确定选择上点或者下点。

bresenham算法,计算机图形学,图形渲染,学习
对于M点以及s与t的大小关系分析得出:

如果给定点 ( x i , y i ) (x_i, y_i) (xi,yi) 和点 ( x i + 1 , y i + 1 ) (x_{i+1}, y_{i+1}) (xi+1,yi+1),使用直线方程式 y = m x + b y = mx + b y=mx+b。那么,点 ( x i + 1 , y i + 1 ) (x_{i+1}, y_{i+1}) (xi+1,yi+1) 的坐标可以表示为:

x i + 1 = x i + 1 y i + 1 = m ( x i + 1 ) + b x_{i+1} = x_i + 1 \\ y_{i+1} = m(x_i + 1) + b xi+1=xi+1yi+1=m(xi+1)+b

此时,点 P P P 的坐标为 ( x i , y i ) (x_i, y_i) (xi,yi),点 S S S 的坐标为 ( x i , y i + 1 ) (x_i, y_i+1) (xi,yi+1),点 T T T 的坐标为 ( x i + 1 , y i + 1 ) (x_i+1, y_i+1) (xi+1,yi+1)

我们需要计算 s s s t t t 的值来判断绘制线段的方向

首先, s s s 的值为:

s = y i + 1 − y i = m ( x i + 1 ) + b − ( m x i + b ) = m s = y_{i+1} - y_i = m(x_i + 1) + b - (mx_i + b) = m s=yi+1yi=m(xi+1)+b(mxi+b)=m

其次, t t t 的值为:

t = 2 y i + 1 − 2 y i + 2 = 2 ( m ( x i + 1 ) + b ) − 2 ( m x i + b ) + 2 = 2 m ( x i + 1 − x i ) + 2 = 2 m + 2 \begin{aligned} t &= 2y_{i+1} - 2y_i + 2 \\ &= 2(m(x_i + 1) + b) - 2(mx_i + b) + 2 \\ &= 2m(x_i + 1 - x_i) + 2 \\ &= 2m + 2 \end{aligned} t=2yi+12yi+2=2(m(xi+1)+b)2(mxi+b)+2=2m(xi+1xi)+2=2m+2

假设 T M TM TM 的长度为 t t t S M SM SM 的长度为 s s s,那么 s − t s - t st 的值为

s − t = ( m x i + b + 1 ) − y i − ( y i + 1 − m x i − b ) = 2 ( m x i + 1 − y i ) s - t = (mx_i + b + 1) - y_i - (y_i + 1 - mx_i - b) = 2(mx_i + 1 - y_i) st=(mxi+b+1)yi(yi+1mxib)=2(mxi+1yi)

因此,我们可以按照下列规则判断绘制线段的方向:

  • 如果 s − t > 0 s - t > 0 st>0,根据 M 点在 T 点下面,我们可以得出 M 点到 T 点的距离大于至 S 点的距离。因此,下一个要绘制的点为 T 点
  • 如果 s − t < 0 s - t < 0 st<0根据 M 点在 T 点上面,我们可以得出 M 点到 T 点的距离小于至 S 点的距离。因此,下一个要绘制的点为 S 点
  • 如果 s − t = 0 s - t = 0 st=0,根据 M 点到 T 和 S 点的距离相等,我们可以随机选择 T 或 S 点作为下一个要绘制的点。

这样,我们就可以根据直线方程和点 ( x i , y i ) (x_i, y_i) (xi,yi) 来计算 ( x i + 1 , y i + 1 ) (x_{i+1}, y_{i+1}) (xi+1,yi+1) 的坐标,并根据 M 点的位置和距离来确定绘制线段的方向。

二、迭代推导

对于给定的两个点 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) ( x 2 , y 2 ) (x_2, y_2) (x2,y2),我们可以通过计算以这两个点为端点的直线的斜率和截距来计算点 ( x 1 + 1 , y 1 ) (x_1+1, y_1) (x1+1,y1) 对应的 B r e s e n h a m Bresenham Bresenham 算法中的决策参数 d i + 1 d_{i+1} di+1,以便确定下一个点的位置。具体来说,计算方法如下:

( x 1 , y 1 ) (x_1, y_1) (x1,y1) ( x 2 , y 2 ) (x_2, y_2) (x2,y2) 视为直线上的两个点,我们有:

Δ x = x 2 − x 1 Δ y = y 2 − y 1 m = Δ y Δ x \begin{aligned} \Delta x &= x_2 - x_1\\ \Delta y &= y_2 - y_1\\ m &= {\Delta y \over \Delta x}\\ \end{aligned} ΔxΔym=x2x1=y2y1=ΔxΔy

接下来,计算 s − t s-t st 的值:

s − t = 2 Δ y ( x 1 + 1 2 ) + 2 b − 2 y 1 − 1 = 2 Δ y ( x 1 + 1 2 ) − 2 Δ x ( y 1 + 1 2 ) + 2 b − 1 s-t = 2\Delta y(x_1+{1\over 2}) + 2b - 2y_1 - 1 = 2\Delta y(x_1+{1\over 2}) - 2\Delta x(y_1+{1\over 2})+2b-1 st=y(x1+21)+2b2y11=y(x1+21)x(y1+21)+2b1

将式子两边乘以 Δ x \Delta x Δx,得到:

Δ x ( s − t ) = 2 Δ y Δ x i − 2 Δ x y i + 2 b Δ x − Δ x \Delta x(s-t) = 2\Delta y\Delta xi-2\Delta xy_i+2b\Delta x-\Delta x Δx(st)=yΔxixyi+2bΔxΔx

d i = Δ x ( s − t ) di = \Delta x(s-t) di=Δx(st),我们可以写成:

d i = 2 Δ y i − 2 Δ x y i + C , C = 2 b Δ x − Δ x + 1 di = 2\Delta yi - 2\Delta xy_{i} + C, \qquad C=2b\Delta x - \Delta x+1 di=yixyi+C,C=2bΔxΔx+1

这个时候,我们需要计算 d i + 1 d_{i+1} di+1 d i d_{i} di 的差值。可以通过 C C C 带来的影响来计算。 x i + 1 x_{i+1} xi+1 的变化量为 1 1 1,那么显然有:

d i + 1 = 2 Δ y ( x i + 1 ) − 2 Δ x y i + 2 b Δ x − Δ x + 1 = 2 Δ y ( x i + 1 ) − 2 Δ x y i + 2 Δ y − 2 Δ x y i + C = d i + 2 Δ y − 2 Δ x y i + C \begin{aligned} di+1 &= 2\Delta y(x_{i+1})-2\Delta x y_i+2b\Delta x - \Delta x + 1\\ &= 2\Delta y(x_i+1)-2\Delta xy_i + 2\Delta y - 2\Delta xy_i + C\\ &= di+2\Delta y - 2\Delta xy_i+ C \end{aligned} di+1=y(xi+1)xyi+2bΔxΔx+1=y(xi+1)xyi+yxyi+C=di+yxyi+C

因此,

d i + 1 − d i = 2 Δ y − 2 Δ x ( y i + 1 − y i ) di+1 - di = 2\Delta y - 2\Delta x(y_{i+1}-y_i) di+1di=yx(yi+1yi)

至此,我们可以根据 d i + 1 − d i di+1 - di di+1di 的大小关系,来确定绘制线段的方向:

  • d i + 1 − d i ≥ 0 di+1-di \geq 0 di+1di0 时,取上点 T ′ T' T,即 y i + 1 = y i + 1 y_{i+1}=y_i+1 yi+1=yi+1
  • d i + 1 − d i < 0 di+1-di < 0 di+1di<0 时,取下点 S ′ S' S,即 y i + 1 = y i y_{i+1}=y_i yi+1=yi

这样,我们就可以根据两个点的坐标,计算出 B r e s e n h a m Bresenham Bresenham 算法中的决策参数 d i + 1 d_{i+1} di+1,并根据 d i + 1 − d i di+1-di di+1di 的大小关系确定 绘制线段的方向了。

bresenham算法,计算机图形学,图形渲染,学习

三、计算初值

假设初值为 ( x 0 , y 0 ) (x_0, y_0) (x0,y0),根据直线方程 y = m x + b y=mx+b y=mx+b,可以得到 m x 0 + b − y 0 = 0 mx_0+b-y_0=0 mx0+by0=0
将此式代入 d 0 = Δ x ( s − t ) = Δ x ( 2 m ( x 0 + 1 ) + 2 b − 2 y 0 − 1 ) d_0=\Delta x(s-t)=\Delta x(2m(x_0+1)+2b-2y_0-1) d0=Δx(st)=Δx(2m(x0+1)+2b2y01) 中,得到
d 0 = Δ x ( 2 m x 0 + 2 b − 2 y 0 + 2 m − 1 ) = Δ x ( 2 m − 1 ) d_0=\Delta x(2mx_0+2b-2y_0+2m-1)=\Delta x(2m-1) d0=Δx(2mx0+2b2y0+2m1)=Δx(2m1)。其中, m = Δ y Δ x m=\frac{\Delta y}{\Delta x} m=ΔxΔy,表示直线的斜率。

最终,我们可以使用公式 d 0 = 2 Δ y − Δ x d_0=2\Delta y-\Delta x d0=yΔx 来计算直线上初值 ( x 0 , y 0 ) (x_0, y_0) (x0,y0) 对应的位置。

四、总结

初始值 d 0 = 2 Δ y − Δ x d_0=2\Delta y-\Delta x d0=yΔx。根据直线方程 y = m x + b y=mx+b y=mx+b,得到下面的公式:

  • d i ≥ 0 d_i\geq 0 di0 时,取上点 T T T,则 d i + 1 = d i + 2 Δ y − 2 Δ x d_{i+1}=d_i+2\Delta y-2\Delta x di+1=di+yx

  • 如果 d i < 0 d_i<0 di<0,取下点 S S S,则 d i + 1 = d i + 2 Δ y d_{i+1}=d_i+2\Delta y di+1=di+y

其中,
Δ x = x 2 − x 1 Δ y = y 2 − y 1 \begin{aligned} \Delta x &= x_2 - x_1\\ \Delta y &= y_2 - y_1\\ \end{aligned} ΔxΔy=x2x1=y2y1

仅个人学习记录,欢迎大家交流,文章来源地址https://www.toymoban.com/news/detail-730504.html

到了这里,关于【计算机图形学|直线生成算法】Bresenham画法详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机图形学】作业:Bresenham 法绘制圆

    请采用 Bresenham 法绘制圆(共 30 分)。要求: (1) 给出算法的文字描述(共 15 分)。 (2) 编写函数,在给定圆心坐标和半径的情况下,计算出圆 上所有的点,并将这些点存储在数组中(共 15 分)。 输入圆的圆心(xc,yc),半径r。数组circlepoints为输出,保存圆上所有点。 初

    2024年01月24日
    浏览(50)
  • 计算机图形学06:中点Bresenham画圆(并填充边界,例如:边界用红色,内部用绿色填充)

    作者 :非妃是公主 专栏 :《计算机图形学》 博客地址 :https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 专栏名称 专栏地址 软件工程 专栏——软件工程 计算机图形学 专栏——计算机图形学 操作系统 专栏——操作系统 软件测试 专

    2024年01月24日
    浏览(39)
  • 【计算机图形学】图形变换(以任意直线为对称轴的对称变换)

    模块3-2 图形变换 一 实验目的 编写图形各种变换的算法 二 实验内容 1 :任意直线的对称变换。要求将变换矩阵写在实验报告中,并与代码匹配。求对任意直线Ax+By+C=0的对称变换矩阵。 实验结果如下图所示: 1:预设图形初始化 2:鼠标左键点击直线起点 3:鼠标右键点击直线

    2024年02月01日
    浏览(56)
  • Bresenham直线生成算法详解

            比较从理想直线到位于直线上方的像素的距离 t 和相邻的位于直线下方的像素的距离 s ,根据距 离误差项的 符号 确定与理想直线 最近的像素 ,如下图所示: 简言之就是判断t和s哪个点距离直线更近         已知当前的像素的 中心点 坐标为 (xi,yi) ,根据 

    2024年02月12日
    浏览(38)
  • 计算机图形学头歌实训平台答案——CG1-v2.0-直线绘制

    1.本关任务 (1)根据直线DDA算法补全line函数,其中直线斜率0k1; (2)当直线方程恰好经过P(x,y)和T(x,y+1)的中点M时,统一选取直线上方的T点为显示的像素点。 2.输入 (1)直线两端点坐标:(13, 20)和(180,140); (2)直线颜色为白色。 3.输出 程序运行结果为一条直线,具体结果如下图所示:

    2024年02月06日
    浏览(58)
  • 【计算机图形学】二维图形裁剪算法

    Cohen-Sutherland算法 Cohen-Sutherland是最早最流行的算法。 核心思想:通过 编码测试 来减少计算交点的次数。(编码算法) 1. 区域码: 线段端点以区域赋值以四位二进制码。 编码顺序:四位从右到左分别为:左边界、右边界、下边界、上边界。 编码值:落在相应位置为1,否则

    2024年02月02日
    浏览(58)
  • 计算机图形学:二维图形的几何变换(算法原理及代码实现)

    对于一个二维图形作平移、旋转、放缩变换,可以转换为在二维坐标系中图形的所有点分别可以对应到在x,y轴方向分别平移tx,ty(平移)、绕一点旋转固定的角(旋转)、在x,y轴方向分别放缩sx,sy倍。 对于变换的原理,只需要将原图形的点通过极坐标或者相加、相乘,再

    2024年02月11日
    浏览(46)
  • 计算机图形学03:改进的中点BH算法

    作者 :非妃是公主 专栏 :《计算机图形学》 博客地址 :https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 专栏名称 专栏地址 软件工程 专栏——软件工程 计算机图形学 专栏——计算机图形学 操作系统 专栏——操作系统 软件测试 专

    2024年01月17日
    浏览(46)
  • 【Weiler-Atherton算法】 计算机图形学多边形裁剪算法

    源代码: https://github.com/ricar0/Weiler-Atherton-Alogrithm/tree/master 通常来说就是利用多边形来裁剪多边形的一种方法,一般情况下是利用矩形来裁剪凹凸多边形 凸多边形 凹多边形 上面红色划线部分就是裁剪出的部分 OPENGL基础语法 基本上就是一些画线和画多边形的操作,难度较低

    2023年04月09日
    浏览(63)
  • 【计算机图形学】【代码复现】A-SDF中的数据集制作与数据生成

    Follow A-SDF 的 Data Generation 部分: We follow (1) ANSCH to create URDF for shape2motion dataset (1-2) URDF2OBJ(本人认为是1-2之间需要进行的重要的过渡部分) (2) Manifold to create watertight meshes (3) and modified mesh_to_sdf for generating sampled points and sdf values. follow这个github: ANSCH 在 global_info.py 中,主要修改

    2024年02月08日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包