Source: core/position/pos-triangle.js

"use strict"

/**
 * Triangle calculations
 * @memberof core.position
 * @namespace triangle
 */

const geoTriangle = ({ lib, swLib }) => {
    const { measureDimensions, measureBoundingBox, measureCenter } = lib.measurements;
    const { TAU } = lib.maths.constants

    const getTriangleCtrlPoints = (points) => {
        return null;
    }

    const centroid = (points) => {
        return null;
    }

    const orthocentre = (points) => {
        return null;
    }

    const circumcentre = (points) => {
        return null;
    }

    const circumradius = (points) => {
        return null;
    }

    const incentre = (points) => {
        return null;
    }

    const incircleRadius = (points) => {
        return null;
    }

    const eulerLine = (points) => {
        return null;
    }

    /**
     * ...
     * @param {object} opts 
     * @param {number} opts.hypot 
     * @param {number} opts.long 
     * @param {number} opts.short 
     * @param {number} opts.longAngle 
     * @param {number} opts.shortAngle 
     * @returns If valid, returns triangle creation strategy (AAS, ASA, SAS, etc) and values for `jscad.primitives.triangle()`. If invalid, returns `null`
     */
    const rightTriangleOpts = ({
        hypot,
        long,
        short,
        longAngle,
        shortAngle,
    }) => {

        const isValueValid = (val) => {
            return typeof val == 'number' && val >= 0
        }

        const sides = { hypot, long, short }
        const angles = { longAngle, shortAngle }

        const validSides = Object.entries(sides).filter(([sideName, sideVal]) => {
            return isValueValid(sideVal)
        })
        const validAngles = Object.entries(angles).filter(([angleName, angleVal]) => {
            return isValueValid(angleVal)
        })

        if (validSides.length == 0 && validAngles.length == 0) {
            return null
        }

        const sideKeys = validSides.map(vSide => vSide[0]);
        const angleKeys = validAngles.map(vSide => vSide[0]);

        // follows JSCAD defaults
        let outType = 'SSS'
        let outValues = [1, 1, 1]

        if (validSides.length == 3) {
            outType = 'SSS'
            outValues = [short, hypot, long]
        } else if (sideKeys.includes('long') && sideKeys.includes('short')) {
            outType = 'SAS'
            outValues = [short, TAU / 4, long]
        } else if (sideKeys.includes('long') && angleKeys.includes('shortAngle')) {
            outType = 'AAS'
            outValues = [TAU / 4, shortAngle, long]
        } else if (sideKeys.includes('long') && angleKeys.includes('longAngle')) {
            outType = 'ASA'
            outValues = [TAU / 4, long, longAngle]
        } else if (sideKeys.includes('short') && angleKeys.includes('longAngle')) {
            outType = 'AAS'
            outValues = [TAU / 4, longAngle, short]
        } else if (sideKeys.includes('short') && angleKeys.includes('shortAngle')) {
            outType = 'ASA'
            outValues = [TAU / 4, short, shortAngle]
        } else if (sideKeys.includes('hypot') && angleKeys.includes('longAngle') && angleKeys.includes('shortAngle')) {
            outType = 'ASA'
            outValues = [longAngle, hypot, shortAngle]
        }

        return {
            type: outType,
            values: outValues,
        }
    }

    return {
        getTriangleCtrlPoints,
        centroid,
        orthocentre,
        circumcentre,
        circumradius,
        incentre,
        incircleRadius,
        eulerLine,
        rightTriangleOpts,
    }
}

module.exports = { init: geoTriangle };