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 | 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 3000x 3000x 3000x 3000x 3000x 3000x 2999x 2999x 2999x 6x 6x 6x 1x 3000x 3000x 3000x 3000x 3000x 3000x 3000x 3000x 3000x 3000x 1x 6x 6x | import { Parser, Expression } from "expr-eval"
import { scaleLinear, scaleLog } from "d3-scale"
import { ScaleType } from "../core/GrapherConstants"
 
export function generateComparisonLinePoints(
    lineFunction: string = "x",
    xScaleDomain: [number, number],
    yScaleDomain: [number, number],
    xScaleType: ScaleType,
    yScaleType: ScaleType
): [number, number][] {
    const expr = parseEquation(lineFunction)?.simplify({
        e: Math.E,
        pi: Math.PI,
    })
    const yFunc = (x: number): number | undefined =>
        evalExpression(expr, { x }, undefined)
 
    // Construct control data by running the equation across sample points
    const numPoints = 500
 
    const scaleFunction = xScaleType === ScaleType.log ? scaleLog : scaleLinear
    const scale = scaleFunction().domain(xScaleDomain).range([0, numPoints])
 
    const controlData: Array<[number, number]> = []
    for (let i = 0; i < numPoints; i++) {
        const x = scale.invert(i)
        const y = yFunc(x)
 
        if (y === undefined || Number.isNaN(x) || Number.isNaN(y)) continue
        if (xScaleType === ScaleType.log && x <= 0) continue
        if (yScaleType === ScaleType.log && y <= 0) continue
        if (y > yScaleDomain[1]) continue
        controlData.push([x, y])
    }
 
    return controlData
}
 
function evalExpression<D>(
    expr: Expression | undefined,
    context: Record<string, number>,
    defaultOnError: D
): number | D {
    if (expr === undefined) return defaultOnError
    try {
        return expr.evaluate(context) as number
    } catch (e) {
        return defaultOnError
    }
}
 
function parseEquation(equation: string): Expression | undefined {
    try {
        return Parser.parse(equation)
    } catch (e) {
        console.error(e)
        return undefined
    }
}
  |