Source: core/position/pos-rectangle.js

"use strict"

/**
 * Rectangle calculations
 * @memberof core.position
 * @namespace rectangle
 */

const geoRectangle = ({ lib, swLib }) => {
    const {
        measureDimensions,
        measureBoundingBox,
        measureCenter
    } = lib.measurements;

    const { position } = swLib.core

    /**
     * ...
     * @memberof core.position.rectangle
     * @param {object} rectGeom 
     * @returns ...
     */
    const getRectangleCoords = (rectGeom) => {
        return position.getGeomCoords(rectGeom)
    }

    /**
     * ...
     * @memberof core.position.rectangle
     * @param {object} rectGeom 
     * @returns ...
     */
    const getRectangleCorners = (rectGeom) => {
        const bBox = measureBoundingBox(rectGeom);

        const coords = getRectangleCoords(rectGeom);
        return {
            c1: [coords.right, coords.front, 0], // (+X, -Y)
            c2: [coords.right, coords.back, 0], // (+X, +Y)
            c3: [coords.left, coords.back, 0], // (-X, +Y)
            c4: [coords.left, coords.front, 0], // (-X, -Y)
        }
    }

    /**
     * ...
     * @memberof core.position.rectangle
     * @param {object} rectGeom 
     * @returns ...
     */
    const getRectangleCentre = (rectGeom) => {
        return measureCenter(rectGeom);
    }

    /**
     * ...
     * @memberof core.position.rectangle
     * @param {object} rectGeom 
     * @returns ...
     */
    const getRectangleCtrlPoints = (rectGeom) => {
        const bBox = measureBoundingBox(rectGeom);
        const dims = measureDimensions(rectGeom);

        const coords = getRectangleCoords(rectGeom);
        const corners = getRectangleCorners(rectGeom);
        const centre = getRectangleCentre(rectGeom);

        const edgeMidpoints = {
            e1: [coords.right, centre[1], centre[2]], // midpoint of edge (Y axis, +X,)
            e2: [centre[0], coords.back, centre[2]], // midpoint of edge (X axis, +Y,)
            e3: [coords.left, centre[1], centre[2]], // midpoint of edge (Y axis, -X,)
            e4: [centre[0], coords.front, centre[2]], // midpoint of edge (X axis, -Y,)
        }

        // i1 to i4 are inside the rectangle, at the centre of each quadrant
        // (each quadrant is practically a sub-rectangle)
        const qtrRectDims = [dims[0] / 4, dims[1] / 4, 0]
        const internal = {
            i0: centre,
            i1: [centre[0] + qtrRectDims[0], centre[1] + qtrRectDims[1], centre[2]], // quadrant I (+X, +Y)
            i2: [centre[0] - qtrRectDims[0], centre[1] + qtrRectDims[1], centre[2]], // quadrant II (-X, +Y)
            i3: [centre[0] - qtrRectDims[0], centre[1] - qtrRectDims[1], centre[2]], // quadrant III (-X, -Y)
            i4: [centre[0] + qtrRectDims[0], centre[1] - qtrRectDims[1], centre[2]], // quadrant VI (+X, -Y)

        }

        return {
            ...internal,
            ...corners,
            ...edgeMidpoints,
        };
    }

    return {
        getRectangleCoords,
        getRectangleCorners,
        getRectangleCentre,
        getRectangleCtrlPoints,
    }
}

module.exports = { init: geoRectangle };