molstar
Version:
A comprehensive macromolecular library.
50 lines • 2.06 kB
JavaScript
/**
* 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