2012-05-16 2 views
2

Учитывая декартовую позицию, как вы можете сопоставить угол от начала координат до диапазона 0 .. 1?картирование полярного угла до 0..1

Я попытался:

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

(где развертка должна находиться в диапазоне от 0 до 1)

Это GLSL, поэтому функция atan счастлива с двумя параметрами (у, то х) и возврат - PI ... PI

Это дает 1 в верхнем левом квадранте, приятный градиент в верхнем правом углу объезжая в правый нижний квадрант, а затем 0 в левом нижнем квадранте:

A badly mapped atan

Как мне получить красивую единую градиентную развертку? Я хочу, чтобы максимальная развертка где-то была, а минимум, прилегающий к ней против часовой стрелки.

Вот мой GLSL код шейдера:

Vertex шейдеров:

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) 
Смежные вопросы