All files / app/codeCharta/util/color gradientCalculator.ts

94% Statements 47/50
72.72% Branches 16/22
100% Functions 3/3
94% Lines 47/50

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87  59x 59x     59x   8x 8x   8x 4x 4x 4x     4x 4x 4x       7x 7x   7x 1x     6x 2x     4x 1x     3x 2x 2x 2x     1x 1x 1x       52x 52x 52x 52x   52x             52x 16x     36x 13x 13x 13x 13x     23x 2x     21x 2x 2x 2x 2x     19x      
import { ColorRange, MapColors } from "../../codeCharta.model"
import { ColorConverter } from "./colorConverter"
import { Color } from "three"
import { MetricMinMax } from "../../state/selectors/accumulatedData/metricData/selectedColorMetricData.selector"
 
export const gradientCalculator = {
    getColorByTrueGradient(mapColors: MapColors, colorRange: ColorRange, nodeMetricDataRange: MetricMinMax, metricValue: number) {
        const middle = (colorRange.from + colorRange.to) / 2
        const neutralColorRGB = ColorConverter.convertHexToColorObject(mapColors.neutral)
 
        if (metricValue <= middle) {
            const neutralFactor = metricValue / middle
            const positiveColorRGB = ColorConverter.convertHexToColorObject(mapColors.positive)
            return ColorConverter.convertColorToHex(new Color().lerpColors(positiveColorRGB, neutralColorRGB, neutralFactor))
        }
 
        const negativeFactor = (metricValue - middle) / (nodeMetricDataRange.maxValue - middle)
        const negativeColorRGB = ColorConverter.convertHexToColorObject(mapColors.negative)
        return ColorConverter.convertColorToHex(new Color().lerpColors(neutralColorRGB, negativeColorRGB, negativeFactor))
    },
 
    getColorByFocusedGradient(mapColors: MapColors, colorRange: ColorRange, nodeMetricDataRange: MetricMinMax, metricValue: number) {
        const middle = (colorRange.from + colorRange.to) / 2
        const neutralColorRGB = ColorConverter.convertHexToColorObject(mapColors.neutral)
 
        if (metricValue < colorRange.from || colorRange.from === nodeMetricDataRange.maxValue) {
            return mapColors.positive
        }
 
        if (metricValue >= colorRange.to && colorRange.to !== nodeMetricDataRange.maxValue) {
            return mapColors.negative
        }
 
        if (metricValue === middle) {
            return mapColors.neutral
        }
 
        if (metricValue < middle) {
            const neutralFactor = metricValue / (middle + colorRange.from)
            const positiveColorRGB = ColorConverter.convertHexToColorObject(mapColors.positive)
            return ColorConverter.convertColorToHex(new Color().lerpColors(positiveColorRGB, neutralColorRGB, neutralFactor))
        }
 
        const negativeFactor = (metricValue - middle) / (colorRange.to - middle)
        const negativeColorRGB = ColorConverter.convertHexToColorObject(mapColors.negative)
        return ColorConverter.convertColorToHex(new Color().lerpColors(neutralColorRGB, negativeColorRGB, negativeFactor))
    },
 
    getColorByWeightedGradient(mapColors: MapColors, colorRange: ColorRange, nodeMetricDataRange: MetricMinMax, metricValue: number) {
        const endPositive = Math.max(colorRange.from - (colorRange.to - colorRange.from) / 2, colorRange.from / 2)
        const startNeutral = 2 * colorRange.from - endPositive
        const endNeutral = colorRange.to - (colorRange.to - colorRange.from) / 2
        const startNegative = colorRange.to
 
        Iif (endPositive === startNeutral && startNeutral === endNeutral && endNeutral === startNegative) {
            Iif (metricValue < endPositive || colorRange.to === nodeMetricDataRange.maxValue) {
                return mapColors.positive
            }
            return mapColors.negative
        }
 
        if (metricValue <= endPositive) {
            return mapColors.positive
        }
 
        if (metricValue < startNeutral) {
            const factor = (metricValue - endPositive) / (startNeutral - endPositive)
            const positiveColorRGB = ColorConverter.convertHexToColorObject(mapColors.positive)
            const neutralColorRGB = ColorConverter.convertHexToColorObject(mapColors.neutral)
            return ColorConverter.convertColorToHex(new Color().lerpColors(positiveColorRGB, neutralColorRGB, factor))
        }
 
        if (metricValue <= endNeutral) {
            return mapColors.neutral
        }
 
        if (metricValue < startNegative || colorRange.to === nodeMetricDataRange.maxValue) {
            const factor = (metricValue - endNeutral) / (startNegative - endNeutral)
            const neutralColorRGB = ColorConverter.convertHexToColorObject(mapColors.neutral)
            const negativeColorRGB = ColorConverter.convertHexToColorObject(mapColors.negative)
            return ColorConverter.convertColorToHex(new Color().lerpColors(neutralColorRGB, negativeColorRGB, factor))
        }
 
        return mapColors.negative
    }
}