Source: swcad-js-core/src/models/profiles/arch-2d.js

"use strict"

/**
 * Builds circle-based arches.
 * @memberof profiles
 * @namespace arch
 */

const archBuilder = ({ lib }) => {
  const { path2, geom2 } = lib.geometries
  const { extrudeRotate } = lib.extrusions
  const { arc, cuboid } = lib.primitives
  const { translate, mirror, rotate, align } = lib.transforms
  const { union, subtract, intersect } = lib.booleans
  const { measureDimensions } = lib.measurements;

  return {
    /**
     * Builds a one-centre (semicircular) arch.
     * @memberof profiles.arch
     * @instance
     * @param {Object} opts 
     * @param {number} opts.arcRadius - arc radius 
     */
    onePtArch: (opts) => {
      const arcRad = opts.arcRadius;
      const baseArchPath = path2.close(arc({ radius: arcRad, endAngle: Math.PI, segments: 48 }));
      return geom2.fromPoints(path2.toPoints(baseArchPath));
    },
    /**
     * Builds a two-centre pointed arch.
     * @memberof profiles.arch
     * @instance
     * @param {Object} opts 
     * @param {number} opts.arcRadius - arc radius 
     * @param {number} opts.archWidth - arch width 
     */
    twoPtArch: (opts) => {
      const arcRad = opts.arcRadius;
      const archWth = opts.archWidth;
      // 2D
      const baseArchPath = path2.close(arc({ radius: arcRad, endAngle: Math.PI, segments: 48 }));
      const baseArch = geom2.fromPoints(path2.toPoints(baseArchPath));
      const mirrorAxis = arcRad - (archWth / 2);
      const reflectedArch = mirror({ normal: [1, 0, 0], origin: [mirrorAxis, 0, 0] }, baseArch);
      return align({ modes: ['center', 'min', 'min'] }, intersect(baseArch, reflectedArch));

    },
    threePt: (opts) => {
      return null;
    },
    fourPt: (opts) => {
      return null;
    },
  }
}

module.exports = { init: archBuilder }