【计算机图形学】Brensenham直线算法解析

Brensenham算法介绍

Brensenham算法是经典的计算机图形学中的直线算法,一般情况下我们都需要用斜截式的直线方程进行计算直线,按照x或者y进行步进。但是在计算的过程中,由于斜率K的存在,出现了大量的浮点数计算,导致绘图效率比较底下,Brensenham算法就是解决了浮点数运算的问题,将所有的计算都归结成为了int类型的计算。

Brensenham算法原理

直线分析

光栅化展示
上图就是描述了我们在光栅化直线的时候经常遇到的情况,在xi,yi这个位置,我们按照x方向来步进绘制,那么到底我们应该选择下一个像素点用yi呢,还是用yi+1呢?

关于这个问题,我们做一下研究探讨,从最简单的情况入手,即:

  1. 斜率小于1 ,如上图,从而决定了利用x方向作为步进的参考;
  2. x从小到大步进 ,如上图,从而决定了x方向步进的时候是加1而不是减1;

在画直线的时候,比如当前的点是xi,yi,那么当xi步进到xi + 1的时候,我们只需要知道直线穿过的那两个像素,到底谁的中心店距离真正的y比较近,就可以进行选择了。

算法公式推导

假设本条直线的方程式为:Y = kx + b
我们现在进行数学推导:

yi距离真正y的距离为: d_1 = k(x_i + 1) + b - y_i
yi + 1距离真正y的距离为:d_2 = (y_i + 1) - (x_i + 1) - b

那么我们可以计算双方的差值:d_1 - d_2 = 2k(x_i +1) - 2y_i + 2b-1

我们可以观察下,这里面还是有k这个不确定的变量,它有可能变成了浮点数,增加计算难度,那么我们可以得知:

K = dy / dx

只要两边都乘以dx是不是就可以消除浮点数的可能性影响
所以我们构建一个pi,令

pi = dx(d_1 - d_2 ) = 2dy . x_i - 2dx . y_i +(2dy + 2b . dx - dx)

由于在我们的假设条件下,dx是大于0,所以pi的正负就可以反馈他们的差值正负
我们令尾部的常数:c = (2dy + 2b . dx - dx),则:

P_(i+1) = 2dy . (x_i + 1) - 2dx . y_(i+1) + c

计算pi与p_i+1之间的差,我们可以得知:

P_(i+1) = P_i + 2dy - 2dx(y_(i+1) - y_i )

于是,我们可以通过循环迭代的方式来计算p值了,也就可以通过循环迭代判断当前是选择yi还是yi+1

接下来我们考察其实点x1,y1,看一下p的值

P_1 = 2dy - dx

那么初始的输入条件也满足了,我们就可以通过p_1的正负进行判断选择下一个像素的y值。

伪代码

初始值     p1=2△y-△x
当pi≥0时: yi+1=yi+1,
      xi+1=xi+1,
      pi+1=pi+2(△y-△x)
否则:   yi+1=yi,
      xi+1=xi+1,
      pi+1=pi+2△y

讨论

如果当前直线的斜率以及步进方式都不是按照我们给出的条件呢?那么其实只需要对步进的正负以及将xy颠倒即可,这点留给大家去思考解决

欢迎大家来学习图形学底层原理课程
课程解决的问题:
作为游戏行业或者图形学从业者,你是否面临以下问题:

到底openGL底层如何实现的?

到底矩阵操作变换是怎么做到的?

到底光栅化的算法以及原理是什么?

到底如何才能从3D世界投射到2D屏幕呢?

图形学有这么多的矩阵操作,到底如何推导如何应用呢?

学完这门课程,你应该就可以从底层了解一个初级的openGL图形接口如何实现,图形学最底层的封装到底面临哪些挑战;跟随我们一行一行写完代码,你就会得到一个迷你版本的openGL图形库,你可以深度体会图形从模型变换,观察矩阵变换,投影矩阵变换一直到光栅化纹理操作的全套模拟流程。

课程介绍:
本课程将带领学员不使用任何图形库,实现从0到1的图形学接口封装以及算法讲解,并且带领大家手敲代码,一行一行进行实现。

涵盖了(环境搭建,绘制点,Bresenham算法绘制完美直线,三角形拆分绘制算法,颜色插值算法,图片操作,图片二次插值放缩算法,纹理系统接口搭建及封装,矩阵操作理论以及实践,openGL类似接口封装,3D世界的图形学理论及接口封装等)

最终将带领大家通过C++实现一个3D世界的图形接口,方便所有人入门图形学,进行接下来的openGL接口以及GPU编程的学习

本课程为系列课程的第一步入门,且带领所有人进行实现,更加实用,可以让大家打牢图形学的基础知识及编程技能

课程链接:点击跳转课程页面,开始免费学习!

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

赵新政

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

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

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

打赏作者

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

抵扣说明:

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

余额充值