const flatten = require('../../utils/flatten')
const union = require('../booleans/union')
const hull = require('./hull')
/**
* Create a chain of hulled geometries from the given geometries.
* Essentially hull A+B, B+C, C+D, etc., then union the results.
* The given geometries should be of the same type, either geom2 or geom3 or path2.
*
* @param {...Objects} geometries - list of geometries from which to create a hull
* @returns {geom2|geom3} new geometry
* @alias module:modeling/hulls.hullChain
*
* @example
* let newshape = hullChain(rectangle({center: [-5,-5]}), circle({center: [0,0]}), rectangle({center: [5,5]}))
*
* @example
* +-------+ +-------+ +-------+ +------+
* | | | | | \ / |
* | A | | C | | | |
* | | | | | |
* +-------+ +-------+ + +
* = \ /
* +-------+ \ /
* | | \ /
* | B | \ /
* | | \ /
* +-------+ +-------+
*/
const hullChain = (...geometries) => {
geometries = flatten(geometries)
if (geometries.length < 2) throw new Error('wrong number of arguments')
const hulls = []
for (let i = 1; i < geometries.length; i++) {
hulls.push(hull(geometries[i - 1], geometries[i]))
}
return union(hulls)
}
module.exports = hullChain