-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHelpers.cpp
More file actions
63 lines (50 loc) · 1.48 KB
/
Copy pathHelpers.cpp
File metadata and controls
63 lines (50 loc) · 1.48 KB
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
// SPDX-FileCopyrightText: 2026 Błażej Szczygieł <mumei6102@gmail.com>
// SPDX-License-Identifier: BSD-3-Clause
#include "Helpers.hpp"
#include "CieXyz1931TwoDegData.hpp"
namespace Helpers {
UV1960 xyzToUV1960(const XYZ &xyz)
{
const double denom = xyz.X + 15.0 * xyz.Y + 3.0 * xyz.Z;
if (qFuzzyIsNull(denom))
{
return {0.0, 0.0};
}
return {4.0 * xyz.X / denom, 6.0 * xyz.Y / denom};
}
double dominantWavelength(const XYZ &xyz)
{
constexpr double xw = 1.0 / 3.0;
constexpr double yw = 1.0 / 3.0;
const double sum = xyz.X + xyz.Y + xyz.Z;
if (qFuzzyIsNull(sum))
{
return 0.0;
}
const double x = xyz.X / sum;
const double y = xyz.Y / sum;
const double targetAngle = atan2(y - yw, x - xw);
double minDiff = numeric_limits<double>::max();
double dominant = 0.0;
for (auto [wavelength, locus] : CieXyz1931TwoDegData::dataWithWavelength())
{
const double locusSum = locus.X + locus.Y + locus.Z;
if (qFuzzyIsNull(locusSum))
{
continue;
}
const double locusX = locus.X / locusSum;
const double locusY = locus.Y / locusSum;
const double locusAngle = atan2(locusY - yw, locusX - xw);
double diff = abs(targetAngle - locusAngle);
if (diff > numbers::pi)
diff = 2.0 * numbers::pi - diff;
if (diff < minDiff)
{
minDiff = diff;
dominant = wavelength;
}
}
return dominant;
}
}