UNPKG

molstar

Version:

A comprehensive macromolecular library.

50 lines 2.06 kB
/** * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal <david.sehnal@gmail.com> * @author Alexander Rose <alexander.rose@weirdbyte.de> */ import { Vec3 } from '../linear-algebra'; import { OrderedSet } from '../../mol-data/int'; import { BoundaryHelper } from './boundary-helper'; import { Box3D, Sphere3D } from '../geometry'; // avoiding namespace lookup improved performance in Chrome (Aug 2020) var v3set = Vec3.set; var boundaryHelperCoarse = new BoundaryHelper('14'); var boundaryHelperFine = new BoundaryHelper('98'); function getBoundaryHelper(count) { return count > 10000 ? boundaryHelperCoarse : boundaryHelperFine; } var p = Vec3(); export function getBoundary(data) { var x = data.x, y = data.y, z = data.z, radius = data.radius, indices = data.indices; var n = OrderedSet.size(indices); if (n > 250000) { var box = Box3D.computeBounding(data); return { box: box, sphere: Sphere3D.fromBox3D(Sphere3D(), box) }; } var boundaryHelper = getBoundaryHelper(n); boundaryHelper.reset(); for (var t = 0; t < n; t++) { var i = OrderedSet.getAt(indices, t); v3set(p, x[i], y[i], z[i]); boundaryHelper.includePositionRadius(p, (radius && radius[i]) || 0); } boundaryHelper.finishedIncludeStep(); for (var t = 0; t < n; t++) { var i = OrderedSet.getAt(indices, t); v3set(p, x[i], y[i], z[i]); boundaryHelper.radiusPositionRadius(p, (radius && radius[i]) || 0); } var sphere = boundaryHelper.getSphere(); if (!radius && Sphere3D.hasExtrema(sphere) && n <= sphere.extrema.length) { var extrema = []; for (var t = 0; t < n; t++) { var i = OrderedSet.getAt(indices, t); extrema.push(Vec3.create(x[i], y[i], z[i])); } Sphere3D.setExtrema(sphere, extrema); } return { box: boundaryHelper.getBox(), sphere: sphere }; } //# sourceMappingURL=boundary.js.map