Test xyY Coordinates for being Inside the MacAdam Limits for Illuminants C and D65
IsWithinMacAdamLimits( xyY, Illuminant='C' )
a numeric Nx3 matrix with CIE xyY coordinates in the rows, or a vector that can be converted to such a matrix, by row. The reference white is asssumed to have Y=100.
either 'C'
or 'D65'
. Partial matching is enabled, and is case-insensitive.
A data.frame
with N rows and these columns:
a logical which is TRUE
iff the corresponding row in xyY
is inside the optimal color solid for the illuminant.
If a point is exactly on the boundary (unlikely), within=TRUE
.
Explicitly, within = (delta<=0)
.
the pseudo-distance \(\delta\) discussed in Details
The row names of the output value are set equal to the row names of xyY.
The MacAdam Limit is the boundary of the optimal color solid (also called the R<U+00F6>sch Farbk<U+00F6>rper), in XYZ coordinates. The optimal color solid is convex and depends on the illuminant. Points on the boundary of the solid are called optimal colors. It is symmetric about the midpoint of the segment joining black and white (the 50% gray point). It can be expressed as a zonohedron - a convex polyhedron with a special form; for details on zonohedra, see Centore.
For each of the 2 illuminants, a zonohedron \(Z\) is pre-computed
(and stored in sysdata.rda
).
The wavelengths used are 380 to 780 nm with 5nm step (81 wavelengths).
Each zonohedron has 81*80=6480 parallelogram faces, though some of them are coplanar.
\(Z\) is expressed as the intersection of 6480 halfspaces.
The plane equation of each parallelogram is pre-computed,
but redundant ones are not removed (in this version).
For testing a query point xyY, a pseudo-distance metric \(\delta\) is used.
Let the zonohedron \(Z\) be the intersection of the halfspaces
\(h_i,x\) \(\le b_i ~~ i=1,...,n\),
where each \(h_i\) is a unit vector.
The point xyY is converted to XYZ, and \(\delta\)(XYZ) is computed as:
\(\delta\)(XYZ) := max( \(h_i\),XYZ - \(b_i\) )
where the maximum is taken over all \(i=1,...,n\).
This calculation can be optimized;
because the zonohedron is centrally symmetric, only half of the planes actually have to be stored,
and this cuts the memory and processing time in half.
It is clear that XYZ is within the zonohedron iff \(\delta\)(XYZ) \(\le\) 0,
and that XYZ is on the boundary iff \(\delta\)(XYZ)=0.
This pseudo-distance is part of the returned data.frame
.
An interesting fact is that if \(\delta\)(XYZ)>0, then \(\delta\)(XYZ) \(\le\) dist(XYZ,\(Z\)), with equality iff the segment from \(XYZ\) to the point \(z\) on the boundary of \(Z\) closest to XYZ is normal to one of the faces of \(Z\) that contains \(z\). This is why we call \(\delta\) a pseudo-distance. Another interesting fact is that if \(\delta\)(XYZ) \(\le\) 0, then \(\delta\)(XYZ) = -min( \(\Psi_Z(u)\) - \(u\),XYZ ), where the minimum is taken over all unit vectors \(u\) and where \(\Psi_Z\) is the support function of \(Z\).
Centore, Paul. A zonohedral approach to optimal colours. Color Research & Application. Vol. 38. No. 2. pp. 110-119. April 2013.
R<U+00F6>sch, S. Darstellung der Farbenlehre f<U+00FC>r die Zwecke des Mineralogen. Fortschr. Mineral. Krist. Petrogr. Vol. 13 No. 143. 1929.
MacAdam, David L. Maximum Visual Efficiency of Colored Materials. Journal of the Optical Society of America. Vol 25, No. 11. pp. 361-367. November 1935.
Wikipedia. Support Function. https://en.wikipedia.org/wiki/Support_function
# NOT RUN {
IsWithinMacAdamLimits( c(0.6,0.3,10, 0.6,0.3,20, 0.6,0.3,30, 0.6,0.3,40 ), 'C' )
## within delta
## 1 TRUE -1.941841
## 2 TRUE -1.332442
## 3 FALSE 3.513491
## 4 FALSE 12.826172
# }
Run the code above in your browser using DataLab