GLSL 内置函数

atan()

返回正切值为 y / x 的弧度角。双参数形式 atan(y, x) 给出一个点绕原点的完整角度,范围是 -PI 到 PI。

函数签名

float atan(float y, float x)
float atan(float y_over_x)
vec2 atan(vec2 y, vec2 x)

参数

y
纵向分量。注意它是第一个参数。
x
横向分量。

返回值

弧度角。atan(y, x) 返回 -PI 到 PI;atan(y_over_x) 返回 -PI/2 到 PI/2。

在线示例

修改右侧代码,左侧预览会实时更新。

工作原理

length(p) 回答"这个像素离中心多远",atan(p.y, p.x) 回答"它在哪个方向"。两者合起来就是极坐标。

结果是弧度制的角度:

方向atan(y, x)
右0.0
上1.5708(PI / 2)
左3.1416 或 -3.1416(PI)
下-1.5708

a / 6.2831 + 0.5 把它换算成 0 到 1 的值,也就是转了一整圈的百分之多少。示例用它来选色相,得到一个色轮;再用 fract 重复 12 次,画出旋转的光线。

常见用法

  • 放射状图案:光线、扇形、用 sin(a * petals) 做花瓣。
  • 极坐标:vec2(length(p), atan(p.y, p.x)) 能把螺旋和圆环变成简单的直线问题。
  • 指向某个目标:计算像素和目标点之间的角度。

常见错误

  • 参数顺序写反。是 atan(y, x),y 在前。
  • 需要完整角度时用了单参数形式。atan(p.y / p.x) 分不清左右,在竖直轴上还会除以 0。
  • 调用 atan(0.0, 0.0)。结果未定义,正中心那个像素可能闪烁。
  • 以为角度是连续的。角度在左侧从 PI 跳到 -PI,基于它的图案要重复整数次,才不会出现明显的接缝。

相关函数

用到 atan() 的教程