pub struct CIELCHuvColor {
    pub l: f64,
    pub c: f64,
    pub h: f64,
}
Expand description

The polar version of CIELUV, analogous to the relationship between CIELCH and CIELAB. Sometimes referred to as CIEHCL, but Scarlet uses CIELCHuv to be explicit and avoid any confusion, as well as keep consistency: in every hue-saturation-value color space or any variation of it, the coordinates are listed in the exact same order.

Example

// hue-shift red to yellow, keeping same brightness: really ends up to be brown
let red = RGBColor{r: 0.7, g: 0.1, b: 0.1};
let red_lch: CIELCHuvColor = red.convert();
let mut yellow = red_lch;
yellow.h = yellow.h + 60.;
println!("{}", red.to_string());
println!("{}", yellow.convert::<RGBColor>().to_string());
println!("{:?}", yellow);
// prints #B31A1A
//        #7B5A00

Fields§

§l: f64

The luminance component. Exactly the same as CIELAB, CIELUV, and CIELCH. Varies between 0 and 100 by definition.

§c: f64

The chroma component: essentially, how colorful the color is compared to white. (This is contrasted with saturation, which is how colorful a color is when compared to an equivalently bright grayscale color: a dark, deep red may have high saturation and low chroma.) This varies between 0 and about 141 for most visible colors, and is the radius in cylindrical coordinates.

§h: f64

The hue component: essentially, what wavelengths of light have the highest reflectance. This is the angle from the vertical axis in cylindrical coordinates. 0 degrees corresponds to red, 90 to yellow, 180 to green, and 270 to blue. (These are called unique hues.) It ranges from 0 to 360, and any value outside that range will be interpreted as its value if one added or subtracted multiples of 360 to bring the value inside that range.

Trait Implementations§

source§

impl Clone for CIELCHuvColor

source§

fn clone(&self) -> CIELCHuvColor

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Color for CIELCHuvColor

source§

fn from_xyz(xyz: XYZColor) -> CIELCHuvColor

Converts from XYZ to CIELCHuv through CIELUV.

source§

fn to_xyz(&self, illuminant: Illuminant) -> XYZColor

Gets the XYZ color that corresponds to this one, through CIELUV.

source§

fn convert<T: Color>(&self) -> T

Converts generic colors from one representation to another. This is done by going back and forth from the CIE 1931 XYZ space, using the illuminant D50 (although this should not affect the results). Just like collect() and other methods in the standard library, the use of type inference will usually allow for clean syntax, but occasionally the turbofish is necessary. Read more
source§

fn hue(&self) -> f64

Gets the generally most accurate version of hue for a given color: the hue coordinate in CIELCH. There are generally considered four “unique hues” that humans perceive as not decomposable into other hues (when mixing additively): these are red, yellow, green, and blue. These unique hues have values of 0, 90, 180, and 270 degrees respectively, with other colors interpolated between them. This returned value will never be outside the range 0 to 360. For more information, you can start at the Wikpedia page. Read more
source§

fn set_hue(&mut self, new_hue: f64)

Sets a perceptually-accurate version hue of a color, even if the space itself does not have a conception of hue. This uses the CIELCH version of hue. To use another one, simply convert and set it manually. If the given hue is not between 0 and 360, it is shifted in that range by adding multiples of 360. Read more
source§

fn lightness(&self) -> f64

Gets a perceptually-accurate version of lightness as a value from 0 to 100, where 0 is black and 100 is pure white. The exact value used is CIELAB’s definition of luminance, which is generally considered a very good standard. Note that this is nonlinear with respect to the physical amount of light emitted: a material with 18% reflectance has a lightness value of 50, not 18. Read more
source§

fn set_lightness(&mut self, new_lightness: f64)

Sets a perceptually-accurate version of lightness, which ranges between 0 and 100 for visible colors. Any values outside of this range will be clamped within it. Read more
source§

fn chroma(&self) -> f64

Gets a perceptually-accurate version of chroma, defined as colorfulness relative to a similarly illuminated white. This has no explicit upper bound, but is always positive and generally between 0 and 180 for visible colors. This is done using the CIELCH model. Read more
source§

fn set_chroma(&mut self, new_chroma: f64)

Sets a perceptually-accurate version of chroma, defined as colorfulness relative to a similarly illuminated white. Uses CIELCH’s defintion of chroma for implementation. Any value below 0 will be clamped up to 0, but because the upper bound depends on the hue and lightness no clamping will be done. This means that this method has a higher chance than normal of producing imaginary colors and any output from this method should be checked. Read more
source§

fn saturation(&self) -> f64

Gets a perceptually-accurate version of saturation, defined as chroma relative to lightness. Generally ranges from 0 to around 10, although exact bounds are tricky. from This means that e.g., a very dark purple could be very highly saturated even if it does not seem so relative to lighter colors. This is computed using the CIELCH model and computing chroma divided by lightness: if the lightness is 0, the saturation is also said to be 0. There is no official formula except ones that require more information than this model of colors has, but the CIELCH formula is fairly standard. Read more
source§

fn set_saturation(&mut self, new_sat: f64)

