bool Octree::Node::split() { if (is_leaf && hasGeometry()) { carve::geom3d::Vector mid = 0.5 * (min + max); char *ptr = new char[sizeof(Node)*8]; children[0] = new (ptr + sizeof(Node) * 0) Node(this, min.x, min.y, min.z, mid.x, mid.y, mid.z); children[1] = new (ptr + sizeof(Node) * 1) Node(this, mid.x, min.y, min.z, max.x, mid.y, mid.z); children[2] = new (ptr + sizeof(Node) * 2) Node(this, min.x, mid.y, min.z, mid.x, max.y, mid.z); children[3] = new (ptr + sizeof(Node) * 3) Node(this, mid.x, mid.y, min.z, max.x, max.y, mid.z); children[4] = new (ptr + sizeof(Node) * 4) Node(this, min.x, min.y, mid.z, mid.x, mid.y, max.z); children[5] = new (ptr + sizeof(Node) * 5) Node(this, mid.x, min.y, mid.z, max.x, mid.y, max.z); children[6] = new (ptr + sizeof(Node) * 6) Node(this, min.x, mid.y, mid.z, mid.x, max.y, max.z); children[7] = new (ptr + sizeof(Node) * 7) Node(this, mid.x, mid.y, mid.z, max.x, max.y, max.z); for (int i = 0; i < 8; ++i) { putInside(faces, children[i], children[i]->faces); putInside(edges, children[i], children[i]->edges); putInside(vertices, children[i], children[i]->vertices); } faces.clear(); edges.clear(); vertices.clear(); is_leaf = false; } return is_leaf; }
/**************************************************************************//** * Return a random position close to the supplied one. Same Shell. ******************************************************************************/ dVec Cylinder::randUpdateSmall (MTRand &random, const dVec &pos) const { dVec randPos; randPos = pos; for (int i = 0; i < NDIM; i++) randPos[i] += constants()->displaceDelta()*(-0.5 + random.rand()); putInside(randPos); return randPos; }
/**************************************************************************//** * Return a random position close to the supplied one. Shell Jump ******************************************************************************/ dVec Cylinder::randUpdateJumpShell (MTRand &random, const dVec &pos) const { dVec randPos; randPos = pos; double theta = atan2(pos[1],pos[0]); double oldr = sqrt(pos[0]*pos[0] + pos[1]*pos[1]); double newr; if (random.rand() > 0.5) newr = oldr + (1.00 + 2.50*random.rand()); else newr = oldr - (1.00 + 2.50*random.rand()); if (newr < 0.0) newr *= -1.0; double ranTheta = M_PI*(-0.05 + 0.1*random.rand()); randPos[0] = newr*cos(theta + ranTheta); randPos[1] = newr*sin(theta + ranTheta); randPos[2] += constants()->displaceDelta()*(-0.5 + random.rand()); putInside(randPos); return randPos; }