1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
#include "meowpp.h"
TEST(Colors){
meow::RGBf rgb, rgb2;
meow::YUVf yuv, yuv2;
meow::HSLf hsl, hsl2;
meow::HSVf hsv, hsv2;
bool ok = true;
double eps;
eps = 1e-8;
meow::messagePrintf(1, "rgb ---> hsl ---> rgb ---> hsl (eps = %e)", eps);
for(int i = 0; ok && i < 100000; i++){
rgb.r(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, rgb.rMin(), rgb.rMax()));
rgb.g(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, rgb.gMin(), rgb.gMax()));
rgb.b(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, rgb.bMin(), rgb.bMax()));
meow::RGB_to_HSL(rgb , &hsl );
meow::HSL_to_RGB(hsl , &rgb2);
meow::RGB_to_HSL(rgb2, &hsl2);
if(meow::noEPS(rgb.r() - rgb2.r(), eps) != 0 ||
meow::noEPS(rgb.g() - rgb2.g(), eps) != 0 ||
meow::noEPS(rgb.b() - rgb2.b(), eps) != 0) ok = false;
if(meow::noEPS(hsl.h() - hsl2.h(), eps) != 0 ||
meow::noEPS(hsl.s() - hsl2.s(), eps) != 0 ||
meow::noEPS(hsl.l() - hsl2.l(), eps) != 0) ok = false;
}
if(ok) meow::messagePrintf(-1, "ok!");
else{ meow::messagePrintf(-1, "fail"); return false; }
//
eps = 1e-8;
meow::messagePrintf(1, "rgb ---> hsv ---> rgb ---> hsv (eps = %e)", eps);
for(int i = 0; ok && i < 100000; i++){
rgb.r(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, rgb.rMin(), rgb.rMax()));
rgb.g(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, rgb.gMin(), rgb.gMax()));
rgb.b(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, rgb.bMin(), rgb.bMax()));
meow::RGB_to_HSV(rgb , &hsv );
meow::HSV_to_RGB(hsv , &rgb2);
meow::RGB_to_HSV(rgb2, &hsv2);
if(meow::noEPS(rgb.r() - rgb2.r(), eps) != 0 ||
meow::noEPS(rgb.g() - rgb2.g(), eps) != 0 ||
meow::noEPS(rgb.b() - rgb2.b(), eps) != 0) ok = false;
if(meow::noEPS(hsv.h() - hsv2.h(), eps) != 0 ||
meow::noEPS(hsv.s() - hsv2.s(), eps) != 0 ||
meow::noEPS(hsv.v() - hsv2.v(), eps) != 0) ok = false;
}
if(ok) meow::messagePrintf(-1, "ok!");
else{ meow::messagePrintf(-1, "fail"); return false; }
//
/*
eps = 1e-3;
meow::messagePrintf(1, "yuv ---> hsl ---> yuv ---> hsl");
for(int i = 0; ok && i < 100000; i++){
yuv.y(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, yuv.yMin(), yuv.yMax()));
yuv.u(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, yuv.uMin(), yuv.uMax()));
yuv.v(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, yuv.vMin(), yuv.vMax()));
meow::YUV_to_HSL(yuv , &hsl );
meow::HSL_to_YUV(hsl , &yuv2);
meow::YUV_to_HSL(yuv2, &hsl2);
if(meow::noEPS(yuv.y() - yuv2.y(), eps) != 0 ||
meow::noEPS(yuv.u() - yuv2.u(), eps) != 0 ||
meow::noEPS(yuv.v() - yuv2.v(), eps) != 0) ok = false;
if(meow::noEPS(hsl.h() - hsl2.h(), eps) != 0 ||
meow::noEPS(hsl.s() - hsl2.s(), eps) != 0 ||
meow::noEPS(hsl.l() - hsl2.l(), eps) != 0) ok = false;
}
if(ok) meow::messagePrintf(-1, "ok!");
else{ meow::messagePrintf(-1, "fail"); return false; }
// */
/*
meow::messagePrintf(1, "yuv ---> hsv ---> yuv ---> hsv");
for(int i = 0; ok && i < 100000; i++){
yuv.y(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, yuv.yMin(), yuv.yMax()));
yuv.u(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, yuv.uMin(), yuv.uMax()));
yuv.v(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, yuv.vMin(), yuv.vMax()));
meow::YUV_to_HSV(yuv , &hsv );
meow::HSV_to_YUV(hsv , &yuv2);
meow::YUV_to_HSV(yuv2, &hsv2);
if(meow::noEPS(yuv.y() - yuv2.y(), eps) != 0 ||
meow::noEPS(yuv.u() - yuv2.u(), eps) != 0 ||
meow::noEPS(yuv.v() - yuv2.v(), eps) != 0) ok = false;
if(meow::noEPS(hsv.h() - hsv2.h(), eps) != 0 ||
meow::noEPS(hsv.s() - hsv2.s(), eps) != 0 ||
meow::noEPS(hsv.v() - hsv2.v(), eps) != 0) ok = false;
}
if(ok) meow::messagePrintf(-1, "ok!");
else{ meow::messagePrintf(-1, "fail"); return false; }
// */
eps = 1e-3;
meow::messagePrintf(1, "rgb ---> yuv ---> rgb ---> yuv (eps = %e)", eps);
for(int i = 0; ok && i < 100000; i++){
rgb.r(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, rgb.rMin(), rgb.rMax()));
rgb.g(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, rgb.gMin(), rgb.gMax()));
rgb.b(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, rgb.bMin(), rgb.bMax()));
meow::RGB_to_YUV(rgb , &yuv );
meow::YUV_to_RGB(yuv , &rgb2);
meow::RGB_to_YUV(rgb2, &yuv2);
if(meow::noEPS(rgb.r() - rgb2.r(), eps) != 0 ||
meow::noEPS(rgb.g() - rgb2.g(), eps) != 0 ||
meow::noEPS(rgb.b() - rgb2.b(), eps) != 0) ok = false;
if(meow::noEPS(yuv.y() - yuv2.y(), eps) != 0 ||
meow::noEPS(yuv.u() - yuv2.u(), eps) != 0 ||
meow::noEPS(yuv.v() - yuv2.v(), eps) != 0) ok = false;
}
if(ok) meow::messagePrintf(-1, "ok!");
else{ meow::messagePrintf(-1, "fail"); return false; }
eps = 1e-8;
meow::messagePrintf(1, "hsl ---> hsv ---> hsl ---> hsv (eps = %e)", eps);
for(int i = 0; ok && i < 100000; i++){
hsl.h(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, hsl.hMin(), hsl.hMax()));
hsl.s(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, hsl.sMin(), hsl.sMax()));
hsl.l(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, hsl.lMin(), hsl.lMax()));
meow::HSL_to_HSV(hsl , &hsv );
meow::HSV_to_HSL(hsv , &hsl2);
meow::HSL_to_HSV(hsl2, &hsv2);
if(meow::noEPS(hsl.h() - hsl2.h(), eps) != 0 ||
meow::noEPS(hsl.s() - hsl2.s(), eps) != 0 ||
meow::noEPS(hsl.l() - hsl2.l(), eps) != 0) ok = false;
if(meow::noEPS(hsv.h() - hsv2.h(), eps) != 0 ||
meow::noEPS(hsv.s() - hsv2.s(), eps) != 0 ||
meow::noEPS(hsv.v() - hsv2.v(), eps) != 0) ok = false;
}
if(ok) meow::messagePrintf(-1, "ok!");
else{ meow::messagePrintf(-1, "fail"); return false; }
return true;
};
|