推荐关注公众号「卤蛋实验室」或直接阅读博客原文,更新更及时,阅读体验更佳
写文不易,恳求各位观众老爷 点赞 👍,收藏 📁,评论 💬 三连支持一下!!!谢谢你,这对我真的很重要!
第一天我们搭建了 C++
的运行环境并画了一个点,根据 点 → 线 → 面
的顺序,今天我们讲讲如何画一条直线。
本文主要讲解直线绘制算法的推导和思路(莫担心,只涉及到一点点的中学数学知识),最后会给出代码实现,大家放心的看下去就好。
1.DDA 直线算法
1.1 简单实现
我们先来回顾一下中学的几何知识,如何在二维平面内表示一条直线?最常见的就是斜截式了:
y = k x + b y = kx + b y=kx+b
其中斜率是 k k k,直线在 y y y 轴上的截距是 b b b。
斜截式在数学上是没啥问题的,但是在实际的工程项目中,因为硬件资源是有限的,我们不可能也没必要表示一条无限长度的直线,现实往往是已知一条线段的起点 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) 和终点 ( x 2 , y 2 (x_2, y_2 (x2,y2),然后把它画出来。
这时候用两点式表示一根直线是最方便的,其中 x 1 ≤ x ≤ x 2 x_1 \leq x \leq x_2 x1≤x≤x2, y 1 ≤ y ≤ y 2 y_1 \leq y \leq y_2 y1≤y≤y2:
x − x 1 x 2 − x 1 = y − y 1 y 2 − y 1 \frac{x-x_{1}}{x_{2}-x_{1}}=\frac{y-y_{1}}{y_{2}-y_{1}} x2−x1x−x1=y2−y1y−y1
把上面的式子稍作变形,可以把 x x x 和 y y y 用参数 λ \lambda λ 表示:
x = λ ( x 2 − x 1 ) + x 1 y = λ ( y 2 − y 1 ) + y 1 } 0 ≤ λ ≤ 1 \left.\begin{array}{l}x=\lambda\left(x_{2}-x_{1}\right)+x_{1} \\ y=\lambda\left(y_{2}-y_{1}\right)+y_{1}\end{array}\right\} 0 \leq \lambda \leq 1 x=λ(x2−x1)+x1y=λ(y2−y1