{"version":3,"file":"pointExtras.mjs","sources":["../../src/math-extras/pointExtras.ts"],"sourcesContent":["import { Point } from '../maths/point/Point';\n\nimport type { PointData } from '../maths/point/PointData';\n\n/** @internal */\nexport const pointExtraMixins: any = {\n    add<T extends PointData>(other: PointData, outPoint?: T): T\n    {\n        if (!outPoint)\n        {\n            outPoint = new Point() as PointData as T;\n        }\n        outPoint.x = this.x + other.x;\n        outPoint.y = this.y + other.y;\n\n        return outPoint;\n    },\n    subtract<T extends PointData>(other: PointData, outPoint?: T): T\n    {\n        if (!outPoint)\n        {\n            outPoint = new Point() as PointData as T;\n        }\n        outPoint.x = this.x - other.x;\n        outPoint.y = this.y - other.y;\n\n        return outPoint;\n    },\n    multiply<T extends PointData>(other: PointData, outPoint?: T): T\n    {\n        if (!outPoint)\n        {\n            outPoint = new Point() as PointData as T;\n        }\n        outPoint.x = this.x * other.x;\n        outPoint.y = this.y * other.y;\n\n        return outPoint;\n    },\n    multiplyScalar<T extends PointData>(scalar: number, outPoint?: T): T\n    {\n        if (!outPoint)\n        {\n            outPoint = new Point() as PointData as T;\n        }\n        outPoint.x = this.x * scalar;\n        outPoint.y = this.y * scalar;\n\n        return outPoint;\n    },\n    dot(other: PointData): number\n    {\n        return (this.x * other.x) + (this.y * other.y);\n    },\n    cross(other: PointData): number\n    {\n        /*\n         * Returns the magnitude of the vector that would result\n         * from a regular 3D cross product of the input vectors,\n         * taking their Z values implicitly as 0\n         * (i.e. treating the 2D space as a plane in the 3D space).\n         * The 3D cross product will be perpendicular to that plane,\n         * and thus have 0 X & Y components\n         * (thus the scalar returned is the Z value of the 3D cross product vector).\n         */\n        return (this.x * other.y) - (this.y * other.x);\n    },\n    normalize<T extends PointData>(outPoint?: T): T\n    {\n        if (!outPoint)\n        {\n            outPoint = new Point() as PointData as T;\n        }\n        const magnitude = Math.sqrt((this.x * this.x) + (this.y * this.y));\n\n        outPoint.x = this.x / magnitude;\n        outPoint.y = this.y / magnitude;\n\n        return outPoint;\n    },\n    magnitude(): number\n    {\n        return Math.sqrt((this.x * this.x) + (this.y * this.y));\n    },\n    magnitudeSquared(): number\n    {\n        return (this.x * this.x) + (this.y * this.y);\n    },\n    project<T extends PointData>(onto: PointData, outPoint?: T): T\n    {\n        if (!outPoint)\n        {\n            outPoint = new Point() as PointData as T;\n        }\n        // Math says: a Projected over b = [(a·b) / (b·b)] * b;\n        const normalizedScalarProjection = ((this.x * onto.x) + (this.y * onto.y)) / ((onto.x * onto.x) + (onto.y * onto.y));\n\n        outPoint.x = onto.x * normalizedScalarProjection;\n        outPoint.y = onto.y * normalizedScalarProjection;\n\n        return outPoint;\n    },\n    reflect<T extends PointData>(normal: PointData, outPoint?: T): T\n    {\n        if (!outPoint)\n        {\n            outPoint = new Point() as PointData as T;\n        }\n\n        // Given an incident vector i and a normal vector n, returns the reflection vector r = i - 2 * dot(i, n) * n\n\n        const dotProduct = (this.x * normal.x) + (this.y * normal.y);\n\n        outPoint.x = this.x - (2 * dotProduct * normal.x);\n        outPoint.y = this.y - (2 * dotProduct * normal.y);\n\n        return outPoint;\n    },\n    rotate<T extends PointData>(radians: number, outPoint?: T): T\n    {\n        outPoint ??= new Point() as PointData as T;\n\n        const cosTheta = Math.cos(radians);\n        const sinTheta = Math.sin(radians);\n\n        outPoint.x = (this.x * cosTheta) - (this.y * sinTheta);\n        outPoint.y = (this.x * sinTheta) + (this.y * cosTheta);\n\n        return outPoint;\n    }\n};\n"],"names":[],"mappings":"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"}