|
@@ -1,7 +1,8 @@
|
|
|
/**
|
|
|
- * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
|
|
+ * 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 '../../mol-math/linear-algebra/3d';
|
|
@@ -12,7 +13,7 @@ export { CentroidHelper }
|
|
|
class CentroidHelper {
|
|
|
private count = 0;
|
|
|
|
|
|
- center: Vec3 = Vec3.zero();
|
|
|
+ center: Vec3 = Vec3();
|
|
|
radiusSq = 0;
|
|
|
|
|
|
reset() {
|
|
@@ -46,21 +47,58 @@ class CentroidHelper {
|
|
|
}
|
|
|
|
|
|
namespace CentroidHelper {
|
|
|
- const helper = new CentroidHelper(), p = Vec3.zero();
|
|
|
+ const helper = new CentroidHelper()
|
|
|
+ const posA = Vec3()
|
|
|
+ const posB = Vec3()
|
|
|
|
|
|
- export function compute({ x, y, z }: { x: ArrayLike<number>, y: ArrayLike<number>, z: ArrayLike<number> }, to: Vec3) {
|
|
|
+ export function fromArrays({ x, y, z }: { x: ArrayLike<number>, y: ArrayLike<number>, z: ArrayLike<number> }, to: Sphere3D) {
|
|
|
helper.reset();
|
|
|
const n = x.length;
|
|
|
for (let i = 0; i < n; i++) {
|
|
|
- Vec3.set(p, x[i], y[i], z[i]);
|
|
|
- helper.includeStep(p);
|
|
|
+ Vec3.set(posA, x[i], y[i], z[i]);
|
|
|
+ helper.includeStep(posA);
|
|
|
}
|
|
|
helper.finishedIncludeStep();
|
|
|
for (let i = 0; i < n; i++) {
|
|
|
- Vec3.set(p, x[i], y[i], z[i]);
|
|
|
- helper.radiusStep(p);
|
|
|
+ Vec3.set(posA, x[i], y[i], z[i]);
|
|
|
+ helper.radiusStep(posA);
|
|
|
}
|
|
|
- Vec3.copy(to, helper.center);
|
|
|
+ Vec3.copy(to.center, helper.center);
|
|
|
+ to.radius = Math.sqrt(helper.radiusSq)
|
|
|
+ return to;
|
|
|
+ }
|
|
|
+
|
|
|
+ export function fromProvider(count: number, getter: (i: number, pos: Vec3) => void, to: Sphere3D) {
|
|
|
+ helper.reset();
|
|
|
+ for (let i = 0; i < count; i++) {
|
|
|
+ getter(i, posA)
|
|
|
+ helper.includeStep(posA);
|
|
|
+ }
|
|
|
+ helper.finishedIncludeStep();
|
|
|
+ for (let i = 0; i < count; i++) {
|
|
|
+ getter(i, posA)
|
|
|
+ helper.radiusStep(posA);
|
|
|
+ }
|
|
|
+ Vec3.copy(to.center, helper.center);
|
|
|
+ to.radius = Math.sqrt(helper.radiusSq)
|
|
|
+ return to;
|
|
|
+ }
|
|
|
+
|
|
|
+ export function fromPairProvider(count: number, getter: (i: number, posA: Vec3, posB: Vec3) => void, to: Sphere3D) {
|
|
|
+ helper.reset();
|
|
|
+ for (let i = 0; i < count; i++) {
|
|
|
+ getter(i, posA, posB)
|
|
|
+ helper.includeStep(posA);
|
|
|
+ helper.includeStep(posB);
|
|
|
+ }
|
|
|
+ helper.finishedIncludeStep();
|
|
|
+ for (let i = 0; i < count; i++) {
|
|
|
+ getter(i, posA, posB)
|
|
|
+ helper.radiusStep(posA);
|
|
|
+ helper.radiusStep(posB);
|
|
|
+ }
|
|
|
+ Vec3.copy(to.center, helper.center);
|
|
|
+ to.radius = Math.sqrt(helper.radiusSq)
|
|
|
return to;
|
|
|
}
|
|
|
}
|