44 template<
typename O>
void MeshToVoxelsResampler<O>::fill_header(
48 std::vector<float> voxel_size(3, spacing);
49 std::vector<std::string> refs(1,
"to_mesh");
50 std::vector<std::vector<float> >trans;
59 setVoxelSize( output, spacing, spacing, spacing, 1. );
69 unsigned int connexity)
71 const std::vector<AimsVector<float, 3> > &vertices = m.vertex();
72 const std::vector<AimsVector<uint, 3> > &polygons = m.polygon();
73 float xmin, ymin, zmin, xmax, ymax, zmax;
74 unsigned int vsize = vertices.size();
75 unsigned int psize = polygons.size();
84 else if (connexity == 6)
90 xmin = ymin = zmin = FLT_MAX;
91 xmax = ymax = zmax = -FLT_MAX;
94 for (
unsigned int i = 0; i < vsize; ++i)
97 if (v[0] < xmin) xmin = v[0];
98 if (v[0] > xmax) xmax = v[0];
99 if (v[1] < ymin) ymin = v[1];
100 if (v[1] > ymax) ymax = v[1];
101 if (v[2] < zmin) zmin = v[2];
102 if (v[2] > zmax) zmax = v[2];
104 double invspacing = 1./spacing;
110 unsigned int dimx = (
unsigned int) round((xmax - xmin) * invspacing) +2;
111 unsigned int dimy = (
unsigned int) round((ymax - ymin) * invspacing) +2;
112 unsigned int dimz = (
unsigned int) round((zmax - zmin) * invspacing) +2;
114 O output = this->init_data(offset, spacing, dimx, dimy, dimz);
118 for (
unsigned int ind = 1; ind < psize + 1; ++ind)
122 t[0] = (vertices[p[0]] - offset) * invspacing;
123 t[1] = (vertices[p[1]] - offset) * invspacing;
124 t[2] = (vertices[p[2]] - offset) * invspacing;
128 for (
unsigned int j = 0; j < 3; ++j)
130 t1[0] = ceil(t[j][0] - 0.5);
131 t1[1] = ceil(t[j][1] - 0.5);
132 t1[2] = ceil(t[j][2] - 0.5);
133 for (
float dx = -1; dx <= 1; dx += 1)
134 for (
float dy = -1; dy <= 1; dy += 1)
135 for (
float dz = -1; dz <= 1; dz += 1)
140 float dix = x2 - t1[0];
141 float diy = y2 - t1[1];
142 float diz = z2 - t1[2];
143 if (dix * dix + diy * diy + diz * diz <= r2)
144 this->set(output, x2, y2, z2, ind);
152 for (
unsigned int j = 0; j < 3; ++j)
155 float dix = (t[j][0] - t2[0] - 0.5);
156 float diy = (t[j][1] - t2[1] - 0.5);
157 float diz = (t[j][2] - t2[2] - 0.5);
161 float size2 = dix * dix + diy * diy + diz * diz;
164 uint usizej = (
uint) round(sqrt(size2) * 2.);
166 std::map<Point3df, bool, Point3dfCompare> map;
167 for (
uint l = 0; l <= usizej; ++l)
169 float lambda = ((float) l) / usizej;
170 t3 = t[j] * lambda + t2 * (1 - lambda);
174 for (
float dx = -1; dx <= 1; dx += 1)
175 for (
float dy = -1; dy <= 1; dy += 1)
176 for (
float dz = -1; dz <= 1; dz += 1)
185 std::map<Point3df,bool>::const_iterator i, e;
186 for (i = map.begin(), e = map.end(); i != e; ++i)
190 float vx = diy * p[2] - diz * p[1];
191 float vy = diz * p[0] - dix * p[2];
192 float vz = dix * p[1] - diy * p[0];
193 if ((vx * vx + vy * vy + vz * vz) / size2 <= r2)
194 this->set(output, (
uint) p0[0],
201 std::map<Point3df, bool, Point3dfCompare> map;
202 for (
uint l = 0; l <= usize[0]; ++l)
204 float lambda = ((float) l) / usize[0];
205 float msize = usize[1] * lambda;
206 t3 = t[0] * (1 - lambda) + t[1] * lambda;
207 t4 = t[0] * (1 - lambda) + t[2] * lambda;
208 for (
uint m = 0; m < msize; ++m)
210 float mu = ((float) m) / msize;
211 t5 = t3 * (1 - mu) + t4 * mu;
212 t5[0] = ceil(t5[0] - 0.5);
213 t5[1] = ceil(t5[1] - 0.5);
214 t5[2] = ceil(t5[2] - 0.5);
215 for (
float dx = -1; dx <= 1; dx += 1)
216 for (
float dy = -1; dy <= 1; dy += 1)
217 for (
float dz = -1; dz <= 1; dz += 1)
227 float nx = -diff[0][1] * diff[1][2] + diff[0][2] * diff[1][1];
228 float ny = -diff[0][2] * diff[1][0] + diff[0][0] * diff[1][2];
229 float nz = -diff[0][0] * diff[1][1] + diff[0][1] * diff[1][0];
230 float norm = sqrt(nx * nx + ny * ny + nz * nz);
234 float nx2 = nx * (nx > 0 ? 1 : -1);
235 float ny2 = ny * (ny > 0 ? 1 : -1);
236 float nz2 = nz * (nz > 0 ? 1 : -1);
238 float nsum = (nx2 + ny2 + nz2);
244 else if (connexity == 6)
249 float cosalpha = nsum / sqrt(3.);
250 dlnk = tc * (cosalpha + sqrt(1 - cosalpha * cosalpha));
252 std::map<Point3df,bool>::const_iterator i, e;
253 for (i = map.begin(), e = map.end(); i != e; ++i)
257 float d = nx * p[0] + ny * p[1] + nz * p[2];
260 this->set(output, (
uint) p0[0],
O doit(const AimsSurfaceTriangle &surface, float spacing=1., unsigned int connexity=26)
surface : input mesh spacing : voxel size (according to mesh metric) connexity : 6 or 26
void setProperty(const std::string &, const T &)
AIMSDATA_API AimsTimeSurface< 3, Void > AimsSurfaceTriangle
AIMSDATA_API float norm(const Tensor &thing)