#include "subdivide.h" //Arguments: //num_times - number of times to run the subdivision scheme //mask_size - the size of the desired mask; provide N when an NxNxN mask is desired // must be one of the following: 5, 7, 9, 11, 13, 15 //*coarse - provide a pointer to the beginning of the coarse vector field //*fine - provide a pointer to the beginning of the (initally empty) fine vector field int subdivide(int num_times, int mask_size, float *coarse, float *fine) { //Creates the mask based on the argument mask_size Mask3D m11; Mask3D m12; switch (mask_size) { case 5: m11.recreate("../masks/d5x5x5x.msk"); m12.recreate("../masks/od5x5x5.msk"); break; case 7: m11.recreate("../masks/d7x7x7.msk"); m12.recreate("../masks/od7x7x7.msk"); break; case 9: m11.recreate("../masks/d9x9x9.msk"); m12.recreate("../masks/od9x9x9.msk"); break; case 11: m11.recreate("../masks/d11x11x11.msk"); m12.recreate("../masks/od11x11x11.msk"); break; case 13: m11.recreate("../masks/d13x13x13.msk"); m12.recreate("../masks/od13x13x13.msk"); break; case 15: m11.recreate("../masks/d15x15x15.msk"); m12.recreate("../masks/od15x15x15.msk"); break; default: printf("Error: mask size provided was %i. Mask size must be: 5, 7, 9, 11, 13 or 15\n", mask_size); return -1; } int vSizeX = 0; int vSizeY = 0; int vSizeZ = 0; //Some explanation of *field: field is an array of VectorField3D's which holds each successive //iteration of the subdivision. Thus, field[0] holds the original coarse vector field provided //as input, field[1] holds the VectorField as it is after the first round of subdivision, and so //on up to field[num_times], which holds the field that was refined num_times, as specified by //the argument to subdivide() VectorField3D *field = new VectorField3D[num_times+1]; //Initializes the subdivision scheme FlowSubdiv3D scheme; scheme.setDiagonalMask(&m11); scheme.setOffDiagonalMask(&m12); vSizeX = (int) *coarse; coarse++; vSizeY = (int) *coarse; coarse++; vSizeZ = (int) *coarse; coarse++; assert( vSizeX == 2*(vSizeX/2)+1 && vSizeY == 2*(vSizeY/2)+1 && vSizeZ == 2*(vSizeZ/2)+1); //Puts the coarse vector field in to field[0] field[0].reset(vSizeX, vSizeY, vSizeZ); for (int i = -field[0].nx(); i <= field[0].nx(); i++) for (int j = -field[0].ny(); j <= field[0].ny(); j++) for (int k = -field[0].nz(); k <= field[0].nz(); k++) { field[0].valXRef(i,j,k) = *coarse; coarse++; field[0].valYRef(i,j,k) = *coarse; coarse++; field[0].valZRef(i,j,k) = *coarse; coarse++; } //Runs the subdivision scheme num_times times for (int i = 0; i < num_times; i++) { vSizeX = (2 * vSizeX) - 1; vSizeY = (2 * vSizeY) - 1; vSizeZ = (2 * vSizeZ) - 1; VectorField3D big; scheme.subdivide(field[i], big); big.trimField( (int) (vSizeX/2), (int) (vSizeY/2), (int) (vSizeZ/2), field[i+1]); } //Puts the final product into fine, provided as argument *(fine) = (float) vSizeX; *(fine+1) = (float) vSizeY; *(fine+2) = (float) vSizeZ; for (int i = 0; i < vSizeX * vSizeY * vSizeZ * 3; i++) *(fine + 3 + i) = field[num_times].giveField(i); delete [] field; return 0; }