IsoEx
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Modules Pages
EdgeKey.hh
1 #ifndef ISOEX_EDGEKEY_HH
2 #define ISOEX_EDGEKEY_HH
3 
4 
5 //== INCLUDES =================================================================
6 
7 
8 //== NAMESPACES ===============================================================
9 
10 namespace IsoEx
11 {
12 
13  template <class PointIdx>
14  class EdgeKey
15  {
16  public:
17  EdgeKey(){}
18  ~EdgeKey(){}
19 
20  EdgeKey(PointIdx _p0, PointIdx _p1)
21  {
22  if (_p0 < _p1) { p0_ = _p0; p1_ = _p1; }
23  else { p0_ = _p1; p1_ = _p0; }
24  }
25 
26 
27  enum Location {
28  NONE,
29  SAME,
30  TOP,
31  BOTTOM,
32  LEFT,
33  RIGHT,
34  TOPLEFT,
35  TOPRIGHT,
36  BOTTOMLEFT,
37  BOTTOMRIGHT
38  };
39 
40  const PointIdx &p0() const {return p0_;}
41  const PointIdx &p1() const {return p1_;}
42 
43  bool is_on_z_layer (unsigned int &_x_res,
44  unsigned int &_y_res,
45  unsigned int &_z_res,
46  unsigned int &_layer)
47  {
48  PointIdx idx = p0_;
49  idx /= _x_res;
50  idx /= _y_res;;
51  unsigned int z0 = idx;
52 
53  idx = p1_;
54  idx /= _x_res;
55  idx /= _y_res;;
56  unsigned int z1 = idx;
57 
58  if (z0 == z1)
59  {
60  _layer = z0;
61  return true;
62  }
63  else return false;
64 
65  }
66 
67  bool is_x_edge ()
68  {
69  if ((p1_ - p0_) == 1) return true;
70  else return false;
71  }
72 
73  // bool x_neighbor( const EdgeKey & _ne,
74  // const unsigned int &_x_res,
75  // const unsigned int &_y_res,
76  // const unsigned int &_z_res,
77  // int &_location )
78  // {
79  // //points of e
80  // OpenMesh::Vec2i p0;
81  // OpenMesh::Vec2i p1;
82  //
83  // //points of ne
84  // OpenMesh::Vec2i np0;
85  // OpenMesh::Vec2i np1;
86  //
87  // //directions of e and ne
88  // OpenMesh::Vec2i de;
89  // OpenMesh::Vec2i dne;
90  //
91  // PointIdx idx = p0_;
92  // p0[0] = idx % _x_res; idx /= _x_res;
93  // p0[1] = idx % _y_res; idx /= _y_res;
94  //
95  // idx = p1_;
96  // p1[0] = idx % _x_res; idx /= _x_res;
97  // p1[1] = idx % _y_res; idx /= _y_res;
98  //
99  // idx = _ne.p0();
100  // np0[0] = idx % _x_res; idx /= _x_res;
101  // np0[1] = idx % _y_res; idx /= _y_res;
102  //
103  // idx = _ne.p1();
104  // np1[0] = idx % _x_res; idx /= _x_res;
105  // np1[1] = idx % _y_res; idx /= _y_res;
106  //
107  // de = p1 - p0;
108  // dne = np1 - np0;
109  //
110  // _location = UNKNOWN;
111  // bool neighbor = true;
112  //
113  // if (de == OpenMesh::Vec2i(1,0) )
114  // {
115  // if (dne == OpenMesh::Vec2i(1,0))
116  // {
117  // if (abs(p0_ - _ne.p0()) == 1 ) _location = SAME;
118  // else
119  // {
120  // if (p0[1] < np0[1])
121  // {
122  // neighbor = false;
123  // _location = TOP;
124  // }
125  // else if (p0[1] > np0[1])
126  // {
127  // neighbor = false;
128  // _location = BOTTOM;
129  // }
130  // else
131  // {
132  // neighbor = false;
133  // _location = SAME;
134  // }
135  // }
136  // }
137  // if (dne == OpenMesh::Vec2i(0,1))
138  // {
139  // if (np0 == p0)
140  // {
141  // _location = TOP;
142  // neighbor = false;
143  // }
144  // else if (np0 == p1)
145  // {
146  // _location = TOP;
147  // neighbor = false;
148  // }
149  // else if (np1 == p0)
150  // {
151  // _location = BOTTOM;
152  // neighbor = false;
153  // }
154  // else if (np1 == p1)
155  // {
156  // _location = BOTTOM;
157  // neighbor = false;
158  // }
159  // else
160  // {
161  // neighbor = false;
162  // if (np0[1] > p0[1]) _location = TOP;
163  // else _location = BOTTOM;
164  // }
165  // }
166  // }
167  // else neighbor = false;
168  //
169  // return neighbor;
170  // }
171 
172  void x_neighbor( const EdgeKey & _ne,
173  const unsigned int &_x_res,
174  const unsigned int &_y_res,
175  const unsigned int &_z_res,
176  int &_location )
177  {
178  //points of e
179  OpenMesh::Vec2i p0;
180  OpenMesh::Vec2i p1;
181 
182  //points of ne
183  OpenMesh::Vec2i np0;
184  OpenMesh::Vec2i np1;
185 
186  //directions of e and ne
187  OpenMesh::Vec2i de;
188  OpenMesh::Vec2i dne;
189 
190  PointIdx idx = p0_;
191  p0[0] = idx % _x_res; idx /= _x_res;
192  p0[1] = idx % _y_res; idx /= _y_res;
193 
194  idx = p1_;
195  p1[0] = idx % _x_res; idx /= _x_res;
196  p1[1] = idx % _y_res; idx /= _y_res;
197 
198  idx = _ne.p0();
199  np0[0] = idx % _x_res; idx /= _x_res;
200  np0[1] = idx % _y_res; idx /= _y_res;
201 
202  idx = _ne.p1();
203  np1[0] = idx % _x_res; idx /= _x_res;
204  np1[1] = idx % _y_res; idx /= _y_res;
205 
206  de = p1 - p0;
207  dne = np1 - np0;
208 
209  _location = NONE;
210 
211  if (de == OpenMesh::Vec2i(1,0) )
212  {
213  if (dne == OpenMesh::Vec2i(1,0))
214  {
215  if ((int)p0_ - (int)_ne.p0() == 1 ) _location = LEFT;
216  else if ((int)p0_ - (int)_ne.p0() == -1) _location = RIGHT;
217  else if ((int)p0_ - (int)_ne.p0() == 0) _location = SAME;
218  else
219  {
220  if (p0[1] - np0[1] == -1)
221  {
222  _location = TOP;
223  }
224  else if (p0[1] - np0[1] == 1)
225  {
226  _location = BOTTOM;
227  }
228  }
229  }
230  else if (dne == OpenMesh::Vec2i(0,1))
231  {
232  if (np0 == p0)
233  {
234  _location = TOPLEFT;
235  }
236  else if (np0 == p1)
237  {
238  _location = TOPRIGHT;
239  }
240  else if (np1 == p0)
241  {
242  _location = BOTTOMLEFT;
243  }
244  else if (np1 == p1)
245  {
246  _location = BOTTOMRIGHT;
247  }
248  }
249  }
250  }
251 
252 
253  bool operator<(const EdgeKey& _rhs) const
254  {
255  if (p0_ != _rhs.p0())
256  return (p0_ < _rhs.p0());
257  else
258  return (p1_ < _rhs.p1());
259  }
260 
261  private:
262  PointIdx p0_, p1_;
263  };
264 
265 
266  //=============================================================================
267 } // namespace IsoEx
268 
269 
270 //=============================================================================
271 #endif // ISOEX_EDGEKEY_HH defined
272 //=============================================================================
Definition: EdgeKey.hh:14
A type for volume images, or 3D textures.