Sets a perceptually-accurate version of saturation, defined as chroma relative to lightness. Does this without modifying lightness or hue. Any negative value will be clamped to 0, but because the maximum saturation is not well-defined any positive value will be used as is: this means that this method is more likely than others to produce imaginary colors. Uses the CIELCH color space. Generally, saturation ranges from 0 to about 1, but it can go higher. Read more
source§

fn grayscale(&self) -> Selfwhere Self: Sized,

Returns a new Color of the same type as before, but with chromaticity removed: effectively, a color created solely using a mix of black and white that has the same lightness as before. This uses the CIELAB luminance definition, which is considered a good standard and is perceptually accurate for the most part. Read more
source§

fn distance<T: Color>(&self, other: &T) -> f64

Returns a metric of the distance between the given color and another that attempts to accurately reflect human perception. This is done by using the CIEDE2000 difference formula, the current international and industry standard. The result, being a distance, will never be negative: it has no defined upper bound, although anything larger than 100 would be very extreme. A distance of 1.0 is conservatively the smallest possible noticeable difference: anything that is below 1.0 is almost guaranteed to be indistinguishable to most people. Read more
source§

fn visually_indistinguishable<T: Color>(&self, other: &T) -> bool

Using the metric that two colors with a CIEDE2000 distance of less than 1 are indistinguishable, determines whether two colors are visually distinguishable from each other. For more, check out this guide. Read more
source§

impl Debug for CIELCHuvColor

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for CIELCHuvColor

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<CIELCHuvColor> for Coord

source§

fn from(val: CIELCHuvColor) -> Self

Converts to this type from the input type.
source§

impl From<Coord> for CIELCHuvColor

source§

fn from(c: Coord) -> CIELCHuvColor

Converts to this type from the input type.
source§

impl Serialize for CIELCHuvColor

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for CIELCHuvColor

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> ColorPoint for Twhere T: Color + Into<Coord> + From<Coord> + Copy + Clone,

source§

fn euclidean_distance(self, other: Self) -> f64

Gets the Euclidean distance between these two points when embedded in 3D space. This should not be used as an analog of color similarity: use the distance() function for that.
source§

fn weighted_midpoint(self, other: Self, weight: f64) -> Self

Gets the weighted midpoint of two colors in a space as a new Color. This is defined as the color corresponding to the point along the line segment connecting the two points such that the distance to the second point is the weight, which for most applications needs to be between 0 and 1. For example, a weight of 0.9 would make the midpoint one-tenth as much affected by the second points as the first.
source§

fn midpoint(self, other: Self) -> Self

Like weighted_midpoint, but with weight = 0.5: essentially, the Color representing the midpoint of the two inputs in 3D space.
source§

fn weighted_average( self, others: Vec<Self>, weights: Vec<f64> ) -> Result<Self, ColorCalcError>

Returns the weighted average of a given set of colors. Weights will be normalized so that they sum to 1. Each component of the final value will be calculated by summing the components of each of the input colors multiplied by their given weight. Read more
source§

fn average(self, others: Vec<Self>) -> Coord

Returns the arithmetic mean of a given set of colors. Equivalent to weighted_average in the case where each weight is the same.
source§

fn is_imaginary(&self) -> bool

Returns true if the color is outside the range of human vision. Uses the CIE 1931 standard observer spectral data.
source§

fn closest_real_color(&self) -> Self

Returns the closest color that can be seen by the human eye. If the color is not imaginary, returns itself.
source§

fn gradient_scale(&self, other: &Self, n: usize) -> Vec<Self>

Returns a Vector of colors that starts with this color, ends with the given other color, and evenly transitions between colors. The given n is the number of additional colors to add.
source§

fn gradient(&self, other: &Self) -> Box<dyn Fn(f64) -> Self>

Returns a pointer to a function that maps floating-point values from 0 to 1 to colors, such that 0 returns self, 1 returns other, and anything in between returns a mix (calculated linearly). Although it is possible to extrapolate outside of the range [0, 1], this is not a guarantee and may change without warning. For more fine-grained control of gradients, see the GradientColorMap struct. Read more
source§

fn cbrt_gradient(&self, other: &Self) -> Box<dyn Fn(f64) -> Self>

Returns a pointer to a function that maps floating-point values from 0 to 1 to colors, such that 0 returns self, 1 returns other, and anything in between returns a mix (calculated by the cube root of the given value). Although it is possible to extrapolate outside of the range [0, 1], this is not a guarantee and may change without warning. For more fine-grained control of gradients, see the GradientColorMap struct. Read more
source§

fn padded_gradient( &self, other: &Self, lower_pad: f64, upper_pad: f64 ) -> Box<dyn Fn(f64) -> Self>

Returns a pointer to a function that maps floating-point values from 0 to 1 to colors with padding lower_pad and upper_pad such that an input of 0 returns the gradient at lower_pad, an input of 1 returns the gradient at upper_pad, and values in-between are mapped linearly inside that range. For more fine-grained control over gradients, see the GradientColorMap struct. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
§

impl<SS, SP> SupersetOf<SS> for SPwhere SS: SubsetOf<SP>,

§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<G1, G2> Within<G2> for G1where G2: Contains<G1>,

source§

fn is_within(&self, b: &G2) -> bool

source§

impl<T> DeserializeOwned for Twhere T: for<'de> Deserialize<'de>,