@realsee/dnalogel
Version:
40 lines (39 loc) • 1.16 kB
JavaScript
import { Vector3 as l } from "three";
import { centerPoint as A } from "../../shared-utils/three/centerPoint.js";
function w(r) {
return a(r).reduce((e, [n, i, o]) => e + u(n, i, o), 0);
}
function b(r) {
const t = a(r);
if (t.length === 0)
return;
let e = 0, n = new l();
for (const [i, o, c] of t) {
const s = u(i, o, c), g = d(i, o, c, s);
e += s, n.add(g);
}
return n = n.divideScalar(e), { center: n, area: e };
}
function u(r, t, e) {
return t.clone().sub(r).cross(e.clone().sub(r)).length() / 2;
}
function d(r, t, e, n) {
const i = n != null ? n : u(r, t, e);
return A(r, t, e).multiplyScalar(i);
}
function a(r) {
var i;
const t = r.getAttribute("position"), e = (i = r.getIndex()) == null ? void 0 : i.array;
if (!t || !e)
return [];
let n = [];
for (let o = 0; o < e.length; o += 3) {
const c = e[o], s = e[o + 1], g = e[o + 2], f = new l().fromArray([t.getX(c), t.getY(c), t.getZ(c)]), m = new l().fromArray([t.getX(s), t.getY(s), t.getZ(s)]), p = new l().fromArray([t.getX(g), t.getY(g), t.getZ(g)]);
n.push([f, m, p]);
}
return n;
}
export {
w as getGeometryArea,
b as getGeometryInfo
};