UNPKG

rpg-dialogue-js

Version:

A simple roleplay game dialogue engine and editor.

80 lines 3.29 kB
"use strict"; /** * @author Ikaros Kappler * @date 2019-02-03 * @modified 2021-03-01 Added `wrapMax` function. * @version 1.1.0 **/ Object.defineProperty(exports, "__esModule", { value: true }); exports.geomutils = void 0; var Line_1 = require("./Line"); var Triangle_1 = require("./Triangle"); /** * A collection of usefull geometry utilities. * * @global **/ exports.geomutils = { /** * Compute the n-section of the angle – described as a triangle (A,B,C) – in point A. * * @param {Vertex} pA - The first triangle point. * @param {Vertex} pB - The second triangle point. * @param {Vertex} pC - The third triangle point. * @param {number} n - The number of desired angle sections (example: 2 means the angle will be divided into two sections, * means an returned array with length 1, the middle line). * * @return {Line[]} An array of n-1 lines secting the given angle in point A into n equal sized angle sections. The lines' first vertex is A. */ nsectAngle: function (pA, pB, pC, n) { var triangle = new Triangle_1.Triangle(pA, pB, pC); var lineAB = new Line_1.Line(pA, pB); var lineAC = new Line_1.Line(pA, pC); // Compute the difference; this is the angle between AB and AC var insideAngle = lineAB.angle(lineAC); // We want the inner angles of the triangle, not the outer angle; // which one is which depends on the triangle 'direction' var clockwise = triangle.determinant() > 0; // For convenience convert the angle [-PI,PI] to [0,2*PI] if (insideAngle < 0) insideAngle = 2 * Math.PI + insideAngle; if (!clockwise) insideAngle = (2 * Math.PI - insideAngle) * (-1); // Scale the rotated lines to the max leg length (looks better) var lineLength = Math.max(lineAB.length(), lineAC.length()); var scaleFactor = lineLength / lineAB.length(); var result = []; for (var i = 1; i < n; i++) { // Compute the i-th inner sector line result.push(new Line_1.Line(pA, pB.clone().rotate((-i * (insideAngle / n)), pA)).scale(scaleFactor)); } return result; }, /** * Wrap the value (e.g. an angle) into the given range of [0,max). * * @name wrapMax * @param {number} x - The value to wrap. * @param {number} max - The max bound to use for the range. * @return {number} The wrapped value inside the range [0,max). */ wrapMax: function (x, max) { // Found at // https://stackoverflow.com/questions/4633177/c-how-to-wrap-a-float-to-the-interval-pi-pi return (max + (x % max)) % max; }, /** * Wrap the value (e.g. an angle) into the given range of [min,max). * * @name wrapMinMax * @param {number} x - The value to wrap. * @param {number} min - The min bound to use for the range. * @param {number} max - The max bound to use for the range. * @return {number} The wrapped value inside the range [min,max). */ // Currently un-used wrapMinMax: function (x, min, max) { return min + exports.geomutils.wrapMax(x - min, max - min); } }; //# sourceMappingURL=geomutils.js.map