这是我想要帮助理解的代码片段
for(i = 0; i< samplesX; i ++) for(j = 0; j< samplesY; j ++) { newI = DIM * i / samplesX; newJ = DIM ……
你在那里的代码片段可能写得更简单(也需要一些有根据的猜测一些变量和函数的含义)。
让我们分解吧。
前两行很容易理解,它们是迭代2D数组的标准节
for (i = 0; i < samplesX; i++) for (j = 0; j < samplesY; j++)
i 和 j 正在运行索引,它将迭代每个离散坐标元组 (i,j) �� [i, samplesX) �� [j, samplesY) 。接下来的两行将2D索引重新映射到新的值范围,具体而言 [i, samplesX)��[j, samplesY) �� [0, DIM)��[0, DIM) 。缺少的信息是什么类型 DIM 的。这将使它成为一些浮点类型。
i
j
(i,j) �� [i, samplesX) �� [j, samplesY)
[i, samplesX)��[j, samplesY) �� [0, DIM)��[0, DIM)
DIM
newI = DIM * i / samplesX; newJ = DIM * j / samplesY;
下一行很容易出错。它翻译 newI 和 newJ 进入1D阵列的运行1D索引,由...解决 i 和 j 。
newI
newJ
为什么这有问题?因为在转换到DIM空间信息可能已经丢失。这种信息丢失可能导致 的 安全漏洞(!) 强> 事实上,Skia,Google Chrome,Android和其他项目使用的渲染库最近都出现了这种错误;这篇文章值得一读: https://googleprojectzero.blogspot.com/2019/02/the-curious-case-of-convexity-confusion.html
实现这一点的正确方法是让DIM为整数并对其执行定点运算,最终截断小数位。但我离题了。下一个块实质上是执行穷人的查找表查找。 vx``vy 和 fx``fy 是一些扁平的2D数组,通过一维索引访问,和 direction_to_color 映射到一个值 的 想必 强> 致电 glColor ;同样可能也是如此 set_colormap 。这是一个很糟糕的OpenGL使用。
vx``vy
fx``fy
direction_to_color
glColor
set_colormap
整个重新映射 i 和 j 至 DIM 然后查找只是糟糕的纹理查找实现。 OpenGL已经有了纹理。只需加载为纹理坐标数组并启用纹理。
最后为每个脊椎,两个调用 glVertex 制作,一个有凝视点,位于网格中心 (wn, hn) ,到偏移的位置 (wn, hn) + (i, j) 。
glVertex
(wn, hn)
(wn, hn) + (i, j)
我对该代码的判决: 垃圾! 所有这一切都可以更加优雅地完成,即使在1994年使用OpenGL-1.0,这似乎是代码编写的。如果要实现自己的矢量场图,请不要将此作为起点。
这些天我们有可编程GPU和着色器。所有这些都可以完成的是几行着色器代码。