2012-05-16 371 views
2

給定笛卡爾座標,如何將角度從原點映射到範圍0 .. 1?將極座標映射到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); 
} 
+0

對不起,我不明白你想要什麼。所有三角函數都有一個不連續性,因爲函數是週期性的。你是否反對黑色旁邊的飽和綠色? – duffymo

+0

@duffymo是的,在問題中已澄清 – Will

回答

6

大多數編程語言有atan兩參數版本,通常被稱爲atan2這通常會在範圍(-PI,PI)中給出結果。要將其轉換爲值0-1,您可以使用:

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

由於語言的atan函數有兩個參數,它可能做同樣的事情atan2

3

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

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