2

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

我试过了:

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

(扫描应介于 0 和 1 之间)

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

这在左上象限中给出了 1,在右上象限中给出了一个很好的渐变到右下象限,然后在左下象限中为 0:

一个映射不好的 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);
}
4

2 回答 2

7

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

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

由于您的语言atan函数需要两个参数,因此它可能与atan2.

于 2012-05-16T13:24:52.397 回答
3

您似乎正在使用atan2,它返回 (-pi, pi) 中的角度。把它变成:

atan2(pos.y,pos.x) + PI) / (2*PI)
于 2012-05-16T13:25:36.837 回答