UNPKG

@jscad/modeling

Version:

Constructive Solid Geometry (CSG) Library for JSCAD

43 lines (38 loc) 1.17 kB
const { EPS } = require('../constants') const vec3 = require('../vec3') /** * Create a new plane from the given points like fromPoints, * but allow the vectors to be on one point or one line. * In such a case, a random plane through the given points is constructed. * * @param {plane} out - receiving plane * @param {vec3} a - 3D point * @param {vec3} b - 3D point * @param {vec3} c - 3D point * @returns {plane} out * @alias module:modeling/maths/plane.fromPointsRandom */ const fromPointsRandom = (out, a, b, c) => { let ba = vec3.subtract(vec3.create(), b, a) let ca = vec3.subtract(vec3.create(), c, a) if (vec3.length(ba) < EPS) { ba = vec3.orthogonal(ba, ca) } if (vec3.length(ca) < EPS) { ca = vec3.orthogonal(ca, ba) } let normal = vec3.cross(vec3.create(), ba, ca) if (vec3.length(normal) < EPS) { // this would mean that ba == ca.negated() ca = vec3.orthogonal(ca, ba) normal = vec3.cross(normal, ba, ca) } normal = vec3.normalize(normal, normal) const w = vec3.dot(normal, a) out[0] = normal[0] out[1] = normal[1] out[2] = normal[2] out[3] = w return out } module.exports = fromPointsRandom