UNPKG

molstar

Version:

A comprehensive macromolecular library.

104 lines (103 loc) 3.41 kB
/* * Copyright (c) 2016 - now, David Sehnal, licensed under Apache 2.0, See LICENSE file for more info. */ import * as Coords from './coordinate'; // CONVERSIONS export function cartesianToFractional(box, spacegroup) { const { a: l, b: r } = box; const corners = [ [l[0], l[1], l[2]], [r[0], l[1], l[2]], [l[0], r[1], l[2]], [l[0], l[1], r[2]], [r[0], r[1], l[2]], [r[0], l[1], r[2]], [l[0], r[1], r[2]], [r[0], r[1], r[2]], ].map(c => Coords.cartesianToFractional(Coords.cartesian(c[0], c[1], c[2]), spacegroup)); return bounding(corners); } export function fractionalToGrid(box, domain) { return { a: Coords.fractionalToGrid(box.a, domain, 'bottom'), b: Coords.fractionalToGrid(box.b, domain, 'top') }; } export function gridToFractional(box) { return { a: Coords.gridToFractional(box.a), b: Coords.gridToFractional(box.b) }; } export function fractionalBoxReorderAxes(box, axisOrder) { const { a, b } = box; return { a: Coords.withCoord(a, a[axisOrder[0]], a[axisOrder[1]], a[axisOrder[2]]), b: Coords.withCoord(b, b[axisOrder[0]], b[axisOrder[1]], b[axisOrder[2]]) }; } export function expandGridBox(box, by) { const { a, b } = box; return { a: Coords.withCoord(a, a[0] - by, a[1] - by, a[2] - by), b: Coords.withCoord(b, b[0] + by, b[1] + by, b[2] + by) }; } // MISC export function shift(box, offset) { return { a: Coords.add(box.a, offset), b: Coords.add(box.b, offset) }; } export function clampGridToSamples(box) { return { a: Coords.clampGridToSamples(box.a), b: Coords.clampGridToSamples(box.b) }; } export function fractionalToDomain(box, kind, delta) { const ds = Coords.fractional(box.b[0] - box.a[0], box.b[1] - box.a[1], box.b[2] - box.a[2]); return Coords.domain(kind, { delta, origin: box.a, dimensions: ds, sampleCount: Coords.sampleCounts(ds, delta) }); } export function fractionalFromBlock(block) { const { domain } = block; const a = Coords.gridToFractional(block); const b = Coords.add(a, domain.delta); for (let i = 0; i < 3; i++) { b[i] = Math.min(b[i], domain.origin[i] + domain.dimensions[i]); } return { a, b }; } export function bounding(xs) { const a = Coords.clone(xs[0]); const b = Coords.clone(xs[0]); for (const x of xs) { for (let i = 0; i < 3; i++) { a[i] = Math.min(a[i], x[i]); b[i] = Math.max(b[i], x[i]); } } return { a, b }; } export function areIntersecting(box1, box2) { for (let i = 0; i < 3; i++) { const x = box1.a[i], y = box1.b[i]; const u = box2.a[i], v = box2.b[i]; if (x > v || y < u) return false; } return true; } export function intersect(box1, box2) { const a = Coords.clone(box1.a); const b = Coords.clone(box1.a); for (let i = 0; i < 3; i++) { const x = box1.a[i], y = box1.b[i]; const u = box2.a[i], v = box2.b[i]; if (x > v || y < u) return void 0; a[i] = Math.max(x, u); b[i] = Math.min(y, v); } return { a, b }; } export function dimensions(box) { return [box.b[0] - box.a[0], box.b[1] - box.a[1], box.b[2] - box.a[2]]; } export function volume(box) { return (box.b[0] - box.a[0]) * (box.b[1] - box.a[1]) * (box.b[2] - box.a[2]); }