tsmathlib
Version:
Typescript Version Math/Physics/CG Library
80 lines (70 loc) • 2.26 kB
text/typescript
/*
* @Author: Xu.Wang
* @Date: 2020-04-02 00:42:47
* @Last Modified by: Xu.Wang
* @Last Modified time: 2020-04-15 22:54:11
*/
import { PointGenerator } from './point_generator'
import { Point3 } from '../math/point3'
import { BoundingBox } from '../physics/bounding_box'
/**
* Body-centered cubic point generator
* @ref http://en.wikipedia.org/wiki/Cubic_crystal_system
* http://mathworld.wolfram.com/CubicClosePacking.html
*/
export class BccPointGenerator extends PointGenerator {
forEachPoint(
bbox: BoundingBox,
spacing: number,
callback: (p: Point3) => boolean
) {
let halfSpacing = spacing / 2.0
let boxWidth = bbox.width()
let boxHeight = bbox.height()
let boxDepth = bbox.depth()
let pPos = new Point3(0.0, 0.0, 0.0)
let hasOffset = false
let shouldQuit = false
for (let k = 0; k * halfSpacing <= boxDepth && !shouldQuit; ++k) {
pPos.z = k * halfSpacing + bbox.lower().z()
let offset = hasOffset ? halfSpacing : 0.0
for (let j = 0; j * spacing + offset <= boxHeight && !shouldQuit; ++j) {
pPos.y = j * spacing + offset + bbox.lower().y()
for (let i = 0; i * spacing + offset <= boxWidth; ++i) {
pPos.x = i * spacing + offset + bbox.lower().x()
let p = new Point3(pPos.x, pPos.y, pPos.z)
if (!callback(p)) {
shouldQuit = true
break
}
}
}
hasOffset = !hasOffset
}
}
forEachPointWithNoOffset(
bbox: BoundingBox,
spacing: number,
callback: (p: Point3) => boolean
) {
let boxWidth = bbox.width()
let boxHeight = bbox.height()
let boxDepth = bbox.depth()
let pPos = new Point3(0.0, 0.0, 0.0)
let shouldQuit = false
for (let k = 0; k * spacing <= boxDepth && !shouldQuit; ++k) {
pPos.z = k * spacing + bbox.lower().z()
for (let j = 0; j * spacing <= boxHeight && !shouldQuit; ++j) {
pPos.y = j * spacing + bbox.lower().y()
for (let i = 0; i * spacing <= boxWidth; ++i) {
pPos.x = i * spacing + bbox.lower().x()
let p = new Point3(pPos.x, pPos.y, pPos.z)
if (!callback(p)) {
shouldQuit = true
break
}
}
}
}
}
}