Math 将极轴角度映射到0..1

Math 将极轴角度映射到0..1,math,glsl,trigonometry,Math,Glsl,Trigonometry,给定笛卡尔位置,如何将原点的角度映射到0范围内。。1号 我试过: sweep = atan(pos.y,pos.x) + PI) / (2.*PI); (其中扫掠应介于0和1之间) 这是GLSL,因此函数使用两个参数(y和x)并返回-PI。。。圆周率 这将在左上象限中给出1,在右上象限中给出一个很好的渐变,然后在右下象限中得到0: 我如何得到一个很好的单梯度扫描呢?我想要最大扫描点,最小扫描点逆时针方向 以下是我的GLSL着色器代码: 顶点着色器: uniform mat4 MVP_MATR

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

我试过:

sweep = atan(pos.y,pos.x) + PI) / (2.*PI);
(其中扫掠应介于0和1之间)

这是GLSL,因此函数使用两个参数(y和x)并返回-PI。。。圆周率

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

我如何得到一个很好的单梯度扫描呢?我想要最大扫描点,最小扫描点逆时针方向

以下是我的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);
}

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

(atan2(y,x) + PI) / (2*PI)
由于您的语言的
atan
函数包含两个参数,因此它可能与您似乎正在使用的
atan2

执行相同的操作,它返回(-pi,pi)中的角度。将其设为:

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

对不起,我不明白你想要的是什么。所有的触发函数都有不连续性,因为这些函数都是周期性的。你反对黑色旁边的饱和绿色吗?@duffymo是的,在question@will您是如何制作此图像的?我需要相同的,但从白色到黑色:)