const flatten = require('../utils/flatten')
const { geom2, geom3, path2 } = require('../geometries')
const calculateEpsilonFromBounds = require('./calculateEpsilonFromBounds')
const measureBoundingBox = require('./measureBoundingBox')
/*
* Measure the epsilon of the given (path2) geometry.
* @return {Number} the epsilon (precision) of the geometry
*/
const measureEpsilonOfPath2 = (geometry) => calculateEpsilonFromBounds(measureBoundingBox(geometry), 2)
/*
* Measure the epsilon of the given (geom2) geometry.
* @return {Number} the epsilon (precision) of the geometry
*/
const measureEpsilonOfGeom2 = (geometry) => calculateEpsilonFromBounds(measureBoundingBox(geometry), 2)
/*
* Measure the epsilon of the given (geom3) geometry.
* @return {Float} the epsilon (precision) of the geometry
*/
const measureEpsilonOfGeom3 = (geometry) => calculateEpsilonFromBounds(measureBoundingBox(geometry), 3)
/**
* Measure the epsilon of the given geometries.
* Epsilon values are used in various functions to determine minimum distances between points, planes, etc.
* @param {...Object} geometries - the geometries to measure
* @return {Number|Array} the epsilon, or a list of epsilons for each geometry
* @alias module:modeling/measurements.measureEpsilon
*
* @example
* let epsilon = measureEpsilon(sphere())
*/
const measureEpsilon = (...geometries) => {
geometries = flatten(geometries)
if (geometries.length === 0) throw new Error('wrong number of arguments')
const results = geometries.map((geometry) => {
if (path2.isA(geometry)) return measureEpsilonOfPath2(geometry)
if (geom2.isA(geometry)) return measureEpsilonOfGeom2(geometry)
if (geom3.isA(geometry)) return measureEpsilonOfGeom3(geometry)
return 0
})
return results.length === 1 ? results[0] : results
}
module.exports = measureEpsilon