Пример #1
0
        public Color GetColor(PredefinedColor color, LuminosityLevel luminosity = LuminosityLevel.Unspecified)
        {
            if (color == PredefinedColor.Random)
            {
                return(GetColor(RandomWithin(0, 359)));
            }

            var bounds = color == PredefinedColor.Monochrome ? s_Monochrome : s_ColorPalette[color];

            return(GetColor(luminosity, bounds));
        }
Пример #2
0
        private ReadOnlySpan<LuminosityLevel> ComputeRelativeLuminosityLevels
        (
            ReadOnlySpan<double> neighbourDifferences
        )
        {
            var darks = new List<double>();
            var lights = new List<double>();

            foreach (var difference in neighbourDifferences)
            {
                if (difference >= -this.NoiseCutoff && difference <= this.NoiseCutoff)
                {
                    // This difference is considered a samey value.
                    continue;
                }

                if (difference < this.NoiseCutoff)
                {
                    darks.Add(difference);
                    continue;
                }

                if (difference > this.NoiseCutoff)
                {
                    lights.Add(difference);
                }
            }

            var muchDarkerCutoff = darks.Count > 0 ? darks.Median() : -this.NoiseCutoff;
            var muchLighterCutoff = lights.Count > 0 ? lights.Median() : this.NoiseCutoff;

            Span<LuminosityLevel> luminosityLevels = new LuminosityLevel[neighbourDifferences.Length];
            for (var i = 0; i < neighbourDifferences.Length; i++)
            {
                var difference = neighbourDifferences[i];
                if (difference >= -this.NoiseCutoff && difference <= this.NoiseCutoff)
                {
                    luminosityLevels[i] = LuminosityLevel.Same;
                    continue;
                }

                if (difference < 0.0)
                {
                    luminosityLevels[i] = difference < muchDarkerCutoff ? LuminosityLevel.MuchDarker : LuminosityLevel.Darker;
                    continue;
                }

                luminosityLevels[i] = difference > muchLighterCutoff ? LuminosityLevel.MuchLighter : LuminosityLevel.Lighter;
            }

            return luminosityLevels;
        }
Пример #3
0
        private Color GetColor(LuminosityLevel luminosity, ColorBounds bounds)
        {
            // Pick Hue
            var hue = PickHue(bounds.HueRange);

            // Pick Saturation
            var saturation = PickSaturation(bounds.SaturationRange, luminosity);

            // Pick Brightness based on Saturation
            var brightness = PickBrightness(bounds.BrightnessCurve, saturation, bounds.SaturationRange, luminosity);

            // Convert to Color object
            return(HSBtoColor(hue, saturation, brightness));
        }
Пример #4
0
        public Color GetColor(int hue, LuminosityLevel luminosity = LuminosityLevel.Unspecified)
        {
            var h = hue % 360;

            foreach (var v in s_ColorPalette.Values)
            {
                if (v.HueRange.Min <= h && h <= v.HueRange.Max)
                {
                    return(GetColor(luminosity, v));
                }
            }

            return(GetColor(luminosity, s_ColorPalette[PredefinedColor.Red]));
        }
Пример #5
0
        int PickSaturation(Range range, LuminosityLevel luminosity)
        {
            if (range == null)
            {
                return(0);
            }

            switch (luminosity)
            {
            case LuminosityLevel.Random:
                return(RandomWithin(0, 100));

            case LuminosityLevel.Bright:
                return(RandomWithin(55, range.Max));

            case LuminosityLevel.Dark:
                return(RandomWithin(range.Max - 10, range.Max));

            case LuminosityLevel.Light:
                return(RandomWithin(range.Min, 55));
            }

            return(RandomWithin(range));
        }
Пример #6
0
        int PickBrightness(AnimationCurve brightnessCurve, int saturation, Range saturationRange, LuminosityLevel luminosity)
        {
            if (luminosity == LuminosityLevel.Random)
            {
                return(RandomWithin(0, 100));
            }

            var t          = saturationRange == null ? 0 : Mathf.InverseLerp(saturationRange.Min, saturationRange.Max, saturation);
            var brightness = (int)brightnessCurve.Evaluate(t);

            switch (luminosity)
            {
            case LuminosityLevel.Dark:
                return(RandomWithin(brightness, brightness + 20));

            case LuminosityLevel.Light:
                return(RandomWithin((brightness + 100) / 2, 100));
            }

            return(RandomWithin(brightness, 100));
        }