33
33
#include < vtkXMLPolyDataWriter.h>
34
34
#include < vtkCell.h>
35
35
36
+ typedef struct _Point
37
+ {
38
+ double x;
39
+ double y;
40
+ double z;
41
+ } Point;
42
+
36
43
vtkPolyData* read_stl (char *);
37
44
vtkIdList* find_staircase_artifacts (vtkPolyData*, const double [3 ], double );
38
45
vtkIdList* get_near_vertices_to_v (vtkPolyData*, int , double );
39
46
vtkDoubleArray* calc_artifacts_weight (vtkPolyData*, vtkIdList*, double , double );
40
- void calc_d (vtkPolyData*, int , double [ 3 ] );
47
+ Point calc_d (vtkPolyData*, int );
41
48
vtkPolyData* taubin_smooth (vtkPolyData*, vtkDoubleArray*, double , double , int );
42
49
50
+
43
51
int main (int argc, char *argv[])
44
52
{
45
53
const double stack_orientation[3 ] = { 0 , 0 , 1 };
@@ -69,7 +77,7 @@ int main(int argc, char *argv[])
69
77
70
78
vtkXMLPolyDataWriter *writer = vtkXMLPolyDataWriter::New ();
71
79
writer->SetInput (tpd);
72
- writer->SetFileName (" /tmp/ saida.vtp" );
80
+ writer->SetFileName (" saida.vtp" );
73
81
writer->Write ();
74
82
return 0 ;
75
83
}
@@ -160,7 +168,7 @@ vtkIdList* get_near_vertices_to_v(vtkPolyData* pd, int v, double dmax){
160
168
161
169
for (int i=0 ; i < 3 ; i++) {
162
170
int vjid = face->GetPointId (i);
163
- if (status_v.find (vjid) == status_v.end () or !status_v[vjid]) {
171
+ if (status_v.find (vjid) == status_v.end () || !status_v[vjid]) {
164
172
pd->GetPoint (vjid, vj);
165
173
d = sqrt ((vi[0 ] - vj[0 ]) * (vi[0 ] - vj[0 ])\
166
174
+ (vi[1 ] - vj[1 ]) * (vi[1 ] - vj[1 ])\
@@ -230,7 +238,8 @@ vtkDoubleArray* calc_artifacts_weight(vtkPolyData* pd, vtkIdList* vertices_stair
230
238
return weights;
231
239
}
232
240
233
- void calc_d (vtkPolyData* pd, int vid, double D[3 ]){
241
+ Point calc_d (vtkPolyData* pd, int vid){
242
+ Point D;
234
243
int nf, fid, n=0 ;
235
244
double vi[3 ], vj[3 ];
236
245
std::set<int > vertices;
@@ -246,51 +255,54 @@ void calc_d(vtkPolyData* pd, int vid, double D[3]){
246
255
vertices.insert (vjid);
247
256
}
248
257
}
249
-
250
- D[0 ] = 0 ;
251
- D[1 ] = 0 ;
252
- D[2 ] = 0 ;
258
+ D.x = 0 ;
259
+ D.y = 0 ;
260
+ D.z = 0 ;
253
261
254
262
pd->GetPoint (vid, vi); // The position of vertex v
255
263
for (it=vertices.begin (); it!=vertices.end (); it++) {
256
264
pd->GetPoint (*it, vj);
257
- D[ 0 ] = D[ 0 ] + (vi[0 ] - vj[0 ]);
258
- D[ 1 ] = D[ 1 ] + (vi[1 ] - vj[1 ]);
259
- D[ 2 ] = D[ 2 ] + (vi[2 ] - vj[2 ]);
265
+ D. x = D. x + (vi[0 ] - vj[0 ]);
266
+ D. y = D. y + (vi[1 ] - vj[1 ]);
267
+ D. z = D. z + (vi[2 ] - vj[2 ]);
260
268
n++;
261
269
}
262
- D[0 ] = D[0 ] / n;
263
- D[1 ] = D[1 ] / n;
264
- D[2 ] = D[2 ] / n;
270
+
271
+ D.x = D.x / n;
272
+ D.y = D.y / n;
273
+ D.z = D.z / n;
274
+ return D;
265
275
}
266
276
267
277
vtkPolyData* taubin_smooth (vtkPolyData* pd, vtkDoubleArray* weights, double l, double m, int steps){
268
278
double vi[3 ];
269
- std::vector<double [3 ]> D;
270
279
vtkPolyData* new_pd = vtkPolyData::New ();
271
280
new_pd->DeepCopy (pd);
272
- D.reserve (pd->GetNumberOfPoints ());
273
-
281
+ std::vector<Point> D (pd->GetNumberOfPoints ());
282
+ // D.reserve(pd->GetNumberOfPoints());
283
+
274
284
for (int s=0 ; s < steps; s++) {
275
285
for (int i=0 ; i < pd->GetNumberOfPoints (); i++) {
276
- calc_d (new_pd, i, D[i] );
286
+ D[i] = calc_d (new_pd, i);
277
287
}
288
+
278
289
for (int i=0 ; i < pd->GetNumberOfPoints (); i++) {
279
290
new_pd->GetPoint (i, vi);
280
- vi[0 ] = vi[0 ] + weights->GetValue (i)*l*D[i][ 0 ] ;
281
- vi[1 ] = vi[1 ] + weights->GetValue (i)*l*D[i][ 1 ] ;
282
- vi[2 ] = vi[2 ] + weights->GetValue (i)*l*D[i][ 2 ] ;
291
+ vi[0 ] = vi[0 ] + weights->GetValue (i)*l*D[i]. x ;
292
+ vi[1 ] = vi[1 ] + weights->GetValue (i)*l*D[i]. y ;
293
+ vi[2 ] = vi[2 ] + weights->GetValue (i)*l*D[i]. z ;
283
294
new_pd->GetPoints ()->SetPoint (i, vi);
284
295
}
285
296
286
297
for (int i=0 ; i < pd->GetNumberOfPoints (); i++) {
287
- calc_d (new_pd, i, D[i] );
298
+ D[i] = calc_d (new_pd, i);
288
299
}
300
+
289
301
for (int i=0 ; i < pd->GetNumberOfPoints (); i++) {
290
302
new_pd->GetPoint (i, vi);
291
- vi[0 ] = vi[0 ] + weights->GetValue (i)*m*D[i][ 0 ] ;
292
- vi[1 ] = vi[1 ] + weights->GetValue (i)*m*D[i][ 1 ] ;
293
- vi[2 ] = vi[2 ] + weights->GetValue (i)*m*D[i][ 2 ] ;
303
+ vi[0 ] = vi[0 ] + weights->GetValue (i)*m*D[i]. x ;
304
+ vi[1 ] = vi[1 ] + weights->GetValue (i)*m*D[i]. y ;
305
+ vi[2 ] = vi[2 ] + weights->GetValue (i)*m*D[i]. z ;
294
306
new_pd->GetPoints ()->SetPoint (i, vi);
295
307
}
296
308
}
0 commit comments