2 * This program is free software: you can redistribute it and/or modify
3 * it under the terms of the GNU Lesser General Public License as
4 * published by the Free Software Foundation, either version 3 of the
5 * License, or (at your option) any later version.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 * @file AlphaThickSegmentComputer.ih
19 * @author Bertrand Kerautret (\c kerautre@loria.fr )
20 * LORIA (CNRS, UMR 7503), University of Nancy, France
21 * @author Alexandre Faure
22 * @author Fabien Feschet
23 * @author Mohammad Said
24 * @author Jacques-Olivier Lachaud
28 * Implementation of inline methods defined in AlphaThickSegmentComputer.h
30 * This file is part of the DGtal library.
33///////////////////////////////////////////////////////////////////////////////
34// IMPLEMENTATION of inline methods.
35///////////////////////////////////////////////////////////////////////////////
37//////////////////////////////////////////////////////////////////////////////
40//////////////////////////////////////////////////////////////////////////////
44///////////////////////////////////////////////////////////////////////////////
45// Implementation of inline methods //
46///////////////////////////////////////////////////////////////////////////////
50// ----------------------- Standard services ------------------------------
53//-----------------------------------------------------------------------------
54template < typename TInputPoint, typename TConstIterator>
56DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::~AlphaThickSegmentComputer()
60//-----------------------------------------------------------------------------
61template < typename TInputPoint, typename TConstIterator>
63DGtal::AlphaThickSegmentComputer< TInputPoint,
64 TConstIterator>::AlphaThickSegmentComputer(const double maximalThickness,
65 const ThicknessDef &thicknessDefinition,
66 const double thickCompPrecision):
69 myThicknessCompPrecision = thickCompPrecision;
70 myMaximalThickness = maximalThickness;
71 myThicknessDefinition = thicknessDefinition;
72 myNbPointsAddedFromIterators = 0;
77//-----------------------------------------------------------------------------
78template < typename TInputPoint, typename TConstIterator>
80DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::
81AlphaThickSegmentComputer( const AlphaThickSegmentComputer & other ): myBegin(other.myBegin), myEnd(other.myEnd),
82 myPointContainer(other.myPointContainer),
83 myMaximalThickness(other.myMaximalThickness),
84 myThicknessCompPrecision(other.myThicknessCompPrecision),
85 myThicknessDefinition(other.myThicknessDefinition),
86 myState(other.myState),
87 myPreviousState(other.myPreviousState),
88 myIsStoringPoints(other.myIsStoringPoints),
89 myNbPointsAddedFromIterators(other.myNbPointsAddedFromIterators)
94template < typename TInputPoint, typename TConstIterator>
96DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator> &
97DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::
98operator= ( const AlphaThickSegmentComputer & other )
100 if ( this != &other )
102 myThicknessDefinition = other.myThicknessDefinition;
103 myMaximalThickness = other.myMaximalThickness;
104 myThicknessCompPrecision = other.myThicknessCompPrecision;
105 myPointContainer = other.myPointContainer;
106 myState = other.myState;
107 myPreviousState = other.myPreviousState;
108 myIsStoringPoints = other.myIsStoringPoints;
109 myNbPointsAddedFromIterators = other.myNbPointsAddedFromIterators;
110 myBegin = other.myBegin;
120//-----------------------------------------------------------------------------
121template < typename TInputPoint, typename TConstIterator>
123typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::Self
124DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getSelf() const
126 return Self(myMaximalThickness, myThicknessDefinition, myThicknessCompPrecision);
131//-----------------------------------------------------------------------------
132template < typename TInputPoint, typename TConstIterator>
134typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::Reverse
135DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getReverse() const
137 return Reverse (myMaximalThickness, myThicknessDefinition, myThicknessCompPrecision);
141template < typename TInputPoint, typename TConstIterator>
144DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::operator==( const AlphaThickSegmentComputer & other ) const{
145 return ( (myBegin == other.myBegin)
146 && (myEnd == other.myEnd) && myState.vertexSh == other.myState.vertexSh
147 && myState.edgePh == other.myState.edgePh && myState.edgeQh == other.myState.edgeQh);
151template < typename TInputPoint, typename TConstIterator>
154DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::operator!=( const AlphaThickSegmentComputer & other ) const{
155 return (!(*this == other));
159//-----------------------------------------------------------------------------
160template < typename TInputPoint, typename TConstIterator>
162typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::Size
163DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::size() const
165 return myPointContainer.size();
169//-----------------------------------------------------------------------------
170template < typename TInputPoint, typename TConstIterator>
173DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::empty() const
175 return myPointContainer.empty();
179//-----------------------------------------------------------------------------
180template < typename TInputPoint, typename TConstIterator>
182typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::ConstIterator
183DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::begin() const
190//-----------------------------------------------------------------------------
191template < typename TInputPoint, typename TConstIterator>
193typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::ConstIterator
194DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::end() const
199//-----------------------------------------------------------------------------
200template < typename TInputPoint, typename TConstIterator>
202typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::ContainerConstIterator
203DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::containerBegin() const
205 return myPointContainer.begin();
210//-----------------------------------------------------------------------------
211template < typename TInputPoint, typename TConstIterator>
213typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::ContainerConstIterator
214DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::containerEnd() const
216 return myPointContainer.end();
221//-----------------------------------------------------------------------------
222template < typename TInputPoint, typename TConstIterator>
224typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::ConvexhullConstIterator
225DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::convexhullBegin() const
227 return myState.melkmanCH.begin();
232//-----------------------------------------------------------------------------
233template < typename TInputPoint, typename TConstIterator>
235typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::ConvexhullConstIterator
236DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::convexhullEnd() const
238 return myState.melkmanCH.end();
244//-----------------------------------------------------------------------------
245template < typename TInputPoint, typename TConstIterator>
247typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::Size
248DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::max_size() const
250 return myPointContainer.max_size();
257//-----------------------------------------------------------------------------
258template < typename TInputPoint, typename TConstIterator>
261DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::
262init(const ConstIterator &it)
264 myState.melkmanCH.clear();
265 myNbPointsAddedFromIterators = 0;
266 myIsStoringPoints = false;
273//-----------------------------------------------------------------------------
274template < typename TInputPoint, typename TConstIterator>
277DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::isExtendableFront(const InputPoint &aPoint )
279 myPreviousState = myState;
280 myPointContainer.push_back(aPoint);
281 myState.melkmanCH.add(aPoint);
282 bool aResult = melkmanIsConvexValid();
283 myPointContainer.pop_back();
284 myState = myPreviousState;
290//-----------------------------------------------------------------------------
291template < typename TInputPoint, typename TConstIterator>
294DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::extendFront(const InputPoint &aPoint)
296 myPreviousState = myState;
297 myPointContainer.push_back(aPoint);
298 myState.melkmanCH.add(aPoint);
299 if (melkmanIsConvexValid()){
300 if (myPointContainer.size()==1){
301 myState.lastBack = aPoint;
303 myState.lastFront = aPoint;
306 myPointContainer.pop_back();
307 myState = myPreviousState;
312//-----------------------------------------------------------------------------
313template < typename TInputPoint, typename TConstIterator>
316DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::isExtendableFront()
318 myPreviousState = myState;
319 myState.melkmanCH.add(*myEnd);
320 bool aResult = melkmanIsConvexValid();
321 myState = myPreviousState;
327//-----------------------------------------------------------------------------
328template < typename TInputPoint, typename TConstIterator>
331DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::extendFront()
333 myPreviousState = myState;
334 myState.melkmanCH.add(*myEnd);
336 if (melkmanIsConvexValid()){
338 myState.lastBack = *myEnd;
340 myNbPointsAddedFromIterators++;
341 myState.lastFront = *myEnd;
345 myState = myPreviousState;
355//-----------------------------------------------------------------------------
356template < typename TInputPoint, typename TConstIterator>
358typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::Primitive
359DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::primitive() const
363 computeParallelStripParams(mu, vectNormal, nu);
364 return Primitive(mu,vectNormal,nu);
370//-----------------------------------------------------------------------------
371template < typename TInputPoint, typename TConstIterator>
374DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::selfDisplay(std::ostream & out) const
376 out << "[Alpha Thick Segment Computer]" << std::endl;
377 out << "Inside points: "<< std::endl;
378 for ( ConstIterator it = myPointContainer.begin(); it != myPointContainer.end(); ++it)
382 out << std::endl << "Segment thickness : " << myState.actualThickness << std::endl;
383 PointD pt1, pt2, pt3, pt4;
384 getBoundingBox(pt1, pt2, pt3, pt4);
385 out << std::endl << "Bounding box:" << pt1 << " " << pt2 << " " << pt3 << " " << pt4 << std::endl;
392//-----------------------------------------------------------------------------
393template < typename TInputPoint, typename TConstIterator>
396DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::isValid() const
398 return isNotEmpty(myBegin,myEnd);
401//-----------------------------------------------------------------------------
402template < typename TInputPoint, typename TConstIterator>
404std::pair<std::pair<TInputPoint, TInputPoint>, TInputPoint>
405DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getAntipodalLeaningPoints() const
407 std::pair<std::pair<TInputPoint, TInputPoint>, TInputPoint> r;
408 std::pair<TInputPoint, TInputPoint> edgePair;
409 edgePair.first = myState.edgePh;
410 edgePair.second = myState.edgeQh;
412 r.second = myState.vertexSh;
416//-----------------------------------------------------------------------------
417template < typename TInputPoint, typename TConstIterator>
419std::pair<TInputPoint, TInputPoint >
420DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getExtremityPoints() const
422 std::pair<TInputPoint, TInputPoint> r;
423 r.first = myState.lastBack;
424 r.second = myState.lastFront;
425 computeExtremaPoints(myState.melkmanCH.begin(), myState.melkmanCH.end() , r.first, r.second);
431//-----------------------------------------------------------------------------
432template < typename TInputPoint, typename TConstIterator>
435DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::updateMainHeightAndAntiPodal()
437 double chThickness = DGtal::functions::Hull2D::computeHullThickness(myState.melkmanCH.begin(),
438 myState.melkmanCH.end(),
439 myThicknessDefinition,
441 myState.edgeQh, myState.vertexSh);
443 return floor(chThickness / myThicknessCompPrecision + 0.5) * myThicknessCompPrecision;
450//-----------------------------------------------------------------------------
451template < typename TInputPoint, typename TConstIterator>
454DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::melkmanIsConvexValid()
456 myState.actualThickness = updateMainHeightAndAntiPodal();
457 return myState.actualThickness <= myMaximalThickness;
461template < typename TInputPoint, typename TConstIterator>
463std::vector<TInputPoint>
464DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getConvexHull() const
466 std::vector<TInputPoint> aResult;
467 for (typename DGtal::MelkmanConvexHull<TInputPoint, Functor>::ConstIterator it = myState.melkmanCH.begin();
468 it != myState.melkmanCH.end(); it++)
470 aResult.push_back(*it);
477template < typename TInputPoint, typename TConstIterator>
480DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getBoundingBoxFromExtremPoints(const InputPoint &aFirstPt,
481 const InputPoint &aLastPt,
482 PointD &pt1LongestSegment1,
483 PointD &pt2LongestSegment1,
484 PointD &pt3LongestSegment2,
485 PointD &pt4LongestSegment2,
486 double minVisibleWidthBounds) const
489 // Special case, blurred segment composed only of aligned points.
490 // In this cas the bounding box is restrained to a eplison width rectangle.
491 if(myState.actualThickness==0.0)
493 PointD vectPQ (aFirstPt[0]- aLastPt[0], aFirstPt[1]- aLastPt[1]);
494 double normPQ = vectPQ.norm();
495 PointD vectUnitPerpPQ (-vectPQ[1]/normPQ, vectPQ[0]/normPQ);
496 pt1LongestSegment1[0]= aFirstPt[0]+vectUnitPerpPQ[0]*minVisibleWidthBounds/2.0;
497 pt1LongestSegment1[1]= aFirstPt[1]+vectUnitPerpPQ[1]*minVisibleWidthBounds/2.0;
499 pt2LongestSegment1[0]= aLastPt[0]+vectUnitPerpPQ[0]*minVisibleWidthBounds/2.0;
500 pt2LongestSegment1[1]= aLastPt[1]+vectUnitPerpPQ[1]*minVisibleWidthBounds/2.0;
502 pt3LongestSegment2[0]= aLastPt[0]-vectUnitPerpPQ[0]*minVisibleWidthBounds/2.0;
503 pt3LongestSegment2[1]= aLastPt[1]-vectUnitPerpPQ[1]*minVisibleWidthBounds/2.0;
505 pt4LongestSegment2[0]= aFirstPt[0]-vectUnitPerpPQ[0]*minVisibleWidthBounds/2.0;
506 pt4LongestSegment2[1]= aFirstPt[1]-vectUnitPerpPQ[1]*minVisibleWidthBounds/2.0;
511 PointD projF, projL, projS ;
512 projectOnStraightLine<PointD>(myState.edgePh, myState.edgeQh, aFirstPt, projF);
513 projectOnStraightLine<PointD>(myState.edgePh, myState.edgeQh, aLastPt, projL);
514 projectOnStraightLine<PointD>(myState.edgePh, myState.edgeQh, myState.vertexSh, projS);
516 // Shift of the projection of PQ to define the other part of bounds.
517 PointD dep (myState.vertexSh[0]-projS[0], myState.vertexSh[1]-projS[1]);
518 PointD projF2(projF[0]+dep[0], projF[1]+dep[1] );
519 PointD projL2(projL[0]+dep[0], projL[1]+dep[1] );
521 pt1LongestSegment1[0]=projF[0];
522 pt1LongestSegment1[1]=projF[1];
524 pt2LongestSegment1[0]=projL[0];
525 pt2LongestSegment1[1]=projL[1];
527 pt3LongestSegment2[0]=projL2[0];
528 pt3LongestSegment2[1]=projL2[1];
530 pt4LongestSegment2[0]=projF2[0];
531 pt4LongestSegment2[1]=projF2[1];
533 // check orientation of resulting sequence of vertex
534 PointD v1 = pt1LongestSegment1 - pt2LongestSegment1;
535 PointD v2 = pt3LongestSegment2 - pt2LongestSegment1;
536 double orient = v1[0]*v2[1]-v1[1]*v2[0];
539 std::swap(pt1LongestSegment1, pt4LongestSegment2);
540 std::swap(pt2LongestSegment1, pt3LongestSegment2);
552template < typename TInputPoint, typename TConstIterator>
555DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getBoundingBox(PointD &pt1LongestSegment1,
556 PointD &pt2LongestSegment1,
557 PointD &pt3LongestSegment2,
558 PointD &pt4LongestSegment2 ) const
560 // handle special case with only one point
561 if (getNumberSegmentPoints() == 1)
563 TInputPoint p = myState.lastFront;
564 pt1LongestSegment1[0]= p[0]+myMaximalThickness/2.0;
565 pt1LongestSegment1[1]= p[1]+myMaximalThickness/2.0;
566 pt2LongestSegment1[0]= p[0]+myMaximalThickness/2.0;
567 pt2LongestSegment1[1]= p[1]-myMaximalThickness/2.0;
568 pt3LongestSegment2[0]= p[0]-myMaximalThickness/2.0;
569 pt3LongestSegment2[1]= p[1]-myMaximalThickness/2.0;
570 pt4LongestSegment2[0]= p[0]-myMaximalThickness/2.0;
571 pt4LongestSegment2[1]= p[1]+myMaximalThickness/2.0;
574 InputPoint fp = myState.lastBack;
575 InputPoint lp = myState.lastFront;
576 getBoundingBoxFromExtremPoints(fp, lp, pt1LongestSegment1, pt2LongestSegment1,
577 pt3LongestSegment2, pt4LongestSegment2, myMaximalThickness);
579 if(myState.actualThickness==0.0)
584 InputPoint extremF = myState.lastFront;
585 InputPoint extremL = myState.lastBack;
587 computeExtremaPoints(myState.melkmanCH.begin(), myState.melkmanCH.end() , extremL, extremF);
588 getBoundingBoxFromExtremPoints(extremF, extremL, pt1LongestSegment1, pt2LongestSegment1,
589 pt3LongestSegment2, pt4LongestSegment2, myMaximalThickness);
594template < typename TInputPoint, typename TConstIterator>
597DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::className() const
599 return "AlphaThickSegment";
604template < typename TInputPoint, typename TConstIterator>
607DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getSegmentLength() const
609 PointD pt1, pt2, pt3, pt4;
610 getBoundingBox(pt1, pt2, pt3, pt4);
611 return (pt2-pt1).norm();
616template < typename TInputPoint, typename TConstIterator>
619DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::computeParallelStripParams(double &mu,
623 PointD dirSeg = myState.edgeQh - myState.edgePh;
626 mu = (N[0]*myState.edgePh[0]+N[1]*myState.edgePh[1]);
627 nu = N[0]*myState.vertexSh[0]+N[1]*myState.vertexSh[1] - mu;
631template < typename TInputPoint, typename TConstIterator>
634DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getThickness() const
636 return myState.actualThickness;
640template < typename TInputPoint, typename TConstIterator>
642typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::PointD
643DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getNormal() const
645 return primitive().normal();
649template < typename TInputPoint, typename TConstIterator>
652DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getMu() const
654 return primitive().mu();
658template < typename TInputPoint, typename TConstIterator>
661 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getNu() const
663 return primitive().nu();
667template < typename TInputPoint, typename TConstIterator>
670DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::isStoringSegmentPoints() const
672 return myIsStoringPoints;
677template < typename TInputPoint, typename TConstIterator>
680DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getNumberSegmentPoints() const
682 return static_cast<unsigned int>(myNbPointsAddedFromIterators+myPointContainer.size());
687template < typename TInputPoint, typename TConstIterator>
688template<typename TPoint, typename TPointD>
691DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::projectOnStraightLine(const TPoint & ptA,
694 TPointD & ptProjected) const
707 TPointD vAB (ptB[0]- ptA[0], ptB[1]- ptA[1]);
708 PointD vABn ((double)vAB[0], (double)vAB[1]);
709 vABn = vABn/vABn.norm();
710 PointD vAC (ptC[0]-ptA[0], ptC[1]-ptA[1]);
711 double distPtA_Proj = vAC.dot(vABn);
713 ptProjected[0]= ptA[0]+vABn[0]*(distPtA_Proj);
714 ptProjected[1] = ptA[1]+vABn[1]*(distPtA_Proj);
716 return distPtA_Proj>=0 && ((ptA[0]<ptB[0] && ptProjected[0]<=ptB[0] ) ||
717 (ptA[0]>ptB[0] && ptProjected[0]>=ptB[0] ) ||
718 (ptA[0]==ptB[0] && ptA[1]<ptB[1] && ptProjected[1]<=ptB[1]) ||
719 (ptA[0]==ptB[0] && ptA[1]>=ptB[1] && ptProjected[1]>=ptB[1]));
724template< typename TInputPoint, typename TConstIterator>
725template<typename TConstIteratorG>
727DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::
728computeExtremaPoints(const TConstIteratorG & itBegin,
729 const TConstIteratorG & itEnd,
730 InputPoint & aFirstExtrPt,
731 InputPoint & aLastExtrPt) const
733 // To be changed with saved point added by push front/push back
734 InputPoint extremF = myState.lastBack;
735 InputPoint extremL = myState.lastFront;
740 projectOnStraightLine(myState.edgePh, myState.edgeQh, extremF, projExtremF);
741 projectOnStraightLine(myState.edgePh, myState.edgeQh, extremL, projExtremL);
743 InputPoint peF = InputPoint(projExtremF, functors::Round<>());
744 InputPoint peL = InputPoint(projExtremL, functors::Round<>());
746 for(TConstIteratorG it = itBegin; it != itEnd; it++)
749 PointD projPointEnvConv;
750 bool isNewExtrema = !projectOnStraightLine(peF, peL, p, projPointEnvConv);
753 double distFirst = (projPointEnvConv-projExtremF).norm();
754 double distLast = (projPointEnvConv- projExtremL).norm();
755 if(distFirst>= distLast)
758 peL = InputPoint( projPointEnvConv, functors::Round<>());
763 peF = InputPoint( projPointEnvConv, functors::Round<>());
771///////////////////////////////////////////////////////////////////////////////
772// Implementation of inline functions and external operators //
775 * Overloads 'operator<<' for displaying objects of class 'AlphaThickSegmentComputer'.
776 * @param out the output stream where the object is written.
777 * @param object the object of class 'AlphaThickSegmentComputer' to write.
778 * @return the output stream after the writing.
780template < typename TInputPoint, typename TConstIterator>
783DGtal::operator<< ( std::ostream & out,
784 const AlphaThickSegmentComputer< TInputPoint, TConstIterator> & object )
786 object.selfDisplay ( out );
791///////////////////////////////////////////////////////////////////////////////