9 // du and dv are in pixels.
10 inline void flow2rgb(float du, float dv, uint8_t *rr, uint8_t *gg, uint8_t *bb)
12 float angle = atan2(dv, du);
13 float magnitude = std::min(hypot(du, dv) / 20.0, 1.0);
15 // HSV to RGB (from Wikipedia). Saturation is 1.
17 float h = (angle + M_PI) * 6.0 / (2.0 * M_PI);
18 float X = c * (1.0 - fabs(fmod(h, 2.0) - 1.0));
19 float r = 0.0f, g = 0.0f, b = 0.0f;
22 } else if (h < 2.0f) {
24 } else if (h < 3.0f) {
26 } else if (h < 4.0f) {
28 } else if (h < 5.0f) {
30 } else if (h < 6.0f) {
33 // h is NaN, so black is fine.
35 float m = magnitude - c;
36 r += m; g += m; b += m;
37 r = std::max(std::min(r, 1.0f), 0.0f);
38 g = std::max(std::min(g, 1.0f), 0.0f);
39 b = std::max(std::min(b, 1.0f), 0.0f);
40 *rr = lrintf(r * 255.0f);
41 *gg = lrintf(g * 255.0f);
42 *bb = lrintf(b * 255.0f);
45 #endif // !defined(_FLOW2RGB_H)