DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
DomainMetricAdjacency.ih
1 
30 
31 #include <cstdlib>
33 
35 // IMPLEMENTATION of inline methods.
37 
39 // ----------------------- Standard services ------------------------------
40 
45 template <typename Domain, Dimension maxNorm1, Dimension dimension>
46 inline
48 ::DomainMetricAdjacency( const Domain & aDomain )
49  : myDomain( aDomain )
50 {
51 }
52 
57 template <typename Domain, Dimension maxNorm1, Dimension dimension>
58 inline
61  : myDomain( other.myDomain )
62 {
63 }
64 
68 template <typename Domain, Dimension maxNorm1, Dimension dimension>
69 inline
72 {
73 }
74 
75 
77 // ----------------------- Adjacency services -----------------------------
78 
86 template <typename Domain, Dimension maxNorm1, Dimension dimension>
87 inline
88 bool
90 ( const Point & p1, const Point & p2 ) const
91 {
92  ASSERT( myDomain.isInside( p1 ) && myDomain.isInside( p2 ) );
93  Vector v( p2 - p1 );
94  return ( v.normInfinity() <= 1 ) && ( v.norm1() <= maxNorm1 );
95 }
96 
104 template <typename Domain, Dimension maxNorm1, Dimension dimension>
105 inline
106 bool
108 ( const Point & p1, const Point & p2 ) const
109 {
110  ASSERT( myDomain.isInside( p1 ) && myDomain.isInside( p2 ) );
111  Vector v( p2 - p1 );
112  if ( v.normInfinity() <= 1 )
113  {
114  typename Vector::UnsignedComponent n1 = v.norm1();
115  return ( n1 <= maxNorm1 ) && ( n1 != 0 );
116  }
117  return false;
118 }
119 
130 template <typename Domain, Dimension maxNorm1, Dimension dimension>
131 template <typename OutputIterator>
132 void
134 ( const Point & p, OutputIterator & out_it ) const
135 {
136  Point p1( p );
137  for ( typename Point::Iterator it = p1.begin(); it != p1.end(); ++it )
138  --(*it);
139  Point p2( p );
140  for ( typename Point::Iterator it = p2.begin(); it != p2.end(); ++it )
141  ++(*it);
142  typedef HyperRectDomain<Space> LocalDomain;
143  LocalDomain domain( p1, p2 );
144  for ( typename LocalDomain::ConstIterator it = domain.begin();
145  it != domain.end();
146  ++it )
147  {
148  if ( myDomain.isInside( *it ) )
149  {
150  Vector v( p - *it );
151  typename Vector::UnsignedComponent n1 = v.norm1();
152  if ( n1 <= maxNorm1 )
153  *out_it++ = *it;
154  }
155  }
156 }
157 
168 template <typename Domain, Dimension maxNorm1, Dimension dimension>
169 template <typename OutputIterator>
170 void
172 ( const Point & p, OutputIterator & out_it ) const
173 {
174  Point p1( p );
175  for ( typename Point::Iterator it = p1.begin(); it != p1.end(); ++it )
176  --(*it);
177  Point p2( p );
178  for ( typename Point::Iterator it = p2.begin(); it != p2.end(); ++it )
179  ++(*it);
180  typedef HyperRectDomain<Space> LocalDomain;
181  LocalDomain domain( p1, p2 );
182  for ( typename LocalDomain::ConstIterator it = domain.begin();
183  it != domain.end();
184  ++it )
185  {
186  if ( myDomain.isInside( *it ) )
187  {
188  Vector v( p - *it );
189  typename Vector::UnsignedComponent n1 = v.norm1();
190  if ( ( n1 <= maxNorm1 ) && ( n1 != 0 ) )
191  *out_it++ = *it;
192  }
193  }
194 }
195 
196 
197 
199 // Interface - public :
200 
205 template <typename Domain, Dimension maxNorm1, Dimension dimension>
206 inline
207 void
209 {
210  out << "[DomainMetricAdjacency domain="
211  << myDomain << "]";
212 }
213 
218 template <typename Domain, Dimension maxNorm1, Dimension dimension>
219 inline
220 bool
222 {
223  return true;
224 }
225 
226 
227 
229 // Implementation of inline functions //
230 
231 template <typename Domain, Dimension maxNorm1>
232 inline
233 std::ostream&
234 DGtal::deprecated::operator<< ( std::ostream & out,
235  const DomainMetricAdjacency<Domain,maxNorm1,
236  Domain::Space::dimension> & object )
237 {
238  object.selfDisplay( out );
239  return out;
240 }
241 
242 // //
244 
245