Skip to content
Snippets Groups Projects
Commit 5ea81a5d authored by Alexander Rose's avatar Alexander Rose
Browse files

fixed boundingSphere calculation

parent e7a0ba8d
No related branches found
No related tags found
No related merge requests found
......@@ -37,13 +37,13 @@ function computeElementsPositionBoundary(elements: SortedArray<ElementIndex>, po
for (let j = 0, _j = elements.length; j < _j; j++) {
position(elements[j], p)
const d = Vec3.squaredDistance(p, center)
if (d > radiusSq) radiusSq = d;
if (d > radiusSq) radiusSq = d
}
return {
box: { min, max },
sphere: { center, radius: Math.sqrt(radiusSq) }
};
}
}
function computeInvariantUnitBoundary(u: Unit): Boundary {
......@@ -62,7 +62,7 @@ export function computeStructureBoundary(s: Structure): Boundary {
const max = Vec3.create(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE)
const center = Vec3.zero()
const { units } = s;
const { units } = s
const boundaryMap: Map<number, Boundary> = new Map()
function getInvariantBoundary(u: Unit) {
......@@ -76,19 +76,19 @@ export function computeStructureBoundary(s: Structure): Boundary {
return boundary
}
let radiusSq = 0;
let size = 0;
let radius = 0
let size = 0
for (let i = 0, _i = units.length; i < _i; i++) {
size += 1
const u = units[i]
const invariantBoundary = getInvariantBoundary(u)
const m = u.conformation.operator.matrix
size += u.elements.length
Box3D.transform(tmpBox, invariantBoundary.box, m)
Vec3.min(min, min, tmpBox.min)
Vec3.max(max, max, tmpBox.max)
Sphere3D.transform(tmpSphere, invariantBoundary.sphere, m)
Vec3.add(center, center, tmpSphere.center)
Vec3.scaleAndAdd(center, center, tmpSphere.center, u.elements.length)
}
if (size > 0) Vec3.scale(center, center, 1/size)
......@@ -98,70 +98,9 @@ export function computeStructureBoundary(s: Structure): Boundary {
const invariantBoundary = getInvariantBoundary(u)
const m = u.conformation.operator.matrix
Sphere3D.transform(tmpSphere, invariantBoundary.sphere, m)
const d = Vec3.squaredDistance(tmpSphere.center, center) + (tmpSphere.radius * tmpSphere.radius) * 4
if (d > radiusSq) radiusSq = d
}
const b = {
box: { min, max },
sphere: { center, radius: Math.sqrt(radiusSq) }
};
console.log(b, computeStructureBoundary2(s))
return b
}
export function computeStructureBoundary2(s: Structure): Boundary {
const min = [Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE];
const max = [-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE];
const { units } = s;
let cx = 0, cy = 0, cz = 0;
let radiusSq = 0;
let size = 0;
for (let i = 0, _i = units.length; i < _i; i++) {
const { x, y, z } = units[i].conformation;
const elements = units[i].elements;
size += elements.length;
for (let j = 0, _j = elements.length; j < _j; j++) {
const e = elements[j];
const xx = x(e), yy = y(e), zz = z(e);
min[0] = Math.min(xx, min[0]);
min[1] = Math.min(yy, min[1]);
min[2] = Math.min(zz, min[2]);
max[0] = Math.max(xx, max[0]);
max[1] = Math.max(yy, max[1]);
max[2] = Math.max(zz, max[2]);
cx += xx;
cy += yy;
cz += zz;
}
}
if (size > 0) {
cx /= size;
cy /= size;
cz /= size;
const d = Vec3.distance(tmpSphere.center, center) + tmpSphere.radius
if (d > radius) radius = d
}
for (let i = 0, _i = units.length; i < _i; i++) {
const { x, y, z } = units[i].conformation;
const elements = units[i].elements;
for (let j = 0, _j = elements.length; j < _j; j++) {
const e = elements[j];
const dx = x(e) - cx, dy = y(e) - cy, dz = z(e) - cz;
const d = dx * dx + dy * dy + dz * dz;
if (d > radiusSq) radiusSq = d;
}
}
return {
box: { min: Vec3.ofArray(min), max: Vec3.ofArray(max) },
sphere: { center: Vec3.create(cx, cy, cz), radius: Math.sqrt(radiusSq) }
};
return { box: { min, max }, sphere: { center, radius } }
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment