Формуляры в треугольнике HSV - PullRequest
       38

Формуляры в треугольнике HSV

2 голосов
/ 03 октября 2019

Я не знаю, как получены следующие две формулы. Пожалуйста, объясните. Моя репутация настолько низка, что я не могу спросить человека, который написал формулу.

Треугольник HSV в C #

var sat = (1 - 2*y1) / (sqrt3*x1 - y1 + 2);
var val = (sqrt3*x1 - y1 + 2) / 3;

1 Ответ

1 голос
/ 04 октября 2019

После преобразования мне нужно, чтобы углы треугольника касались окружности юнитов в точках <0,-1> "вверху", <-√3/2,1/2> "внизу слева" и <√3/2,1/2> "внизу справа". Я выбрал нижний левый угол черной точкой ( val = 0), а когда val = 1, верхом будет точка цвета ( val =1 и sat = 1), а справа внизу будет точка белого ( val = 1 и sat = 0).

Чтобы достичь этого, я сначала определил правый край как уравнение

<x,y> = <0,-1>*sat + <√3/2,1/2>*(1-sat)
        ^            ^-- When sat = 0, the result is this point
        '-- When sat = 1, the result is this point

Затем я масштабировал эту линию в направлении <-√3/2,1/2>, когда val стремится к нулю

<x,y> = ( <0,-1>*sat + <√3/2,1/2>*(1-sat) )*val + <-√3/2,1/2>*(1-val)
<x,y> = <0,-1>*sat*val + <√3/2,1/2>*(1-sat)*val + <-√3/2,1/2>*(1-val)
        ^                ^                        ^-- When val = 0, the result is this point
        |                '-- When val = 1 and sat = 0, the result is this point
        '-- When val = 1 and sat = 1, the result is this point

Преобразование из векторной формы:

x = 0*sat*val + √3/2*(1-sat)*val + -√3/2*(1-val)
y = -1*sat*val + 1/2*(1-sat)*val + 1/2*(1-val)

Расширение:

x = -√3/2*val*sat + √3*val - √3/2
y = -3/2*val*sat + 1/2

Перестановка:

(√3*x - y + 2)/3 = val
(1 - 2*y)/3 = sat*val

Решение для сб и val :

sat = (1 - 2*y)/(√3*x - y + 2)
val = (√3*x - y + 2)/3
...