DualGraph.cpp
Go to the documentation of this file.
2 
4 {
5  vert_list_ = NULL;
6  edge_list_ = NULL;
7  face_list_ = NULL;
8 }
9 
10 
12 {
13  ptr_frame_ = ptr_frame;
14  vert_list_ = NULL;
15  edge_list_ = NULL;
16  face_list_ = NULL;
17 
18  Init();
19 }
20 
21 
23 {
24  Clear();
25 }
26 
27 
29 {
30  Clear();
31 
32  int N = ptr_frame_->SizeOfVertList();
33  int M = ptr_frame_->SizeOfEdgeList();
34 
35  vert_list_ = new vector<DualVertex*>;
36  vert_list_->resize(M);
37  for (int i = 0; i < M; i++)
38  {
39  (*vert_list_)[i] = new DualVertex();
40  }
41 
42  edge_list_ = new vector<DualEdge*>;
43 
44  face_list_ = new vector<DualFace*>;
45  face_list_->resize(N);
46  for (int i = 0; i < N; i++)
47  {
48  (*face_list_)[i] = new DualFace();
49  }
50 
51  Nd_ = 0;
52  Md_ = 0;
53  Fd_ = 0;
54  Fd_free_ = 0;
55 
56  exist_vert_.resize(N);
57  fill(exist_vert_.begin(), exist_vert_.end(), 0);
58  exist_edge_.resize(M);
59  fill(exist_edge_.begin(), exist_edge_.end(), false);
60 }
61 
62 
64 {
65  if (vert_list_ != NULL)
66  {
67  int N = vert_list_->size();
68  for (int i = 0; i < N; i++)
69  {
70  delete (*vert_list_)[i];
71  (*vert_list_)[i] = NULL;
72  }
73  delete vert_list_;
74  vert_list_ = NULL;
75  }
76 
77  if (edge_list_ != NULL)
78  {
79  int M = edge_list_->size();
80  for (int i = 0; i < M; i++)
81  {
82  delete (*edge_list_)[i];
83  (*edge_list_)[i] = NULL;
84  }
85  delete edge_list_;
86  edge_list_ = NULL;
87  }
88 
89  if (face_list_ != NULL)
90  {
91  int F = face_list_->size();
92  for (int i = 0; i < F; i++)
93  {
94  delete (*face_list_)[i];
95  (*face_list_)[i] = NULL;
96  }
97  delete face_list_;
98  face_list_ = NULL;
99  }
100 }
101 
102 
104 {
105  maxz_ = ptr_frame_->maxZ();
106  minz_ = ptr_frame_->minZ();
107 
108  //maxz_ = -1e20;
109  //minz_ = 1e20;
110 
111  //int M = ptr_frame_->SizeOfEdgeList();
112  //for (int i = 0; i < M; i++)
113  //{
114  // double z = ptr_frame_->GetCenterPos(i).z();
115  // if (z > maxz_)
116  // {
117  // maxz_ = z;
118  // }
119  // if (z < minz_)
120  // {
121  // minz_ = z;
122  // }
123  //}
124 
125  // first time & all exsits
126  fill(exist_vert_.begin(), exist_vert_.end(), 1);
127  fill(exist_edge_.begin(), exist_edge_.end(), true);
128 
129  Establish();
130 }
131 
132 
133 void DualGraph::UpdateDualization(VectorXd *ptr_x)
134 {
135  maxz_ = -1e20;
136 
137  int Nd = Nd_;
138 
139  fill(exist_vert_.begin(), exist_vert_.end(), 0);
140  fill(exist_edge_.begin(), exist_edge_.end(), false);
141  for (int e_id = 0; e_id < Nd; e_id++)
142  {
143  if ((*ptr_x)[e_id])
144  {
145  WF_edge *ei = ptr_frame_->GetEdge((*vert_list_)[e_id]->orig_id());
146  WF_edge *ej = ei->ppair_;
147  WF_vert *u = ej->pvert_;
148  WF_vert *v = ei->pvert_;
149 
150  //if (ei->CenterPos().z() > maxz_)
151  //{
152  // maxz_ = ei->CenterPos().z();
153  //}
154 
155  if (u->Position().z() > maxz_)
156  {
157  maxz_ = u->Position().z();
158  }
159  if (v->Position().z() > maxz_)
160  {
161  maxz_ = v->Position().z();
162  }
163 
164  exist_vert_[u->ID()]++;
165  exist_vert_[v->ID()]++;
166  exist_edge_[ei->ID()] = exist_edge_[ej->ID()] = true;
167  }
168  }
169 
170  // Release the last edge_list_
171  int Md = edge_list_->size();
172  for (int i = 0; i < Md; i++)
173  {
174  delete (*edge_list_)[i];
175  }
176  edge_list_->clear();
177 
178  Establish();
179 }
180 
181 
183 {
184  int N = ptr_frame_->SizeOfVertList();
185  int M = ptr_frame_->SizeOfEdgeList();
186 
187  Nd_ = 0;
188  Fd_ = 0;
189  Fd_free_ = 0;
190 
191  // vert list
192  for (int i = 0; i < M; i++)
193  {
194  if (exist_edge_[i])
195  {
196  WF_edge *e = ptr_frame_->GetEdge(i);
197  int j = e->ppair_->ID();
198  if (i < j)
199  {
200  InsertVertex(e);
201  }
202  }
203  else
204  {
205  (*vert_list_)[i]->SetDualId(-1);
206  }
207  }
208 
209  // face list
210  for (int i = 0; i < N; i++)
211  {
212  if (exist_vert_[i] > 0)
213  {
215  }
216  else
217  {
218  (*face_list_)[i]->SetDualId(-1);
219  }
220  }
221 
222  // edge list
223  for (int i = 0; i < N; i++)
224  {
225  if (exist_vert_[i] > 0)
226  {
227  if (ptr_frame_->GetDegree(i) > 1)
228  {
229  WF_vert *vert = ptr_frame_->GetVert(i);
230  WF_edge *edge = ptr_frame_->GetNeighborEdge(i);
231  double w = (ptr_frame_->GetPosition(i).z() - minz_) / (maxz_ - minz_);
232  while (edge->pnext_ != NULL)
233  {
234  WF_edge *next_edge = edge->pnext_;
235  //double w = ((edge->CenterPos().z() + next_edge->CenterPos().z()) / 2 - minz_)
236  // / (maxz_ - minz_);
237  InsertEdge(edge, next_edge, w, vert);
238  edge = next_edge;
239  }
240 
241  if (ptr_frame_->GetDegree(i) > 2)
242  {
243  WF_edge *next_edge = ptr_frame_->GetNeighborEdge(i);
244  //double w = ((edge->CenterPos().z() + next_edge->CenterPos().z()) / 2 - minz_)
245  // / (maxz_ - minz_);
246  InsertEdge(edge, next_edge, w, vert);
247  }
248  }
249  }
250  }
251 
252  Md_ = edge_list_->size();
253 
254  //Debug();
255 }
256 
257 
259 {
260  int i = e->ID();
261  int j = e->ppair_->ID();
262  int u = e->pvert_->ID();
263  int v = e->ppair_->pvert_->ID();
264  int dual_u = -1;
265  int dual_v = -1;
266 
267  if (!exist_edge_[i])
268  {
269  if (exist_vert_[u] == 0)
270  {
271  dual_u = InsertFace(ptr_frame_->GetVert(u));
272  }
273  if (exist_vert_[v] == 0)
274  {
275  dual_v = InsertFace(ptr_frame_->GetVert(v));
276  }
277  exist_vert_[u]++;
278  exist_vert_[v]++;
279 
280  InsertVertex(e);
281  exist_edge_[i] = exist_edge_[j] = true;
282  }
283 
284  // TODO: comment to enable seq print layer, edge in order might float
285 // assert(dual_u == -1 || dual_v == -1);
286  return (max(dual_u, dual_v));
287 }
288 
289 
291 {
292  int i = e->ID();
293  int j = e->ppair_->ID();
294  int u = e->pvert_->ID();
295  int v = e->ppair_->pvert_->ID();
296  int ret_dual = -1;
297 
298  if (exist_edge_[i])
299  {
300  exist_vert_[u]--;
301  exist_vert_[v]--;
302  if (exist_vert_[u] == 0)
303  {
304  ret_dual = DeleteFace(ptr_frame_->GetVert(u));
305  }
306  if (exist_vert_[v] == 0)
307  {
308  ret_dual = DeleteFace(ptr_frame_->GetVert(v));
309  }
310 
311  DeleteVertex(e);
312  exist_edge_[i] = exist_edge_[j] = false;
313  }
314 
315  return ret_dual;
316 }
317 
318 
320 {
321  int i = e->ID();
322  int j = e->ppair_->ID();
323  (*vert_list_)[i]->SetDualId(Nd_);
324  (*vert_list_)[j]->SetDualId(Nd_);
325  (*vert_list_)[Nd_]->SetOrigId(i);
326  (*vert_list_)[Nd_]->SetHeight((e->CenterPos()).z());
327  Nd_++;
328 }
329 
330 
331 void DualGraph::InsertEdge(WF_edge *e1, WF_edge *e2, double w, WF_vert *vert)
332 {
333  int u = (*vert_list_)[e1->ID()]->dual_id();
334  int v = (*vert_list_)[e2->ID()]->dual_id();
335 
336  if (u != -1 && v != -1)
337  {
338  edge_list_->push_back(new DualEdge(u, v, w, vert));
339  }
340 }
341 
342 
344 {
345  int u = p->ID();
346  int ret_dual = -1;
347  if (p->isFixed())
348  {
349  (*face_list_)[u]->SetDualId(Fd_);
350  (*face_list_)[Fd_]->SetOrigId(u);
351  }
352  else
353  {
354  if (Fd_free_ == Fd_) // no fixed points
355  {
356  (*face_list_)[u]->SetDualId(Fd_);
357  (*face_list_)[Fd_]->SetOrigId(u);
358  }
359  else
360  {
361  int dual_v = Fd_free_; // first fixed point
362  int orig_v = (*face_list_)[dual_v]->orig_id();
363 
364  (*face_list_)[u]->SetDualId(dual_v);
365  (*face_list_)[dual_v]->SetOrigId(u);
366 
367  (*face_list_)[orig_v]->SetDualId(Fd_);
368  (*face_list_)[Fd_]->SetOrigId(orig_v);
369  }
370 
371  ret_dual = Fd_free_;
372  Fd_free_++;
373  }
374 
375  Fd_++;
376  return ret_dual;
377 }
378 
379 
381 {
382  int i = e->ID();
383  int j = e->ppair_->ID();
384  int ei = (*vert_list_)[i]->dual_id();
385  int dual_e = Nd_ - 1;
386  int orig_e1 = (*vert_list_)[dual_e]->orig_id();
387  WF_edge *e_swap = ptr_frame_->GetEdge(orig_e1);
388  int orig_e2 = e_swap->ppair_->ID();
389 
390  (*vert_list_)[i]->SetDualId(-1);
391  (*vert_list_)[j]->SetDualId(-1);
392  (*vert_list_)[orig_e1]->SetDualId(ei);
393  (*vert_list_)[orig_e1]->SetDualId(ei);
394  (*vert_list_)[ei]->SetOrigId(orig_e1);
395  (*vert_list_)[ei]->SetHeight((e_swap->CenterPos()).z());
396 
397  Nd_--;
398 }
399 
400 
402 {
403  int orig_u = p->ID();
404  int dual_u = (*face_list_)[orig_u]->dual_id();
405  (*face_list_)[orig_u]->SetDualId(-1);
406  (*face_list_)[dual_u]->SetOrigId(-1);
407 
408  for (int i = dual_u; i < Fd_ - 1; i++)
409  {
410  int j = i + 1;
411  int orig_j = (*face_list_)[j]->orig_id();
412  (*face_list_)[orig_j]->SetDualId(i);
413  (*face_list_)[i]->SetOrigId(orig_j);
414  }
415  if (!p->isFixed())
416  {
417  Fd_free_--;
418  }
419  Fd_--;
420 
421  return dual_u;
422 }
423 
424 
426 {
427  int M = ptr_frame_->SizeOfEdgeList();
428  for (int i = 0; i < M; i++)
429  {
430  WF_edge *e = ptr_frame_->GetEdge(i);
431  int end_id = e->pvert_->ID();
432  int start_id = e->ppair_->pvert_->ID();
433  printf("**********%d:\n", i);
434  printf("start vertex: %d\n", start_id);
435  printf("end vertex: %d\n", end_id);
436  int dual_id = (*vert_list_)[i]->dual_id();
437  printf("dual vertex: %d\n", dual_id);
438  printf("original vertex: %d\n", (*vert_list_)[dual_id]->orig_id());
439  getchar();
440  }
441 
442  int N = ptr_frame_->SizeOfVertList();
443  for (int i = 0; i < N; i++)
444  {
445  WF_vert *p = ptr_frame_->GetVert(i);
446  printf("**********%d:\n", i);
447  int dual_id = (*face_list_)[i]->dual_id();
448  printf("dual vertex: %d\n", dual_id);
449  printf("original vertex: %d\n", (*face_list_)[dual_id]->orig_id());
450  getchar();
451  }
452 
453  for (int i = 0; i < Md_; i++)
454  {
455  printf("%d %d\n", (*edge_list_)[i]->u(), (*edge_list_)[i]->v());
456  }
457 }
int GetDegree(int u) const
Definition: WireFrame.h:242
bool isFixed() const
Definition: WireFrame.h:83
int DeleteFace(WF_vert *p)
Definition: DualGraph.cpp:401
WF_edge * GetNeighborEdge(int u)
Definition: WireFrame.h:239
double minz_
Definition: DualGraph.h:207
WF_edge * pnext_
Definition: WireFrame.h:165
int InsertFace(WF_vert *p)
Definition: DualGraph.cpp:343
int v(int ei)
Definition: DualGraph.h:151
int u(int ei)
Definition: DualGraph.h:150
WF_edge * GetEdge(int i)
Definition: WireFrame.h:238
vector< DualFace * > * face_list_
Definition: DualGraph.h:194
point CenterPos() const
Definition: WireFrame.h:135
GLubyte GLubyte GLubyte GLubyte w
int ID() const
Definition: WireFrame.h:123
void DeleteVertex(WF_edge *e)
Definition: DualGraph.cpp:380
WF_edge * ppair_
Definition: WireFrame.h:166
double maxZ() const
Definition: WireFrame.h:260
vector< DualEdge * > * edge_list_
Definition: DualGraph.h:192
int SizeOfVertList() const
Definition: WireFrame.h:227
double maxz_
Definition: DualGraph.h:206
void Init()
Definition: DualGraph.cpp:28
void InsertEdge(WF_edge *e1, WF_edge *e2, double w, WF_vert *vert)
Definition: DualGraph.cpp:331
vector< bool > exist_edge_
Definition: DualGraph.h:197
vector< DualVertex * > * vert_list_
Definition: DualGraph.h:193
double minZ() const
Definition: WireFrame.h:261
GLdouble GLdouble GLdouble z
int Fd_free_
Definition: DualGraph.h:204
WireFrame * ptr_frame_
Definition: DualGraph.h:189
int RemoveUpdation(WF_edge *e)
Definition: DualGraph.cpp:290
int ID() const
Definition: WireFrame.h:80
vector< int > exist_vert_
Definition: DualGraph.h:196
const GLdouble * v
WF_vert * pvert_
Definition: WireFrame.h:164
void Clear()
Definition: DualGraph.cpp:63
void Dualization()
Definition: DualGraph.cpp:103
M
reference z()
Definition: Vec.h:212
point GetPosition(int u) const
Definition: WireFrame.h:241
void Establish()
Definition: DualGraph.cpp:182
GLfloat GLfloat p
void InsertVertex(WF_edge *e)
Definition: DualGraph.cpp:319
void Debug()
Definition: DualGraph.cpp:425
void UpdateDualization(VectorXd *ptr_x)
Definition: DualGraph.cpp:133
int SizeOfEdgeList() const
Definition: WireFrame.h:228
point Position() const
Definition: WireFrame.h:78
WF_vert * GetVert(int u)
Definition: WireFrame.h:237


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