如何绘制直线


前言

本系列最终是要去绘制mesh的,既然这样我们就需要从最简单的开始,先绘制直线。
我们都知道有个算法-Bresenham’s Line Drawing Algorithm。但是为什么要用它,这个才是我们要讲的。

参考
gamma公式
本系列主要参考Dmitry V. Sokolov的软渲染教程,详细教程可阅读参考链接

一、最简单绘制直线的方法

说起直线,我的第一想法就是直线方程
y = k x + b y = kx+b y=kx+b
但是直接利用直线方程,然后直接去编写代码还其实挺困难的,我们先换一种方式考虑。

1.1 向量

向量可以被拆分成两条向量的和

那么我们利用这个性质就可以写出这么一段代码

for (float t=0.; t<1.; t+=.000001) 
{
   
    int x = x0 + (x1 - x0) * t;
    int y = y0 + (y1 - y0) * t;
    image.set(x, y, color);
}

这段代码非常简单,可以绘制任何方向上的直线,但是有个致命问题,就是非常消耗性能。t这个变量的取值决定了循环的次数,同时也影响了直线的连续性。因此我们必须改造这个方法。

二、Bresenham’s Line Drawing Algorithm

我对该算法的理解就是-只有加减法的算法

2.1 屏幕是离散的

注意以下只考虑第一象限,其他象限通过交换值即可解决

我们知道直线是连续的,但是我们的屏幕并非连续的,而是离散的,像素点之间是有1px距离的。

上面说了,直线其实是可以被拆开的,那么我们只让某一个轴进行递增,另外一轴跟着递增不就行了么,那么现在我们就可以去掉循环条件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值