116 lines
2.2 KiB
JavaScript
116 lines
2.2 KiB
JavaScript
/**
|
|
* https://en.wikipedia.org/wiki/CIE_1964_color_space
|
|
*
|
|
* Very similar to LUV, but w and v are calculated a bit differently.
|
|
*
|
|
* @module color-space/uvw
|
|
*/
|
|
import ucs from './ucs.js';
|
|
import xyz from './xyz.js';
|
|
|
|
var uvw = {
|
|
name: 'uvw',
|
|
min: [-134, -140, 0],
|
|
max: [224, 122, 100],
|
|
channel: ['U', 'V', 'W'],
|
|
alias: ['UVW', 'cieuvw', 'cie1964']
|
|
};
|
|
|
|
export default (uvw);
|
|
|
|
/**
|
|
* UVW to XYZ
|
|
*/
|
|
uvw.xyz = function (arg, i, o) {
|
|
var _u, _v, w, u, v, x, y, z, xn, yn, zn, un, vn;
|
|
u = arg[0], v = arg[1], w = arg[2];
|
|
|
|
if (w === 0) return [0, 0, 0];
|
|
|
|
//get illuminant/observer
|
|
i = i || 'D65';
|
|
o = o || 2;
|
|
|
|
xn = xyz.whitepoint[o][i][0];
|
|
yn = xyz.whitepoint[o][i][1];
|
|
zn = xyz.whitepoint[o][i][2];
|
|
|
|
un = (4 * xn) / (xn + (15 * yn) + (3 * zn));
|
|
vn = (6 * yn) / (xn + (15 * yn) + (3 * zn));
|
|
|
|
y = Math.pow((w + 17) / 25, 3);
|
|
|
|
_u = u / (13 * w) + un || 0;
|
|
_v = v / (13 * w) + vn || 0;
|
|
|
|
x = (6 / 4) * y * _u / _v;
|
|
z = y * (2 / _v - 0.5 * _u / _v - 5);
|
|
|
|
return [x, y, z];
|
|
};
|
|
|
|
|
|
/**
|
|
* XYZ to UVW
|
|
*
|
|
* @return {Array<number>} An UVW array
|
|
*/
|
|
xyz.uvw = function (arr, i, o) {
|
|
var x = arr[0], y = arr[1], z = arr[2], xn, yn, zn, un, vn;
|
|
|
|
//find out normal source u v
|
|
i = i || 'D65';
|
|
o = o || 2;
|
|
|
|
xn = xyz.whitepoint[o][i][0];
|
|
yn = xyz.whitepoint[o][i][1];
|
|
zn = xyz.whitepoint[o][i][2];
|
|
|
|
un = (4 * xn) / (xn + (15 * yn) + (3 * zn));
|
|
vn = (6 * yn) / (xn + (15 * yn) + (3 * zn));
|
|
|
|
var _u = 4 * x / (x + 15 * y + 3 * z) || 0;
|
|
var _v = 6 * y / (x + 15 * y + 3 * z) || 0;
|
|
|
|
//calc values
|
|
var w = 25 * Math.pow(y, 1 / 3) - 17;
|
|
var u = 13 * w * (_u - un);
|
|
var v = 13 * w * (_v - vn);
|
|
|
|
return [u, v, w];
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
* UVW to UCS
|
|
*
|
|
* @param {Array<number>} uvw UCS values
|
|
*
|
|
* @return {Array<number>} UVW values
|
|
*/
|
|
uvw.ucs = function (uvw) {
|
|
//find chromacity variables
|
|
throw new Error('Not implemented');
|
|
};
|
|
|
|
|
|
/**
|
|
* UCS to UVW
|
|
*
|
|
* @param {Array<number>} ucs UVW values
|
|
*
|
|
* @return {Array<number>} UCS values
|
|
*/
|
|
ucs.uvw = function (ucs) {
|
|
// //find chromacity variables
|
|
// var u = U / (U + V + W);
|
|
// var v = V / (U + V + W);
|
|
|
|
// //find 1964 UVW
|
|
// w = 25 * Math.pow(y, 1/3) - 17;
|
|
// u = 13 * w * (u - un);
|
|
// v = 13 * w * (v - vn);
|
|
throw new Error('Not implemented');
|
|
};
|