将极角映射到0..1

时间:2012-05-16 13:17:02

标签: math glsl trigonometry

给定笛卡尔位置,如何将原点的角度映射到范围0 .. 1?

我试过了:

sweep = atan(pos.y,pos.x) + PI) / (2.*PI);

(扫描应在0和1之间)

这是GLSL,因此atan函数对两个参数(y然后是x)感到满意并返回-PI ... PI

这在左上象限中给出1,右上角的一个漂亮的渐变绕到右下象限,然后在左下象限中为0:

A badly mapped atan

如何获得漂亮的单梯度扫描?我希望在某个地方进行最大扫描,并且在逆时针方向附近进行最小扫描。

这是我的GLSL着色器代码:

顶点着色器:

uniform mat4 MVP_MATRIX;
attribute vec2 VERTEX;
varying vec2 pos;
void main() {
    gl_Position = MVP_MATRIX * vec4(VERTEX,-2,1.);
    pos = gl_Position.xy;
}

片段着色器:

uniform vec4 COLOUR;
varying vec2 pos;
void main() {
    float PI = 3.14159265358979323846264;
    float sweep = (atan(pos.y,pos.x) + PI) / (2.*PI);
    gl_FragColor = vec4(COLOUR.rgb * sweep,COLOUR.a);
}

2 个答案:

答案 0 :(得分:6)

大多数编程语言都有atan的双参数版本,通常称为atan2这通常会在范围内给出结果(-PI,PI)。要将其转换为值0- 1你可以使用:

(atan2(y,x) + PI) / (2*PI)

由于您的语言atan函数有两个参数,它可能与atan2完全相同。

答案 1 :(得分:3)

您似乎正在使用atan2,它以(-pi,pi)的形式返回一个角度。进入:

atan2(pos.y,pos.x) + PI) / (2*PI)