import Location from '../geom/Location' import Position from './Position' export default class Depth { constructor() { Depth.constructor_.apply(this, arguments) } static constructor_() { this._depth = Array(2).fill().map(() => Array(3)) for (let i = 0; i < 2; i++) for (let j = 0; j < 3; j++) this._depth[i][j] = Depth.NULL_VALUE } static depthAtLocation(location) { if (location === Location.EXTERIOR) return 0 if (location === Location.INTERIOR) return 1 return Depth.NULL_VALUE } getDepth(geomIndex, posIndex) { return this._depth[geomIndex][posIndex] } setDepth(geomIndex, posIndex, depthValue) { this._depth[geomIndex][posIndex] = depthValue } isNull() { if (arguments.length === 0) { for (let i = 0; i < 2; i++) for (let j = 0; j < 3; j++) if (this._depth[i][j] !== Depth.NULL_VALUE) return false return true } else if (arguments.length === 1) { const geomIndex = arguments[0] return this._depth[geomIndex][1] === Depth.NULL_VALUE } else if (arguments.length === 2) { const geomIndex = arguments[0], posIndex = arguments[1] return this._depth[geomIndex][posIndex] === Depth.NULL_VALUE } } normalize() { for (let i = 0; i < 2; i++) if (!this.isNull(i)) { let minDepth = this._depth[i][1] if (this._depth[i][2] < minDepth) minDepth = this._depth[i][2] if (minDepth < 0) minDepth = 0 for (let j = 1; j < 3; j++) { let newValue = 0 if (this._depth[i][j] > minDepth) newValue = 1 this._depth[i][j] = newValue } } } getDelta(geomIndex) { return this._depth[geomIndex][Position.RIGHT] - this._depth[geomIndex][Position.LEFT] } getLocation(geomIndex, posIndex) { if (this._depth[geomIndex][posIndex] <= 0) return Location.EXTERIOR return Location.INTERIOR } toString() { return 'A: ' + this._depth[0][1] + ',' + this._depth[0][2] + ' B: ' + this._depth[1][1] + ',' + this._depth[1][2] } add() { if (arguments.length === 1) { const lbl = arguments[0] for (let i = 0; i < 2; i++) for (let j = 1; j < 3; j++) { const loc = lbl.getLocation(i, j) if (loc === Location.EXTERIOR || loc === Location.INTERIOR) if (this.isNull(i, j)) this._depth[i][j] = Depth.depthAtLocation(loc) else this._depth[i][j] += Depth.depthAtLocation(loc) } } else if (arguments.length === 3) { const geomIndex = arguments[0], posIndex = arguments[1], location = arguments[2] if (location === Location.INTERIOR) this._depth[geomIndex][posIndex]++ } } } Depth.NULL_VALUE = -1