WireFrame.cpp
Go to the documentation of this file.
2 #include <ros/console.h>
3 
5  :delta_tol_(1e-1), unify_size_(2.0), layer_size_(0), unit_scale_(1.0)
6 {
7  pvert_list_ = new vector<WF_vert*>;
8  pedge_list_ = new vector<WF_edge*>;
9 }
10 
11 
13 {
14  int N = pvert_list_->size();
15  for (int i = 0; i < N; i++)
16  {
17  delete (*pvert_list_)[i];
18  (*pvert_list_)[i] = NULL;
19  }
20  delete pvert_list_;
21  pvert_list_ = NULL;
22 
23  int M = pedge_list_->size();
24  for (int i = 0; i < M; i++)
25  {
26  delete (*pedge_list_)[i];
27  (*pedge_list_)[i] = NULL;
28  }
29  delete pedge_list_;
30  pedge_list_ = NULL;
31 }
32 
33 
34 void WireFrame::LoadFromOBJ(const char *path)
35 {
36  /* need to deal with replication */
37 
38  FILE *fp = fopen(path, "r");
39 
40  try
41  {
42  // read vertexes
43  fseek(fp, 0, SEEK_SET);
44  char pLine[512];
45  char *tok;
46  vector<WF_vert*> tmp_points;
47  while (fgets(pLine, 512, fp))
48  {
49  if (pLine[0] == 'v' && pLine[1] == ' ')
50  {
51  Vec3f p;
52  char tmp[128];
53  tok = strtok(pLine, " ");
54  for (int i = 0; i < 3; i++)
55  {
56  tok = strtok(NULL, " ");
57  strcpy(tmp, tok);
58  tmp[strcspn(tmp, " ")] = 0;
59  p[i] = (float)atof(tmp);
60  }
61 
62  p = point(p.x(), p.y(), p.z());
63  WF_vert *u = InsertVertex(p);
64  tmp_points.push_back(u);
65  }
66  }
67 
68  // read lines
69  char c;
70  int prev;
71  int curv;
72  fseek(fp, 0, SEEK_SET);
73  while (c = fgetc(fp), c != EOF)
74  {
75  while (c != 'l' && c != EOF)
76  {
77  c = fgetc(fp);
78  }
79 
80  if (c == '\n' || c == EOF || (c = fgetc(fp)) != ' ')
81  {
82  continue;
83  }
84 
85  prev = -1;
86  while (c != '\n' && c != EOF)
87  {
88  while (c = fgetc(fp), c != '\n' && c != EOF && !isdigit(c))
89  ;
90 
91  if (c == '\n' || c == EOF)
92  {
93  break;
94  }
95 
96  for (curv = 0; isdigit(c); c = fgetc(fp))
97  {
98  curv = curv * 10 + c - '0';
99  }
100  curv--;
101 
102  if (prev != -1)
103  {
104  InsertEdge(tmp_points[prev], tmp_points[curv]);
105  }
106 
107  prev = curv;
108  }
109  }
110 
111  // read faces
112  fseek(fp, 0, SEEK_SET);
113  while (fgets(pLine, 512, fp))
114  {
115  if (pLine[0] == 'f' && pLine[1] == ' ')
116  {
117  vector<WF_vert*> bound_points;
118  tok = strtok(pLine, " ");
119  char tmp[128];
120  while (tok = strtok(NULL, " "))
121  {
122  strcpy(tmp, tok);
123  tmp[strcspn(tmp, " ")] = 0;
124  int u = (int)atof(tmp) - 1;
125  bound_points.push_back(tmp_points[u]);
126  }
127 
128  int Bn = bound_points.size();
129  for (int i = 0; i < Bn - 1; i++)
130  {
131  InsertEdge(bound_points[i], bound_points[i + 1]);
132  }
133  InsertEdge(bound_points[Bn - 1], bound_points[0]);
134  }
135  }
136 
137  Unify();
138  }
139  catch (...)
140  {
141  return;
142  }
143 
144  fclose(fp);
145 }
146 
147 
148 void WireFrame::LoadFromPWF(const char *path)
149 {
150  /* assert that there is no replication in PWF */
151 
152  FILE *fp = fopen(path, "r");
153 
154  assert(fp);
155 
156  try
157  {
158  // read vertexes
159  fseek(fp, 0, SEEK_SET);
160  char pLine[512];
161  char *tok;
162  while (fgets(pLine, 512, fp))
163  {
164  if (pLine[0] == 'v' && pLine[1] == ' ')
165  {
166  Vec3f p;
167  char tmp[128];
168  tok = strtok(pLine, " ");
169  for (int i = 0; i < 3; i++)
170  {
171  tok = strtok(NULL, " ");
172  strcpy(tmp, tok);
173  tmp[strcspn(tmp, " ")] = 0;
174  p[i] = (float)atof(tmp);
175  }
176 
177  p = point(p.x(), p.y(), p.z());
178  InsertVertex(p);
179  }
180  }
181 
182  // read layer
183  fseek(fp, 0, SEEK_SET);
184  while (fgets(pLine, 512, fp))
185  {
186  if (pLine[0] == 'g' && pLine[1] == ' ')
187  {
188  tok = strtok(pLine, " ");
189 
190  char tmp[128];
191  tok = strtok(NULL, " ");
192  strcpy(tmp, tok);
193  tmp[strcspn(tmp, " ")] = 0;
194  int u = (int)atof(tmp) - 1;
195 
196  tok = strtok(NULL, " ");
197  strcpy(tmp, tok);
198  tmp[strcspn(tmp, " ")] = 0;
199  int v = (int)atof(tmp) - 1;
200 
201  tok = strtok(NULL, " ");
202  strcpy(tmp, tok);
203  tmp[strcspn(tmp, " ")] = 0;
204  int layer = (int)atof(tmp);
205 
206  if(!(0 <= u && u < pvert_list_->size()))
207  {
208  ROS_ERROR_STREAM("read layer: start node id overflow: " << u << "/" << pvert_list_->size());
209  assert(0 <= u && u < pvert_list_->size());
210  }
211  if(!(0 <= v && v < pvert_list_->size()))
212  {
213  ROS_ERROR_STREAM("read layer: end node id overflow: " << v << "/" << pvert_list_->size());
214  assert(0 <= v && v < pvert_list_->size());
215  }
216 
217  WF_edge *e = InsertEdge((*pvert_list_)[u], (*pvert_list_)[v]);
218  if (e != NULL)
219  {
220  if(e->Layer() != -1)
221  {
222  ROS_WARN_STREAM("Overwrite previously set id! - prev layer id : " << e->Layer()
223  << ", current id: " << layer);
224  assert(e->Layer() == -1);
225  }
226 
227  e->SetLayer(layer);
228  e->ppair_->SetLayer(layer);
229  }
230  }
231  }
232 
233  // read lines
234  char c;
235  int prev;
236  int curv;
237  fseek(fp, 0, SEEK_SET);
238  while (c = fgetc(fp), c != EOF)
239  {
240  while (c != 'l' && c != EOF)
241  {
242  c = fgetc(fp);
243  }
244 
245  if (c == '\n' || c == EOF || (c = fgetc(fp)) != ' ')
246  {
247  continue;
248  }
249 
250  prev = -1;
251  while (c != '\n' && c != EOF)
252  {
253  while (c = fgetc(fp), c != '\n' && c != EOF && !isdigit(c))
254  ;
255 
256  if (c == '\n' || c == EOF)
257  {
258  break;
259  }
260 
261  for (curv = 0; isdigit(c); c = fgetc(fp))
262  {
263  curv = curv * 10 + c - '0';
264  }
265  curv--;
266 
267  if (prev != -1)
268  {
269  if(!(0 <= prev && prev < pvert_list_->size()))
270  {
271  ROS_ERROR_STREAM("read lines: start node id overflow: " << prev << "/" << pvert_list_->size());
272  assert(0 <= prev && prev < pvert_list_->size());
273  }
274  if(!(0 <= curv && curv < pvert_list_->size()))
275  {
276  ROS_ERROR_STREAM("read lines: end node id overflow: " << curv << "/" << pvert_list_->size());
277  assert(0 <= curv && curv < pvert_list_->size());
278  }
279 
280  InsertEdge((*pvert_list_)[prev], (*pvert_list_)[curv]);
281  }
282 
283  prev = curv;
284  }
285  }
286 
287  // read pillar
288  fseek(fp, 0, SEEK_SET);
289  while (fgets(pLine, 512, fp))
290  {
291  if (pLine[0] == 'p' && pLine[1] == ' ')
292  {
293  tok = strtok(pLine, " ");
294 
295  char tmp[128];
296  tok = strtok(NULL, " ");
297  strcpy(tmp, tok);
298  tmp[strcspn(tmp, " ")] = 0;
299  int u = (int)atof(tmp) - 1;
300 
301  tok = strtok(NULL, " ");
302  strcpy(tmp, tok);
303  tmp[strcspn(tmp, " ")] = 0;
304  int v = (int)atof(tmp) - 1;
305 
306  WF_vert *b = (*pvert_list_)[u];
307  b->SetBase(true);
308 
309  WF_vert *f = (*pvert_list_)[v];
310  f->SetFixed(true);
311 
312  WF_edge *e = InsertEdge(b, f);
313  if (e != NULL)
314  {
315  e->SetPillar(true);
316  e->ppair_->SetPillar(true);
317  }
318  }
319  }
320 
321  // read ceiling
322  fseek(fp, 0, SEEK_SET);
323  while (fgets(pLine, 512, fp))
324  {
325  if (pLine[0] == 'c' && pLine[1] == ' ')
326  {
327  tok = strtok(pLine, " ");
328 
329  char tmp[128];
330  tok = strtok(NULL, " ");
331  strcpy(tmp, tok);
332  tmp[strcspn(tmp, " ")] = 0;
333  int u = (int)atof(tmp) - 1;
334 
335  tok = strtok(NULL, " ");
336  strcpy(tmp, tok);
337  tmp[strcspn(tmp, " ")] = 0;
338  int v = (int)atof(tmp) - 1;
339 
340  WF_edge *e = InsertEdge((*pvert_list_)[u], (*pvert_list_)[v]);
341  if (e != NULL)
342  {
343  e->SetCeiling(true);
344  e->ppair_->SetCeiling(true);
345  }
346  }
347  }
348 
349  Unify();
350  }
351  catch (...)
352  {
353  return;
354  }
355 
356  fclose(fp);
357 }
358 
359 
360 void WireFrame::WriteToOBJ(const char *path)
361 {
362  FILE *fp = fopen(path, "wb+");
363  int N = SizeOfVertList();
364  int M = SizeOfEdgeList();
365 
366  vector<int> export_vert;
367  vector<int> hash(N);
368  fill(hash.begin(), hash.end(), -1);
369 
370  for (int i = 0; i < N; i++)
371  {
372  if (!isFixed(i))
373  {
374  export_vert.push_back(i);
375  hash[i] = export_vert.size();
376  }
377  }
378 
379  int Ne = export_vert.size();
380  for (int i = 0; i < Ne; i++)
381  {
382  point p = (*pvert_list_)[export_vert[i]]->Position();
383  fprintf(fp, "v %lf %lf %lf\n", p.x(), p.y(), p.z());
384  }
385 
386  for (int i = 0; i < M; i++)
387  {
388  WF_edge *e1 = (*pedge_list_)[i];
389  WF_edge *e2 = e1->ppair_;
390  if (i < e2->ID() && !e1->isPillar())
391  {
392  int u = e2->pvert_->ID();
393  int v = e1->pvert_->ID();
394  fprintf(fp, "l %d %d\n", hash[u], hash[v]);
395  }
396  }
397 
398  fclose(fp);
399 }
400 
401 
403  bool bVert, bool bLine,
404  bool bPillar, bool bCeiling,
405  bool bCut, int min_layer, int max_layer,
406  const char *path)
407 {
408  if ((*pedge_list_)[0]->Layer() == -1 || !bCut)
409  {
410  min_layer = -(1 << 20);
411  max_layer = (1 << 20);
412  }
413 
414 
415  FILE *fp = fopen(path, "wb+");
416  int N = SizeOfVertList();
417  int M = SizeOfEdgeList();
418 
419  vector<int> export_vert;
420  vector<int> hash(N);
421  fill(hash.begin(), hash.end(), -1);
422 
423  for (int i = 0; i < M; i++)
424  {
425  WF_edge *e1 = (*pedge_list_)[i];
426  WF_edge *e2 = e1->ppair_;
427  if (i < e2->ID() && e1->Layer() >= min_layer - 1 && e1->Layer() < max_layer)
428  {
429  if (e1->isPillar() && !bPillar)
430  {
431  continue;
432  }
433 
434  int u = e2->pvert_->ID();
435  int v = e1->pvert_->ID();
436  if (hash[u] == -1)
437  {
438  export_vert.push_back(u);
439  hash[u] = export_vert.size();
440  }
441  if (hash[v] == -1)
442  {
443  export_vert.push_back(v);
444  hash[v] = export_vert.size();
445  }
446  }
447  }
448 
449  int Ne = export_vert.size();
450  if (bVert)
451  {
452  for (int i = 0; i < Ne; i++)
453  {
454  point p = (*pvert_list_)[export_vert[i]]->Position();
455  fprintf(fp, "v %lf %lf %lf\n", p.x(), p.y(), p.z());
456  }
457  }
458 
459  if (bLine)
460  {
461  for (int i = 0; i < M; i++)
462  {
463  WF_edge *e1 = (*pedge_list_)[i];
464  WF_edge *e2 = e1->ppair_;
465  if (i < e2->ID() && !e1->isPillar() &&
466  e1->Layer() >= min_layer - 1 && e1->Layer() < max_layer)
467  {
468  int u = e2->pvert_->ID();
469  int v = e1->pvert_->ID();
470  fprintf(fp, "l %d %d\n", hash[u], hash[v]);
471  }
472  }
473  }
474 
475  if (bPillar)
476  {
477  for (int i = 0; i < M; i++)
478  {
479  WF_edge *e1 = (*pedge_list_)[i];
480  WF_edge *e2 = e1->ppair_;
481  if (i < e2->ID() && e1->isPillar()
482  && e1->Layer() >= min_layer - 1 && e1->Layer() < max_layer)
483  {
484  int u = e2->pvert_->ID();
485  int v = e1->pvert_->ID();
486  assert(e2->pvert_->isBase());
487  fprintf(fp, "p %d %d\n", hash[u], hash[v]);
488  }
489  }
490  }
491 
492  if (bCeiling)
493  {
494  for (int i = 0; i < M; i++)
495  {
496  WF_edge *e1 = (*pedge_list_)[i];
497  WF_edge *e2 = e1->ppair_;
498  if (i < e2->ID() && e1->isCeiling()
499  && e1->Layer() >= min_layer - 1 && e1->Layer() < max_layer)
500  {
501  int u = e2->pvert_->ID();
502  int v = e1->pvert_->ID();
503  fprintf(fp, "c %d %d\n", hash[u], hash[v]);
504  }
505  }
506  }
507 
508  if (bCut)
509  {
510  for (int i = 0; i < M; i++)
511  {
512  WF_edge *e1 = (*pedge_list_)[i];
513  WF_edge *e2 = e1->ppair_;
514  if (i < e2->ID() && e1->Layer() != -1
515  && e1->Layer() >= min_layer - 1 && e1->Layer() < max_layer)
516  {
517  int u = e2->pvert_->ID();
518  int v = e1->pvert_->ID();
519  fprintf(fp, "g %d %d %d\n", hash[u], hash[v], e1->Layer());
520  }
521  }
522  }
523 
524  fclose(fp);
525 }
526 
527 
529 {
530  FILE *fp = fopen(path, "r");
531 
532  try
533  {
534  // read vertexes
535  fseek(fp, 0, SEEK_SET);
536  char pLine[512];
537  char *tok;
538  while (fgets(pLine, 512, fp))
539  {
540  string flag = "";
541  for (int i = 2; i < 9; i++)
542  {
543  flag = flag + pLine[i];
544  }
545  if (pLine[0] == '#' && flag == "element")
546  {
547  WF_vert *prev = NULL;
548  while (fgets(pLine, 512, fp) && pLine[0] == ' ')
549  {
550  Vec3f p;
551  char tmp[128];
552 
553  tok = strtok(pLine, " ");
554  strcpy(tmp, tok);
555  tmp[strcspn(tmp, " ")] = 0;
556  p[0] = (float)atof(tmp);
557 
558  for (int i = 1; i < 3; i++)
559  {
560  tok = strtok(NULL, " ");
561  strcpy(tmp, tok);
562  tmp[strcspn(tmp, " ")] = 0;
563  p[i] = (float)atof(tmp);
564  }
565 
566  p = point(p.x(), p.y(), p.z());
567  WF_vert *u = InsertVertex(p);
568  if (prev != NULL)
569  {
570  InsertEdge(prev, u);
571  }
572  prev = u;
573  }
574  }
575  }
576 
577  Unify();
578  }
579  catch (...)
580  {
581  return;
582  }
583 
584  fclose(fp);
585 }
586 
587 
589 {
590  FILE *fp = fopen(path, "wb+");
591  int N = SizeOfVertList();
592  int M = SizeOfEdgeList();
593 
594  vector<int> export_vert;
595  vector<int> hash(N);
596  fill(hash.begin(), hash.end(), -1);
597 
598  for (int i = 0; i < M; i++)
599  {
600  WF_edge *e1 = (*pedge_list_)[i];
601  WF_edge *e2 = e1->ppair_;
602  if (i < e2->ID() && e1->isSubgraph())
603  {
604  int u = e2->pvert_->ID();
605  int v = e1->pvert_->ID();
606  if (hash[u] == -1)
607  {
608  export_vert.push_back(u);
609  hash[u] = export_vert.size();
610  }
611  if (hash[v] == -1)
612  {
613  export_vert.push_back(v);
614  hash[v] = export_vert.size();
615  }
616  }
617  }
618 
619  int Ne = export_vert.size();
620  for (int i = 0; i < Ne; i++)
621  {
622  point p = (*pvert_list_)[export_vert[i]]->Position();
623  fprintf(fp, "v %lf %lf %lf\n", p.x(), p.y(), p.z());
624  }
625 
626  for (int i = 0; i < M; i++)
627  {
628  WF_edge *e1 = (*pedge_list_)[i];
629  WF_edge *e2 = e1->ppair_;
630  if (i < e2->ID() && e1->isSubgraph())
631  {
632  int u = e2->pvert_->ID();
633  int v = e1->pvert_->ID();
634  fprintf(fp, "l %d %d\n", hash[u], hash[v]);
635  }
636  }
637 
638  fclose(fp);
639 }
640 
641 
642 void WireFrame::ExportPoints(int min_layer, int max_layer, const char *path)
643 {
644  if ((*pedge_list_)[0]->Layer() == -1)
645  {
646  min_layer = -(1 << 20);
647  max_layer = (1 << 20);
648  }
649 
650  int N = SizeOfVertList();
651  int M = SizeOfEdgeList();
652 
653  vector<bool> is_export_vert(N);
654  fill(is_export_vert.begin(), is_export_vert.end(), false);
655 
656  FILE *fp = fopen(path, "wb+");
657  for (int i = 0; i < M; i++)
658  {
659  WF_edge *e1 = (*pedge_list_)[i];
660  WF_edge *e2 = e1->ppair_;
661  if (i < e2->ID() && e1->Layer() >= min_layer - 1 && e1->Layer() < max_layer)
662  {
663  is_export_vert[e2->pvert_->ID()] = true;
664  is_export_vert[e1->pvert_->ID()] = true;
665  }
666  }
667 
668  for (int i = 0; i < N; i++)
669  {
670  if (is_export_vert[i])
671  {
672  //point u = (*pvert_list_)[i]->Position();
673  //fprintf(fp, "%lf %lf %lf\n", u.x() / 125.0, u.y() / 125.0, u.z() / 125.0);
674 
675  point u = (*pvert_list_)[i]->RenderPos();
676  fprintf(fp, "%lf %lf %lf\r\n", u.x(), u.y(), u.z());
677  }
678  }
679 
680  fclose(fp);
681 }
682 
683 
684 void WireFrame::ExportLines(int min_layer, int max_layer, const char *path)
685 {
686  if ((*pedge_list_)[0]->Layer() == -1)
687  {
688  min_layer = -(1 << 20);
689  max_layer = (1 << 20);
690  }
691 
692  int N = SizeOfVertList();
693  int M = SizeOfEdgeList();
694 
695  FILE *fp = fopen(path, "wb+");
696  for (int i = 0; i < M; i++)
697  {
698  WF_edge *e1 = (*pedge_list_)[i];
699  WF_edge *e2 = e1->ppair_;
700  if (i < e2->ID() && e1->Layer() >= min_layer - 1 && e1->Layer() < max_layer)
701  {
702  //point u = e2->pvert_->Position();
703  //point v = e1->pvert_->Position();
704  //fprintf(fp, "%lf %lf %lf %lf %lf %lf\n",
705  // u.x() / 125.0, u.y() / 125.0, u.z() / 125.0,
706  // v.x() / 125.0, v.y() / 125.0, v.z() / 125.0);
707 
708  point u = e2->pvert_->RenderPos();
709  point v = e1->pvert_->RenderPos();
710  fprintf(fp, "%lf %lf %lf %lf %lf %lf\r\n",
711  u.x(), u.y(), u.z(), v.x(), v.y(), v.z());
712  }
713  }
714 
715  fclose(fp);
716 }
717 
718 
720 {
721  // detect duplication
722  int N = SizeOfVertList();
723  for (int i = 0; i < N; i++)
724  {
725  if (Dist(p, (*pvert_list_)[i]->Position()) < 1e-3)
726  {
727  ROS_WARN_STREAM("duplicate point read! (" << p.x() << ", " << p.y() << ", " << p.z() << ")");
728  return ( *pvert_list_)[i];
729  }
730  }
731 
732  WF_vert *vert = new WF_vert(p);
733  pvert_list_->push_back(vert);
734  vert->SetID(N);
735  return vert;
736 }
737 
738 
740 {
741  // detect duplication
742  WF_edge *e = u->pedge_;
743  while (e != NULL)
744  {
745  if (e->pvert_ == v)
746  {
747  return e;
748  }
749  e = e->pnext_;
750  }
751 
752  WF_edge *e1 = InsertOneWayEdge(u, v);
753  WF_edge *e2 = InsertOneWayEdge(v, u);
754  if (e1 != NULL)
755  {
756  e1->ppair_ = e2;
757  e2->ppair_ = e1;
758  }
759  return e1;
760 }
761 
762 
764 {
765  if (u == v)
766  {
767  return NULL;
768  }
769 
770  WF_edge *edge = new WF_edge();
771  edge->pvert_ = v;
772  edge->pnext_ = u->pedge_;
773  u->pedge_ = edge;
774  u->IncreaseDegree();
775 
776  pedge_list_->push_back(edge);
777  return edge;
778 }
779 
780 
782 {
783  maxx_ = -1e20;
784  maxy_ = -1e20;
785  maxz_ = -1e20;
786  minx_ = 1e20;
787  miny_ = 1e20;
788  minz_ = 1e20;
789  basez_ = 1e20;
790 
791  fixed_vert_ = 0;
792  base_vert_ = 0;
793  pillar_size_ = 0;
794  ceiling_size_ = 0;
795  layer_size_ = 0;
796 
797  int N = SizeOfVertList();
798  for (int i = 0; i < N; i++)
799  {
800  (*pvert_list_)[i]->SetID(i);
801  point p = (*pvert_list_)[i]->Position();
802 
803  if (!(*pvert_list_)[i]->isFixed())
804  {
805  if (p.x() > maxx_)
806  {
807  maxx_ = p.x();
808  }
809  if (p.y() > maxy_)
810  {
811  maxy_ = p.y();
812  }
813  if (p.z() > maxz_)
814  {
815  maxz_ = p.z();
816  }
817  if (p.x() < minx_)
818  {
819  minx_ = p.x();
820  }
821  if (p.y() < miny_)
822  {
823  miny_ = p.y();
824  }
825  if (p.z() < minz_)
826  {
827  minz_ = p.z();
828  }
829  }
830 
831  //set base_z for once
832  if (p.z() < basez_)
833  {
834  basez_ = p.z();
835  }
836  }
837 
838  int M = SizeOfEdgeList();
839  for (int i = 0; i < M; i++)
840  {
841  (*pedge_list_)[i]->SetID(i);
842  if ((*pedge_list_)[i]->isPillar())
843  {
844  pillar_size_++;
845  }
846  if ((*pedge_list_)[i]->isCeiling())
847  {
848  ceiling_size_++;
849  }
850  if ((*pedge_list_)[i]->Layer() > layer_size_)
851  {
852  layer_size_ = (*pedge_list_)[i]->Layer();
853  }
854  }
855 
856  if(pillar_size_ > 0)
857  {
858  // pillar is always in the first layer if exists
859  if(0 == layer_size_)
860  {
861  layer_size_ = 1;
862  }
863 
864  for (int i = 0; i < M; i++)
865  {
866  if (!(*pedge_list_)[i]->isPillar())
867  {
868  if(1 == layer_size_)
869  {
870  (*pedge_list_)[i]->SetLayer(1);
871  }
872  else
873  {
874  assert(0 != (*pedge_list_)[i]->Layer());
875  }
876  }
877  else
878  {
879  (*pedge_list_)[i]->SetLayer(0);
880  }
881  }
882 
883  // add base
884  layer_size_++;
885  }
886 
887  float scaleX = maxx_ - minx_;
888  float scaleY = maxy_ - miny_;
889  float scaleZ = maxz_ - minz_;
890  float scaleMax = scaleX;
891  if (scaleMax < scaleY)
892  {
893  scaleMax = scaleY;
894  }
895  if (scaleMax < scaleZ)
896  {
897  scaleMax = scaleZ;
898  }
899 
900  scaleV_ = unify_size_ / scaleMax;
901  center_pos_ = point((minx_ + maxx_) / 2.f, (miny_ + maxy_) / 2.f, (minz_ + maxz_) / 2.f);
902  base_center_pos_ = point((minx_ + maxx_) / 2.f, (miny_ + maxy_) / 2.f, basez_);
903 
904  for (size_t i = 0; i < N; i++)
905  {
906  (*pvert_list_)[i]->SetRenderPos( Unify((*pvert_list_)[i]->Position()) );
907  if ((*pvert_list_)[i]->isFixed())
908  {
909  fixed_vert_++;
910  }
911  if ((*pvert_list_)[i]->isBase())
912  {
913  base_vert_++;
914  }
915  }
916 }
917 
918 
920 {
921  return (p - center_pos_) * scaleV_;
922 }
923 
924 
926 {
927  int N = SizeOfVertList();
928  int M = SizeOfEdgeList();
929 
930  vector<bool> delete_vert;
931  delete_vert.resize(N);
932  fill(delete_vert.begin(), delete_vert.end(), false);
933 
934  vector<bool> delete_edge;
935  delete_edge.resize(M);
936  fill(delete_edge.begin(), delete_edge.end(), false);
937 
938  for (int i = 0; i < N; i++)
939  {
940  WF_vert *u = (*pvert_list_)[i];
941  if (u->Degree() == 2)
942  {
943  WF_edge *e1 = (*pvert_list_)[i]->pedge_;
944  WF_edge *e2 = (*pvert_list_)[i]->pedge_->pnext_;
945  WF_vert *v1 = e1->pvert_;
946  WF_vert *v2 = e2->pvert_;
947 
948  if (ArcHeight(u->Position(), v1->Position(), v2->Position()) < delta_tol_)
949  {
950  delete_vert[u->ID()] = true;
951  delete_edge[e1->ID()] = true;
952  delete_edge[e2->ID()] = true;
953 
954  WF_edge *e1_pair = e1->ppair_;
955  WF_edge *e2_pair = e2->ppair_;
956  e1_pair->pvert_ = v2;
957  e2_pair->pvert_ = v1;
958  e1_pair->ppair_ = e2_pair;
959  e2_pair->ppair_ = e1_pair;
960  }
961  }
962  }
963 
964  vector<WF_vert*>::iterator itv = pvert_list_->begin();
965  while (itv != pvert_list_->end())
966  {
967  if (delete_vert[(*itv)->ID()])
968  {
969  itv = pvert_list_->erase(itv);
970  }
971  else
972  {
973  itv++;
974  }
975  }
976 
977  vector<WF_edge*>::iterator ite = pedge_list_->begin();
978  while (ite != pedge_list_->end())
979  {
980  if (delete_edge[(*ite)->ID()])
981  {
982  ite = pedge_list_->erase(ite);
983  }
984  else
985  {
986  ite++;
987  }
988  }
989 
990  Unify();
991 }
992 
993 
995 {
996  if (base_vert_ == 0)
997  {
998  return;
999  }
1000 
1001  int N = SizeOfVertList();
1002  for (int i = 0; i < N; i++)
1003  {
1004  WF_vert *u = (*pvert_list_)[i];
1005  if (u->isBase())
1006  {
1007  point v_pos = u->Position();
1008  v_pos.z() = minz_ - len;
1009 
1010  WF_vert *v = InsertVertex(v_pos);
1011  v->SetFixed(true);
1012 
1013  WF_edge *e = InsertEdge(u, v);
1014  e->SetPillar(true);
1015  e->ppair_->SetPillar(true);
1016  }
1017  }
1018 
1019  Unify();
1020 }
1021 
1022 
1024 {
1025  if (SizeOfFixedVert() == 0)
1026  {
1027  return;
1028  }
1029 
1030  int N = SizeOfVertList();
1031  for (int i = 0; i < N; i++)
1032  {
1033  WF_vert *u = (*pvert_list_)[i];
1034  if (u->isFixed())
1035  {
1036  double x = u->Position().x();
1037  double y = u->Position().y();
1038  double z = u->Position().z();
1039  z = minz_ - len;
1040  u->SetPosition(x, y, z);
1041  }
1042  }
1043  Unify();
1044 }
1045 
1046 
1047 void WireFrame::MakeCeiling(vector<WF_edge*> &bound_e)
1048 {
1049  if (bound_e.size() == 0)
1050  {
1051  return;
1052  }
1053 
1054  int M = SizeOfEdgeList();
1055  for (int i = 0; i < M; i++)
1056  {
1057  (*pedge_list_)[i]->SetCeiling(false);
1058  }
1059 
1060  int Mb = bound_e.size();
1061  for (int i = 0; i < Mb; i++)
1062  {
1063  WF_edge *e = bound_e[i];
1064  e->SetCeiling(true);
1065  e->ppair_->SetCeiling(true);
1066  }
1067 
1068  Unify();
1069 }
1070 
1071 
1072 void WireFrame::MakeBase(vector<WF_vert*> &base_v)
1073 {
1074  if (base_v.size() == 0)
1075  {
1076  return;
1077  }
1078 
1079  int M = SizeOfEdgeList();
1080  for (int i = 0; i < M; i++)
1081  {
1082  (*pedge_list_)[i]->SetPillar(false);
1083  }
1084 
1085  int N = SizeOfVertList();
1086  for (int i = 0; i < N; i++)
1087  {
1088  (*pvert_list_)[i]->SetBase(false);
1089  (*pvert_list_)[i]->SetFixed(false);
1090  }
1091 
1092  int Nb = base_v.size();
1093  for (int i = 0; i < Nb; i++)
1094  {
1095  WF_vert *v = base_v[i];
1096  v->SetBase(true);
1097  }
1098 
1099  Unify();
1100 }
1101 
1102 
1103 void WireFrame::MakeSubGraph(vector<WF_edge*> &subg_e)
1104 {
1105  if (subg_e.size() == 0)
1106  {
1107  return;
1108  }
1109 
1110  int N = SizeOfVertList();
1111  for (int i = 0; i < N; i++)
1112  {
1113  (*pvert_list_)[i]->SetSubgraph(false);
1114  }
1115 
1116  int M = SizeOfEdgeList();
1117  for (int i = 0; i < M; i++)
1118  {
1119  (*pedge_list_)[i]->SetSubgraph(false);
1120  }
1121 
1122  int Mb = subg_e.size();
1123  for (int i = 0; i < Mb; i++)
1124  {
1125  WF_edge *e = subg_e[i];
1126  e->SetSubgraph(true);
1127  e->ppair_->SetSubgraph(true);
1128  e->pvert_->SetSubgraph(true);
1129  e->ppair_->pvert_->SetSubgraph(true);
1130  }
1131 
1132  Unify();
1133 }
Vec3f center_pos_
Definition: WireFrame.h:308
void WriteToOBJ(const char *path)
Definition: WireFrame.cpp:360
void WriteToPWF(bool bVert, bool bLine, bool bPillar, bool bCeiling, bool bCut, int min_layer, int max_layer, const char *path)
Definition: WireFrame.cpp:402
void SetID(int id)
Definition: WireFrame.h:91
int Degree() const
Definition: WireFrame.h:81
double delta_tol_
Definition: WireFrame.h:312
bool isFixed() const
Definition: WireFrame.h:83
int pillar_size_
Definition: WireFrame.h:296
GLenum GLuint GLint GLint layer
int ceiling_size_
Definition: WireFrame.h:297
bool isBase() const
Definition: WireFrame.h:84
double minx_
Definition: WireFrame.h:303
WF_edge * InsertOneWayEdge(WF_vert *u, WF_vert *v)
Definition: WireFrame.cpp:763
int SizeOfFixedVert() const
Definition: WireFrame.h:229
double minz_
Definition: WireFrame.h:305
trimesh::point point
Definition: WireFrame.h:51
bool isCeiling() const
Definition: WireFrame.h:126
double maxx_
Definition: WireFrame.h:300
point RenderPos() const
Definition: WireFrame.h:79
void SetPosition(point p)
Definition: WireFrame.h:87
GLsizei const GLchar *const * path
void ModifyProjection(double len)
Definition: WireFrame.cpp:1023
WF_vert * InsertVertex(const Vec3f p)
Definition: WireFrame.cpp:719
WF_edge * pnext_
Definition: WireFrame.h:165
bool isSubgraph() const
Definition: WireFrame.h:127
GLfloat GLfloat v1
double maxz_
Definition: WireFrame.h:302
void SetSubgraph(bool b_subg)
Definition: WireFrame.h:133
WF_edge * InsertEdge(WF_vert *u, WF_vert *v)
Definition: WireFrame.cpp:739
WF_edge * pedge_
Definition: WireFrame.h:99
void MakeSubGraph(vector< WF_edge * > &subg_e)
Definition: WireFrame.cpp:1103
double miny_
Definition: WireFrame.h:304
reference x()
Definition: Vec.h:194
void SetCeiling(bool b_ceiling)
Definition: WireFrame.h:132
void MakeBase(vector< WF_vert * > &base_v)
Definition: WireFrame.cpp:1072
bool isPillar() const
Definition: WireFrame.h:125
double unify_size_
Definition: WireFrame.h:311
void LoadFromPWF(const char *path)
Definition: WireFrame.cpp:148
void Unify()
Definition: WireFrame.cpp:781
GLint GLenum GLint x
GLsizeiptr size
GLenum GLsizei len
void ExportPoints(int min_layer, int max_layer, const char *path)
Definition: WireFrame.cpp:642
void SetPillar(bool b_pillar)
Definition: WireFrame.h:131
double Dist(point u, point v) const
Definition: WireFrame.h:268
void SetLayer(int layer)
Definition: WireFrame.h:130
int ID() const
Definition: WireFrame.h:123
const GLubyte * c
void SetFixed(bool b_fixed)
Definition: WireFrame.h:94
WF_edge * ppair_
Definition: WireFrame.h:166
int Layer() const
Definition: WireFrame.h:124
double maxy_
Definition: WireFrame.h:301
int fixed_vert_
Definition: WireFrame.h:294
void SetBase(bool b_base)
Definition: WireFrame.h:95
int layer_size_
Definition: WireFrame.h:298
typedef int(WINAPI *PFNWGLRELEASEPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer
int SizeOfVertList() const
Definition: WireFrame.h:227
float scaleV_
Definition: WireFrame.h:310
reference y()
Definition: Vec.h:203
Vec3f base_center_pos_
Definition: WireFrame.h:309
void SetSubgraph(bool b_subg)
Definition: WireFrame.h:96
int base_vert_
Definition: WireFrame.h:295
#define ROS_WARN_STREAM(args)
GLboolean GLboolean GLboolean b
double ArcHeight(point u, point v1, point v2) const
Definition: WireFrame.h:282
GLdouble GLdouble GLdouble z
int ID() const
Definition: WireFrame.h:80
void IncreaseDegree()
Definition: WireFrame.h:92
const GLdouble * v
void ProjectBound(double len)
Definition: WireFrame.cpp:994
void LoadFromOBJ(const char *path)
Definition: WireFrame.cpp:34
WF_vert * pvert_
Definition: WireFrame.h:164
GLfloat GLfloat GLfloat v2
void ImportFrom3DD(const char *path)
Definition: WireFrame.cpp:528
bool isPillar(int i) const
Definition: WireFrame.h:254
bool isFixed(int u) const
Definition: WireFrame.h:253
GLfloat f
void ExportLines(int min_layer, int max_layer, const char *path)
Definition: WireFrame.cpp:684
void ExportSubgraph(const char *path)
Definition: WireFrame.cpp:588
M
double basez_
Definition: WireFrame.h:306
#define ROS_ERROR_STREAM(args)
reference z()
Definition: Vec.h:212
GLfloat GLfloat p
std::vector< WF_vert * > * pvert_list_
Definition: WireFrame.h:291
std::vector< WF_edge * > * pedge_list_
Definition: WireFrame.h:292
GLint y
int SizeOfEdgeList() const
Definition: WireFrame.h:228
point Position() const
Definition: WireFrame.h:78
void SimplifyFrame()
Definition: WireFrame.cpp:925
void MakeCeiling(vector< WF_edge * > &bound_e)
Definition: WireFrame.cpp:1047


choreo_task_sequence_planner
Author(s): Yijiang Huang
autogenerated on Thu Jul 18 2019 04:03:14