| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- #include "tetrahedralized_grid.h"
- #include "grid.h"
- template <
- typename DerivedGV,
- typename DerivedGT>
- IGL_INLINE void igl::tetrahedralized_grid(
- const int nx,
- const int ny,
- const int nz,
- const TetrahedralizedGripType type,
- Eigen::PlainObjectBase<DerivedGV> & GV,
- Eigen::PlainObjectBase<DerivedGT> & GT)
- {
- Eigen::RowVector3i res(nx,ny,nz);
- igl::grid(res,GV);
- return igl::tetrahedralized_grid(res,type,GT);
- }
- template <
- typename Derivedside,
- typename DerivedGT>
- IGL_INLINE void igl::tetrahedralized_grid(
- const Eigen::MatrixBase<Derivedside> & side,
- const TetrahedralizedGripType type,
- Eigen::PlainObjectBase<DerivedGT> & GT)
- {
- const int nx = side(0);
- const int ny = side(1);
- const int nz = side(2);
- const int m = (nx-1)*(ny-1)*(nz-1);
- // Rotationally symmetric
- int nt = -1;
- switch(type)
- {
- default: assert(false); break;
- case TETRAHEDRALIZED_GRID_TYPE_5: nt = 5; break;
- case TETRAHEDRALIZED_GRID_TYPE_6_ROTATIONAL: nt = 6; break;
- }
- GT.resize(m*nt,4);
- {
- int u = 0;
- for(int i = 0;i<nx-1;i++)
- {
- for(int j = 0;j<ny-1;j++)
- {
- for(int k = 0;k<nz-1;k++)
- {
- int v1 = (i+0)+nx*((j+0)+ny*(k+0));
- int v2 = (i+0)+nx*((j+1)+ny*(k+0));
- int v3 = (i+1)+nx*((j+0)+ny*(k+0));
- int v4 = (i+1)+nx*((j+1)+ny*(k+0));
- int v5 = (i+0)+nx*((j+0)+ny*(k+1));
- int v6 = (i+0)+nx*((j+1)+ny*(k+1));
- int v7 = (i+1)+nx*((j+0)+ny*(k+1));
- int v8 = (i+1)+nx*((j+1)+ny*(k+1));
- switch(type)
- {
- default: assert(false); break;
- case TETRAHEDRALIZED_GRID_TYPE_6_ROTATIONAL:
- // Rotationally symmetric
- GT.row(u*nt+0) << v1,v3,v8,v7;
- GT.row(u*nt+1) << v1,v8,v5,v7;
- GT.row(u*nt+2) << v1,v3,v4,v8;
- GT.row(u*nt+3) << v1,v4,v2,v8;
- GT.row(u*nt+4) << v1,v6,v5,v8;
- GT.row(u*nt+5) << v1,v2,v6,v8;
- break;
- case TETRAHEDRALIZED_GRID_TYPE_5:
- {
- // Five
- bool flip = true;
- if(((bool(i%2))^ (bool(j%2)))^ (bool(k%2)))
- {
- std::swap(v1,v3);
- std::swap(v2,v4);
- std::swap(v5,v7);
- std::swap(v6,v8);
- flip = false;
- }
- GT.row(u*nt+0) << v5,v3,v2,v1;
- GT.row(u*nt+1) << v3,v2,v8,v5;
- GT.row(u*nt+2) << v3,v4,v8,v2;
- GT.row(u*nt+3) << v3,v8,v7,v5;
- GT.row(u*nt+4) << v2,v6,v8,v5;
- if(flip)
- {
- std::swap(GT(u*nt+0,0),GT(u*nt+0,1));
- std::swap(GT(u*nt+1,0),GT(u*nt+1,1));
- std::swap(GT(u*nt+2,0),GT(u*nt+2,1));
- std::swap(GT(u*nt+3,0),GT(u*nt+3,1));
- std::swap(GT(u*nt+4,0),GT(u*nt+4,1));
- }
- break;
- }
- }
- u++;
- }
- }
- }
- assert(u == m);
- }
- }
- #ifdef IGL_STATIC_LIBRARY
- // Explicit template instantiation
- // generated by autoexplicit.sh
- template void igl::tetrahedralized_grid<Eigen::Matrix<int, 1, 3, 1, 1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<int, 1, 3, 1, 1, 3> > const&, igl::TetrahedralizedGripType, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
- // generated by autoexplicit.sh
- #endif
|