创建对象的多种方式
词法作用域与动态作用域
JavaScript 采用的是词法作用域(lexical scoping)
JavaScript 函数的作用域在函数定义的时候就确定了,所以实际使用的值与函数定义位置有关系。
1 | let value = 1 |
上面这个例子中,foo
函数中的value
向上寻找为在全局定义的1
,所以会打印出1
。
1 | value=1 |
而在bash
中,由于是动态作用域,所以会打印出2
。
RegExp断言
ECMAScript新增String方法
ES2017 新增
padStart(), padEnd()
字符串补全功能,接受两个参数,如果第二个参数为空,则默认使用空格补全。
1 | // fill with the template |
ES2019 新增
trimStart(), trimEnd()
与String.trim()
的行为一致,不会修改原字符串。
1 | let str = " string " |
绘制不同颜色
绘制过程
- 执行 Vertex Shader,配置顶点。
- 调用
gl.drawArrays()
,装配图形。 - 光栅化,将图形转换为 Fragment。
- 执行 Fragment Shader。
代码实现
使用varying
标识符
1 | const vShaderSource = ` |
WebGL制作动画
绘制流程
- 计算变换后的位置坐标。
- 清空画板。
- 绘制
- 循环 1-3 操作。
代码实现
使用库函数简化数学计算
1 | const vShaderSource = ` |
使用矩阵进行变换
WebGL 中的矩阵是列主序的。
平移变换
1 | const vShaderSource = ` |
图像旋转
旋转原理
将 WebGL 坐标系转为极坐标,然后通过角度计算得出旋转后的左标位置。
旋转矩阵:
$$
\begin{bmatrix}
x’ \
y’ \
z’ \
1 \
\end{bmatrix} =
\begin{bmatrix}
\cos \beta & -\sin \beta & 0 & 0 \
\sin \beta & \cos \beta & 0 & 0 \
0 & 0 & 1 & 0 \
0 & 0 & 0 & 1 \
\end{bmatrix} ×
\begin{bmatrix}
x \
y \
z \
1 \
\end{bmatrix}
$$
代码实现
使用u_SinBCosB
存放SinB
与CosB
。
1 | /** |
图像位移
位移原理
与在普通的坐标系中一样,只需在需要位移的坐标位置加入相应的矢量即可。(x1, y1, z1, w1) + (x2, y2, z2, w2) -> (x1 + x2, y1 + y2, z1 + z2, w1 + w2)
平移矩阵:
$$
\begin{bmatrix}
x’ \
y’ \
z’ \
1
\end{bmatrix} =
\begin{bmatrix}
1 & 0 & 0 & Tx \
0 & 1 & 0 & Ty \
0 & 0 & 1 & Tz \
0 & 0 & 0 & 1 \
\end{bmatrix} ×
\begin{bmatrix}
x \
y \
z \
1 \
\end{bmatrix}
$$
代码实现
1 | // position = P + ▲P |