UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

60 lines (49 loc) 1.63 kB
/** * Calculates the incenter of a triangle. * * @see https://en.wikipedia.org/wiki/Incenter * @param {number[]|Float32Array|Float64Array|ArrayLike<number>} output * @param {number} output_offset * @param {number} x0 * @param {number} y0 * @param {number} z0 * @param {number} x1 * @param {number} y1 * @param {number} z1 * @param {number} x2 * @param {number} y2 * @param {number} z2 * @returns {boolean} true when the result was calculated, false for degenerate triangle */ export function triangle3_incenter( output, output_offset, x0, y0, z0, x1, y1, z1, x2, y2, z2 ) { // Calculate edge lengths opposite to each vertex // 'a' is length of edge v1-v2 (opposite v0) const dxA = x2 - x1; const dyA = y2 - y1; const dzA = z2 - z1; const a = Math.sqrt(dxA * dxA + dyA * dyA + dzA * dzA); // 'b' is length of edge v2-v0 (opposite v1) const dxB = x0 - x2; const dyB = y0 - y2; const dzB = z0 - z2; const b = Math.sqrt(dxB * dxB + dyB * dyB + dzB * dzB); // 'c' is length of edge v0-v1 (opposite v2) const dxC = x1 - x0; const dyC = y1 - y0; const dzC = z1 - z0; const c = Math.sqrt(dxC * dxC + dyC * dyC + dzC * dzC); const perimeter = a + b + c; if (perimeter <= 0) { // 0 perimeter triangle return false; } output[output_offset] = (a * x0 + b * x1 + c * x2) / perimeter; output[output_offset + 1] = (a * y0 + b * y1 + c * y2) / perimeter; output[output_offset + 2] = (a * z0 + b * z1 + c * z2) / perimeter; return true; }