HOG2
Colors.cpp
Go to the documentation of this file.
1 //
2 // Colors.cpp
3 // hog2
4 //
5 // Created by Nathan Sturtevant on 7/29/17.
6 // Copyright © 2017 NS Software. All rights reserved.
7 //
8 
9 #include "Colors.h"
10 
11 bool operator!=(const rgbColor &r1, const rgbColor &r2)
12 {
13  return !(r1 == r2);
14 }
15 
16 bool operator==(const rgbColor &r1, const rgbColor &r2)
17 {
18  return r1.r == r2.r && r1.g == r2.g && r1.b == r2.b;
19 }
20 
21 namespace Colors {
22 
23 
24 rgbColor GetColor(float v, float vmin, float vmax, int type)
25 {
26  float dv,vmid;
27  rgbColor c(1.0,1.0,1.0);
28  rgbColor c1,c2,c3;
29  float ratio;
30 
31  if (v < vmin)
32  v = vmin;
33  if (v > vmax)
34  v = vmax;
35  dv = vmax - vmin;
36 
37  switch (type%21) {
38  case 0:
39  c.r = 1.0f;
40  c.b = 1.0f;
41  c.g = 1.0f;
42  break;
43  case 1:
44  if (v < (vmin + 0.25f * dv))
45  {
46  c.r = 0;
47  c.g = 4 * (v - vmin) / dv;
48  c.b = 1;
49  }
50  else if (v < (vmin + 0.5f * dv))
51  {
52  c.r = 0;
53  c.g = 1;
54  c.b = 1.0f + 4.0f * (vmin + 0.25f * dv - v) / dv;
55  }
56  else if (v < (vmin + 0.75f * dv))
57  {
58  c.r = 4 * (v - vmin - 0.5f * dv) / dv;
59  c.g = 1;
60  c.b = 0;
61  }
62  else {
63  c.r = 1;
64  c.g = 1 + 4 * (vmin + 0.75f * dv - v) / dv;
65  c.b = 0;
66  }
67  break;
68  case 2:
69  c.r = (v - vmin) / dv;
70  c.g = 0;
71  c.b = (vmax - v) / dv;
72  break;
73  case 3:
74  c.r = (v - vmin) / dv;
75  c.b = c.r;
76  c.g = c.r;
77  break;
78  case 4:
79  if (v < (vmin + dv / 6.0f)) {
80  c.r = 1;
81  c.g = 6 * (v - vmin) / dv;
82  c.b = 0;
83  } else if (v < (vmin + 2.0 * dv / 6.0f)) {
84  c.r = 1 + 6 * (vmin + dv / 6.0f - v) / dv;
85  c.g = 1;
86  c.b = 0;
87  } else if (v < (vmin + 3.0 * dv / 6.0f)) {
88  c.r = 0;
89  c.g = 1;
90  c.b = 6 * (v - vmin - 2.0f * dv / 6.0f) / dv;
91  } else if (v < (vmin + 4.0 * dv / 6.0f)) {
92  c.r = 0;
93  c.g = 1 + 6 * (vmin + 3.0f * dv / 6.0f - v) / dv;
94  c.b = 1;
95  } else if (v < (vmin + 5.0 * dv / 6.0f)) {
96  c.r = 6 * (v - vmin - 4.0f * dv / 6.0f) / dv;
97  c.g = 0;
98  c.b = 1;
99  } else {
100  c.r = 1;
101  c.g = 0;
102  c.b = 1 + 6 * (vmin + 5.0f * dv / 6.0f - v) / dv;
103  }
104  break;
105  case 5:
106  c.r = (v - vmin) / (vmax - vmin);
107  c.g = 1;
108  c.b = 0;
109  break;
110  case 6:
111  c.r = (v - vmin) / (vmax - vmin);
112  c.g = (vmax - v) / (vmax - vmin);
113  c.b = c.r;
114  break;
115  case 7:
116  if (v < (vmin + 0.25f * dv)) {
117  c.r = 0;
118  c.g = 4 * (v - vmin) / dv;
119  c.b = 1 - c.g;
120  } else if (v < (vmin + 0.5f * dv)) {
121  c.r = 4 * (v - vmin - 0.25f * dv) / dv;
122  c.g = 1 - c.r;
123  c.b = 0;
124  } else if (v < (vmin + 0.75f * dv)) {
125  c.g = 4 * (v - vmin - 0.5f * dv) / dv;
126  c.r = 1 - c.g;
127  c.b = 0;
128  } else {
129  c.r = 0;
130  c.b = 4 * (v - vmin - 0.75f * dv) / dv;
131  c.g = 1 - c.b;
132  }
133  break;
134  case 8:
135  if (v < (vmin + 0.5f * dv)) {
136  c.r = 2 * (v - vmin) / dv;
137  c.g = c.r;
138  c.b = c.r;
139  } else {
140  c.r = 1 - 2 * (v - vmin - 0.5f * dv) / dv;
141  c.g = c.r;
142  c.b = c.r;
143  }
144  break;
145  case 9:
146  if (v < (vmin + dv / 3)) {
147  c.b = 3 * (v - vmin) / dv;
148  c.g = 0;
149  c.r = 1 - c.b;
150  } else if (v < (vmin + 2 * dv / 3)) {
151  c.r = 0;
152  c.g = 3 * (v - vmin - dv / 3) / dv;
153  c.b = 1;
154  } else {
155  c.r = 3 * (v - vmin - 2 * dv / 3) / dv;
156  c.g = 1 - c.r;
157  c.b = 1;
158  }
159  break;
160  case 10:
161  if (v < (vmin + 0.2 * dv)) {
162  c.r = 0;
163  c.g = 5 * (v - vmin) / dv;
164  c.b = 1;
165  } else if (v < (vmin + 0.4 * dv)) {
166  c.r = 0;
167  c.g = 1;
168  c.b = 1.f + 5.f * (vmin + 0.2f * dv - v) / dv;
169  } else if (v < (vmin + 0.6 * dv)) {
170  c.r = 5.f * (v - vmin - 0.4f * dv) / dv;
171  c.g = 1;
172  c.b = 0;
173  } else if (v < (vmin + 0.8 * dv)) {
174  c.r = 1;
175  c.g = 1 - 5 * (v - vmin - 0.6f * dv) / dv;
176  c.b = 0;
177  } else {
178  c.r = 1;
179  c.g = 5.f * (v - vmin - 0.8f * dv) / dv;
180  c.b = 5.f * (v - vmin - 0.8f * dv) / dv;
181  }
182  break;
183  case 11:
184  c1.r = 200 / 255.0f; c1.g = 60 / 255.0f; c1.b = 0 / 255.0f;
185  c2.r = 250 / 255.0f; c2.g = 160 / 255.0f; c2.b = 110 / 255.0f;
186  c.r = (c2.r - c1.r) * (v - vmin) / dv + c1.r;
187  c.g = (c2.g - c1.g) * (v - vmin) / dv + c1.g;
188  c.b = (c2.b - c1.b) * (v - vmin) / dv + c1.b;
189  break;
190  case 12:
191  c1.r = 55 / 255.0f; c1.g = 55 / 255.0f; c1.b = 45 / 255.0f;
192  c2.r = 200 / 255.0f; c2.g = 60 / 255.0f; c2.b = 0 / 255.0f;
193  // c2.r = 235 / 255.0f; c2.g = 90 / 255.0f; c2.b = 30 / 255.0f;
194  c3.r = 250 / 255.0f; c3.g = 160 / 255.0f; c3.b = 110 / 255.0f;
195  ratio = 0.4f;
196  vmid = vmin + ratio * dv;
197  if (v < vmid) {
198  c.r = (c2.r - c1.r) * (v - vmin) / (ratio*dv) + c1.r;
199  c.g = (c2.g - c1.g) * (v - vmin) / (ratio*dv) + c1.g;
200  c.b = (c2.b - c1.b) * (v - vmin) / (ratio*dv) + c1.b;
201  } else {
202  c.r = (c3.r - c2.r) * (v - vmid) / ((1-ratio)*dv) + c2.r;
203  c.g = (c3.g - c2.g) * (v - vmid) / ((1-ratio)*dv) + c2.g;
204  c.b = (c3.b - c2.b) * (v - vmid) / ((1-ratio)*dv) + c2.b;
205  }
206  break;
207  case 13:
208  c1.r = 0 / 255.0f; c1.g = 255 / 255.0f; c1.b = 0 / 255.0f;
209  c2.r = 255 / 255.0f; c2.g = 150 / 255.0f; c2.b = 0 / 255.0f;
210  c3.r = 255 / 255.0f; c3.g = 250 / 255.0f; c3.b = 240 / 255.0f;
211  ratio = 0.3f;
212  vmid = vmin + ratio * dv;
213  if (v < vmid) {
214  c.r = (c2.r - c1.r) * (v - vmin) / (ratio*dv) + c1.r;
215  c.g = (c2.g - c1.g) * (v - vmin) / (ratio*dv) + c1.g;
216  c.b = (c2.b - c1.b) * (v - vmin) / (ratio*dv) + c1.b;
217  } else {
218  c.r = (c3.r - c2.r) * (v - vmid) / ((1-ratio)*dv) + c2.r;
219  c.g = (c3.g - c2.g) * (v - vmid) / ((1-ratio)*dv) + c2.g;
220  c.b = (c3.b - c2.b) * (v - vmid) / ((1-ratio)*dv) + c2.b;
221  }
222  break;
223  case 14:
224  c.r = 1;
225  c.g = 1 - (v - vmin) / dv;
226  c.b = 0;
227  break;
228  case 15:
229  if (v < (vmin + 0.25f * dv)) {
230  c.r = 0;
231  c.g = 4 * (v - vmin) / dv;
232  c.b = 1;
233  } else if (v < (vmin + 0.5f * dv)) {
234  c.r = 0;
235  c.g = 1;
236  c.b = 1 - 4 * (v - vmin - 0.25f * dv) / dv;
237  } else if (v < (vmin + 0.75f * dv)) {
238  c.r = 4 * (v - vmin - 0.5f * dv) / dv;
239  c.g = 1;
240  c.b = 0;
241  } else {
242  c.r = 1;
243  c.g = 1;
244  c.b = 4 * (v - vmin - 0.75f * dv) / dv;
245  }
246  break;
247  case 16:
248  if (v < (vmin + 0.5f * dv)) {
249  c.r = 0.0;
250  c.g = 2 * (v - vmin) / dv;
251  c.b = 1 - 2 * (v - vmin) / dv;
252  } else {
253  c.r = 2 * (v - vmin - 0.5f * dv) / dv;
254  c.g = 1 - 2 * (v - vmin - 0.5f * dv) / dv;
255  c.b = 0.0;
256  }
257  break;
258  case 17:
259  if (v < (vmin + 0.5f * dv)) {
260  c.r = 1.0;
261  c.g = 1 - 2 * (v - vmin) / dv;
262  c.b = 2 * (v - vmin) / dv;
263  } else {
264  c.r = 1 - 2 * (v - vmin - 0.5f * dv) / dv;
265  c.g = 2 * (v - vmin - 0.5f * dv) / dv;
266  c.b = 1.0;
267  }
268  break;
269  case 18:
270  c.r = 0;
271  c.g = (v - vmin) / (vmax - vmin);
272  c.b = 1;
273  break;
274  case 19:
275  c.r = (v - vmin) / (vmax - vmin);
276  c.g = c.r;
277  c.b = 1;
278  break;
279  case 20:
280  c1.r = 0 / 255.0f; c1.g = 160 / 255.0f; c1.b = 0 / 255.0f;
281  c2.r = 180 / 255.0f; c2.g = 220 / 255.0f; c2.b = 0 / 255.0f;
282  c3.r = 250 / 255.0f; c3.g = 220 / 255.0f; c3.b = 170 / 255.0f;
283  ratio = 0.3f;
284  vmid = vmin + ratio * dv;
285  if (v < vmid) {
286  c.r = (c2.r - c1.r) * (v - vmin) / (ratio*dv) + c1.r;
287  c.g = (c2.g - c1.g) * (v - vmin) / (ratio*dv) + c1.g;
288  c.b = (c2.b - c1.b) * (v - vmin) / (ratio*dv) + c1.b;
289  } else {
290  c.r = (c3.r - c2.r) * (v - vmid) / ((1-ratio)*dv) + c2.r;
291  c.g = (c3.g - c2.g) * (v - vmid) / ((1-ratio)*dv) + c2.g;
292  c.b = (c3.b - c2.b) * (v - vmid) / ((1-ratio)*dv) + c2.b;
293  }
294  break;
295  }
296  return(c);
297 }
298 
299 }
Colors::GetColor
rgbColor GetColor(float v, float vmin, float vmax, int type)
Given min/max values, get a color from a color schema.
Definition: Colors.cpp:24
rgbColor::b
float b
Definition: Colors.h:71
rgbColor
A color; r/g/b are between 0...1.
Definition: Colors.h:17
rgbColor::g
float g
Definition: Colors.h:71
Colors
Definition: Colors.cpp:21
Colors.h
operator==
bool operator==(const rgbColor &r1, const rgbColor &r2)
Definition: Colors.cpp:16
rgbColor::r
float r
Definition: Colors.h:71
operator!=
bool operator!=(const rgbColor &r1, const rgbColor &r2)
Definition: Colors.cpp:11