public findNextColor()

in packages/utilities/fast-colors/src/color-scale.ts [143:194]


    public findNextColor(
        position: number,
        contrast: number,
        searchDown: boolean = false,
        interpolationMode: ColorInterpolationSpace = ColorInterpolationSpace.RGB,
        contrastErrorMargin: number = 0.005,
        maxSearchIterations: number = 32
    ): number {
        if (isNaN(position) || position <= 0) {
            position = 0;
        } else if (position >= 1) {
            position = 1;
        }
        const startingColor: ColorRGBA64 = this.getColor(position, interpolationMode);
        const finalPosition: number = searchDown ? 0 : 1;
        const finalColor: ColorRGBA64 = this.getColor(finalPosition, interpolationMode);
        const finalContrast: number = contrastRatio(startingColor, finalColor);
        if (finalContrast <= contrast) {
            return finalPosition;
        }

        let testRangeMin: number = searchDown ? 0 : position;
        let testRangeMax: number = searchDown ? position : 0;
        let mid: number = finalPosition;
        let iterations: number = 0;

        while (iterations <= maxSearchIterations) {
            mid = Math.abs(testRangeMax - testRangeMin) / 2 + testRangeMin;
            const midColor: ColorRGBA64 = this.getColor(mid, interpolationMode);
            const midContrast: number = contrastRatio(startingColor, midColor);

            if (Math.abs(midContrast - contrast) <= contrastErrorMargin) {
                return mid;
            } else if (midContrast > contrast) {
                if (searchDown) {
                    testRangeMin = mid;
                } else {
                    testRangeMax = mid;
                }
            } else {
                if (searchDown) {
                    testRangeMax = mid;
                } else {
                    testRangeMin = mid;
                }
            }

            iterations++;
        }

        return mid;
    }