19 #include <numeric/xyzMatrix.fwd.hh>
21 #include <numeric/xyzVector.hh>
23 #include <utility/exit.hh>
26 #include <utility/vector1.hh>
27 #include <ObjexxFCL/FArray4D.hh>
30 using namespace ObjexxFCL;
31 using namespace numeric;
37 triangleIterator::triangleIterator(FArray3D_float
const & density,
float const & threshold) {
38 densityPtr = &density;
41 gradPtr =
new FArray4D_float(3,
size[0],
size[1],
size[2]);
43 this->threshold = threshold;
52 triangleIterator::~triangleIterator() {
53 delete gradPtr; gradPtr = NULL;
56 bool triangleIterator::hasNext()
const {
57 return !vertQueue.empty();
63 void triangleIterator::next(xyzVector_float vertices[3], xyzVector_float normals[3]) {
66 for (
int v = 0 ; v < 3 ; v++) {
67 vertices[v] = vertQueue.back();
68 normals[v] = nrmlQueue.back();
74 if (vertQueue.empty())
79 void triangleIterator::aquireNextQueue() {
80 const FArray3D_float & density(*(this->densityPtr));
83 assert(vertQueue.size() == 0);
91 for (
int x = starting ? nextX : 0 ; x <
size[0] -1 ; x++) {
92 for (
int y = starting ? nextY : 0 ; y < size[1] - 1; y++) {
93 for (
int z = starting ? nextZ : 0 ; z < size[2] - 1; z++) {
96 for (
int i = 1 ; i <= 8 ; i++) {
98 int vy = y + VERTEX_OFF[i][1];
99 int vz = z + VERTEX_OFF[i][2];
100 if (density(vx + 1, vy + 1, vz + 1) > threshold) {
101 bitfield |= (1 << (i - 1));
106 for (
int j = 0 ;
POLY_CASES[bitfield][j] != 0 ; j++) {
107 for (
int k = 0 ; k < 3 ; k++) {
114 int y0 = y + VERTEX_OFF[v0][1] + 1;
115 int z0 = z + VERTEX_OFF[v0][2] + 1;
118 int x1 = x + VERTEX_OFF[v1][0] + 1;
119 int y1 = y + VERTEX_OFF[v1][1] + 1;
120 int z1 = z + VERTEX_OFF[v1][2] + 1;
123 float phi0 = density(x0, y0, z0) - threshold;
124 float phi1 = density(x1, y1, z1) - threshold;
127 xyzVector_float p0(x0, y0, z0);
128 xyzVector_float p1(x1, y1, z1);
129 float dist = phi0 / (phi0 - phi1);
132 xyzVector_float vert = p0 * (1.0f - dist) + p1 * dist;
133 xyzVector_float nrml;
134 evalGradient(vert, nrml);
137 vertQueue.push_back(vert);
138 nrmlQueue.push_back(-nrml);
143 if (!vertQueue.empty()) {
157 void triangleIterator::computeGradient() {
176 void triangleIterator::evalGradient(
const xyzVector_float & pt, xyzVector_float & gradResult) {
181 gradResult = xyzVector_float( gx[0] , gx[1], gx[2] );