赞
踩
光栅化(Rasterization)是一种计算机图形学技术,用于将几何图形(如矢量图形、3D模型)转换成由像素或点组成的光栅图像(raster image)。这个过程通常在图形硬件(如显卡)上进行,用于生成最终在屏幕上显示的图像。
上面来自chatGPT,对于有图形学基础的人还是很好理解。
我这里单纯用绘制2D图形的两个案例,用大白话简易解释一下:
(1)给屏幕坐标系中的两个点坐标,如何绘制出以这两个点为首尾的直线?这就是直线光栅化的作用;
(2)给屏幕坐标系中三个点,如何绘制以这三个点为顶点的填充三角形?这就是三角形光栅化的作用;
再次声明,以此类推,这些说辞都是方便理解用的,并不专业!
计算机图形通常以矢量形式存储和处理,包括点、线、三角形等基本几何形状。
然而,显示设备(如计算机屏幕、手机屏幕)是基于像素的。这意味着最终显示图像需要将矢量图形转换为像素阵列,光栅化正是这个转换过程。
使用场景比较:
咱们重点讲述Bresemham算法!也是最常用的!
已知两个点 p 1 ( x 1 , y 1 ) , p 2 ( x 2 , y 2 ) p1(x_1,y_1),p2(x_2,y_2) p1(x1,y1),p2(x2,y2) 请在屏幕像素空间绘制一条直线。
最简单的问题模型满足如下条件:
概念图如下:
顶级理解: 假设当前直线已经通过点 ( x i , y i ) (x_i,y_i) (xi,yi) ,那么当 x i − > x i + 1 x_i -> x_i + 1 xi−>xi+1 ,此时的 y i y_i yi 如何变动呢?如下图所示:
其实 y i y_i yi 的变动只有两个选择,要么 y i − > y i y_i -> y_i yi−>yi 保持不变,要么 y i y_i yi -> y i + 1 y_{i + 1} yi+1 向上增加一个像素。
这两种情况说人话:一个向正东移动、一个向东北方移动!
问题来了: 那么何时朝正东移动,何时朝东北移动,依据什么呢?如下图所示:
感官上来看: 依据直线是朝下倾斜一点,还是朝上倾斜一点。
数学表达来看: 根据上图的 d 0 d_0 d0 和 d 1 d_1 d1 谁更大( d 0 d_0 d0 更大,表明向下倾斜,反之向上)
让我们开始步入数学公式的殿堂:
d
0
=
y
i
+
1
−
k
(
x
i
+
1
)
−
b
d
1
=
k
(
x
i
+
1
)
+
b
−
y
i
既然要比较
d
0
d_0
d0 和
d
1
d_1
d1 的大小,咱们就用
d
1
d_1
d1 -
d
0
d_0
d0 :
d
1
−
d
0
=
k
(
x
i
+
1
)
+
b
−
y
i
−
[
y
i
+
1
−
k
(
x
i
+
1
)
−
b
]
=
2
k
(
x
i
+
1
)
−
2
y
i
−
1
+
2
b
由于模型简化,根据已知条件:
k
=
y
2
−
y
1
x
2
−
x
1
Δ
x
=
x
2
−
x
1
>
0
所以,等式两边同乘 Δ x \Delta x Δx ,表达式正负号不会发生变化,记 p i = Δ x ( d 1 − d 0 ) p_i = \Delta x(d_1 - d_0) pi=Δx(d1−d0)
p
i
=
Δ
x
(
d
1
−
d
0
)
=
Δ
x
∗
[
2
k
(
x
i
+
1
)
−
2
y
i
−
1
+
2
b
]
=
Δ
x
∗
[
2
∗
y
2
−
y
1
x
2
−
x
1
∗
(
x
i
+
1
)
−
2
y
i
−
1
+
2
b
]
=
Δ
x
∗
[
2
∗
Δ
y
Δ
x
∗
(
x
i
+
1
)
−
2
y
i
−
1
+
2
b
]
=
2
Δ
y
∗
(
x
i
+
1
)
+
Δ
x
(
−
2
y
i
−
1
+
2
b
)
=
2
Δ
y
∗
(
x
i
+
1
)
−
Δ
x
(
2
y
i
+
1
−
2
b
)
=
2
Δ
y
∗
x
i
−
2
Δ
x
y
i
+
[
2
Δ
y
+
(
2
b
−
1
)
Δ
x
]
推导到这,咱们观察一下: Δ y \Delta y Δy已知、 Δ x \Delta x Δx已知,所以 p i p_i pi 的值就取决于 x i x_i xi、 y i y_i yi、b的值
因为咱们发现出现了b,b很有可能是浮点数,是不满足咱们这个算法的要求的,于是伟大的思路,要求我们尝试构造递推关系式,来进行对b消去!
迭代模型:
p
i
=
2
Δ
y
x
i
−
2
Δ
x
y
i
+
[
2
Δ
y
+
(
2
b
−
1
)
Δ
x
]
p
i
+
1
=
2
Δ
y
(
x
i
+
1
)
−
2
Δ
x
y
i
+
1
+
[
2
Δ
y
+
(
2
b
−
1
)
Δ
x
]
p
i
+
1
−
p
i
=
2
Δ
y
−
2
Δ
x
(
y
i
+
1
−
y
i
)
惊奇的发现,b被消去了,大功告成,这是我们发现:计算 p i + 1 p_{i+1} pi+1 的值,只和 p i p_i pi 以及 y i + 1 y_{i+1} yi+1 和 y i y_i yi 有关系!
所以咱们需要单独计算 p 1 p_1 p1,咱们就用这个公式: p i = 2 Δ y x i − 2 Δ x y i + [ 2 Δ y + ( 2 b − 1 ) Δ x ] p_i = 2\Delta yx_i - 2\Delta xy_i + [2\Delta y + (2b-1)\Delta x] pi=2Δyxi−2Δxyi+[2Δy+(2b−1)Δx]
令 i i i = 1,带入 ( x 1 , k x 1 + b ) (x_1, kx_1 + b) (x1,kx1+b)
咱们得到:
p
1
=
2
Δ
y
x
i
−
2
Δ
x
y
i
+
[
2
Δ
y
+
(
2
b
−
1
)
Δ
x
]
=
2
Δ
y
x
1
−
2
Δ
x
(
k
x
1
+
b
)
+
[
2
Δ
y
+
(
2
b
−
1
)
Δ
x
]
=
2
Δ
y
x
1
−
2
Δ
x
(
Δ
y
Δ
x
x
1
+
b
)
+
[
2
Δ
y
+
(
2
b
−
1
)
Δ
x
]
=
2
Δ
y
x
1
−
2
Δ
y
x
1
−
2
b
Δ
x
+
2
Δ
y
+
2
b
Δ
x
−
Δ
x
)
=
2
Δ
y
−
Δ
x
重申目标:
我们需要通过 p i p_i pi 的正负值,从而决定 d 1 d_1 d1 和 d 0 d_0 d0 谁大谁小,从而决定他是往东北方向移动,还是往正东方向移动。
数学表达如下:
y
i
+
1
=
{
y
i
,
p
i
<
=
0
即
d
1
<
d
0
y
i
+
1
,
p
i
>
0
即
d
1
>
d
0
y_{i+1}=
所以我们发现:
y
i
+
1
y_{i+1}
yi+1 其实是由
p
i
p_i
pi 决定的。咱们已知
p
1
p_1
p1 自然可以求出
y
2
y_2
y2,又根据递推关系式:
p
i
+
1
−
p
i
=
2
Δ
y
−
2
Δ
x
(
y
i
+
1
−
y
i
)
p_{i+1} - p_i = 2\Delta y - 2\Delta x(y_{i+1} - y_i)
pi+1−pi=2Δy−2Δx(yi+1−yi)
自然而然可以迭代计算,求出: p 2 p_2 p2、 y 3 y_3 y3、 p 3 p_3 p3、 y 4 y_4 y4、… p k p_k pk、 y k + 1 y_{k+1} yk+1,直到所有!
前面咱们由于为了推导公式,所以简化了模型,假设了以下条件:
但是实际在一个二维平面上,一条直线有八种情况:
x 1 < x 2 x_1 < x_2 x1<x2 且 y 1 < y 2 y_1 < y_2 y1<y2 且 0 < k > 1 0< k > 1 0<k>1
x 1 < x 2 x_1 < x_2 x1<x2 且 y 1 < y 2 y_1 < y_2 y1<y2 且 k > 1 k > 1 k>1
x 1 > x 2 x_1 > x_2 x1>x2 且 y 1 < y 2 y_1 < y_2 y1<y2 且 0 < k > 1 0< k > 1 0<k>1
x 1 > x 2 x_1 > x_2 x1>x2 且 y 1 < y 2 y_1 < y_2 y1<y2 且 k > 1 k > 1 k>1
x 1 < x 2 x_1 < x_2 x1<x2 且 y 1 > y 2 y_1 > y_2 y1>y2 且 0 < k > 1 0< k > 1 0<k>1
x 1 < x 2 x_1 < x_2 x1<x2 且 y 1 > y 2 y_1 > y_2 y1>y2 且 k > 1 k > 1 k>1
x 1 > x 2 x_1 > x_2 x1>x2 且 y 1 > y 2 y_1 > y_2 y1>y2 且 0 < k > 1 0< k > 1 0<k>1
x 1 > x 2 x_1 > x_2 x1>x2 且 y 1 > y 2 y_1 > y_2 y1>y2 且 k > 1 k > 1 k>1
如下图,这八种情况,其实就对应八个方位:
计算的情形其实也类似,只需要将目标点转换到咱们简化模型状态,然后最后结果再转换回去就可以!
比如:x符号取反、y符号取反、xy互换等等,就不多赘述了!
希望对各位小伙伴能够有所帮助哦, 我是航火火,火一般的男人!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。