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 //-----------------------------------------------------------------------------
54 template < typename TInputPoint, typename TConstIterator>
56 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::~AlphaThickSegmentComputer()
60 //-----------------------------------------------------------------------------
61 template < typename TInputPoint, typename TConstIterator>
63 DGtal::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 //-----------------------------------------------------------------------------
78 template < typename TInputPoint, typename TConstIterator>
80 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::
81 AlphaThickSegmentComputer( 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)
94 template < typename TInputPoint, typename TConstIterator>
96 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator> &
97 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::
98 operator= ( 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 //-----------------------------------------------------------------------------
121 template < typename TInputPoint, typename TConstIterator>
123 typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::Self
124 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getSelf() const
126 return Self(myMaximalThickness, myThicknessDefinition, myThicknessCompPrecision);
131 //-----------------------------------------------------------------------------
132 template < typename TInputPoint, typename TConstIterator>
134 typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::Reverse
135 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getReverse() const
137 return Reverse (myMaximalThickness, myThicknessDefinition, myThicknessCompPrecision);
141 template < typename TInputPoint, typename TConstIterator>
144 DGtal::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);
151 template < typename TInputPoint, typename TConstIterator>
154 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::operator!=( const AlphaThickSegmentComputer & other ) const{
155 return (!(*this == other));
159 //-----------------------------------------------------------------------------
160 template < typename TInputPoint, typename TConstIterator>
162 typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::Size
163 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::size() const
165 return myPointContainer.size();
169 //-----------------------------------------------------------------------------
170 template < typename TInputPoint, typename TConstIterator>
173 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::empty() const
175 return myPointContainer.empty();
179 //-----------------------------------------------------------------------------
180 template < typename TInputPoint, typename TConstIterator>
182 typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::ConstIterator
183 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::begin() const
190 //-----------------------------------------------------------------------------
191 template < typename TInputPoint, typename TConstIterator>
193 typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::ConstIterator
194 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::end() const
199 //-----------------------------------------------------------------------------
200 template < typename TInputPoint, typename TConstIterator>
202 typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::ContainerConstIterator
203 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::containerBegin() const
205 return myPointContainer.begin();
210 //-----------------------------------------------------------------------------
211 template < typename TInputPoint, typename TConstIterator>
213 typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::ContainerConstIterator
214 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::containerEnd() const
216 return myPointContainer.end();
221 //-----------------------------------------------------------------------------
222 template < typename TInputPoint, typename TConstIterator>
224 typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::ConvexhullConstIterator
225 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::convexhullBegin() const
227 return myState.melkmanCH.begin();
232 //-----------------------------------------------------------------------------
233 template < typename TInputPoint, typename TConstIterator>
235 typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::ConvexhullConstIterator
236 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::convexhullEnd() const
238 return myState.melkmanCH.end();
244 //-----------------------------------------------------------------------------
245 template < typename TInputPoint, typename TConstIterator>
247 typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::Size
248 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::max_size() const
250 return myPointContainer.max_size();
257 //-----------------------------------------------------------------------------
258 template < typename TInputPoint, typename TConstIterator>
261 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::
262 init(const ConstIterator &it)
264 myState.melkmanCH.clear();
265 myNbPointsAddedFromIterators = 0;
266 myIsStoringPoints = false;
273 //-----------------------------------------------------------------------------
274 template < typename TInputPoint, typename TConstIterator>
277 DGtal::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 //-----------------------------------------------------------------------------
291 template < typename TInputPoint, typename TConstIterator>
294 DGtal::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 //-----------------------------------------------------------------------------
313 template < typename TInputPoint, typename TConstIterator>
316 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::isExtendableFront()
318 myPreviousState = myState;
319 myState.melkmanCH.add(*myEnd);
320 bool aResult = melkmanIsConvexValid();
321 myState = myPreviousState;
327 //-----------------------------------------------------------------------------
328 template < typename TInputPoint, typename TConstIterator>
331 DGtal::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 //-----------------------------------------------------------------------------
356 template < typename TInputPoint, typename TConstIterator>
358 typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::Primitive
359 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::primitive() const
363 computeParallelStripParams(mu, vectNormal, nu);
364 return Primitive(mu,vectNormal,nu);
370 //-----------------------------------------------------------------------------
371 template < typename TInputPoint, typename TConstIterator>
374 DGtal::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 //-----------------------------------------------------------------------------
393 template < typename TInputPoint, typename TConstIterator>
396 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::isValid() const
398 return isNotEmpty(myBegin,myEnd);
401 //-----------------------------------------------------------------------------
402 template < typename TInputPoint, typename TConstIterator>
404 std::pair<std::pair<TInputPoint, TInputPoint>, TInputPoint>
405 DGtal::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 //-----------------------------------------------------------------------------
417 template < typename TInputPoint, typename TConstIterator>
419 std::pair<TInputPoint, TInputPoint >
420 DGtal::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 //-----------------------------------------------------------------------------
432 template < typename TInputPoint, typename TConstIterator>
435 DGtal::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 //-----------------------------------------------------------------------------
451 template < typename TInputPoint, typename TConstIterator>
454 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::melkmanIsConvexValid()
456 myState.actualThickness = updateMainHeightAndAntiPodal();
457 return myState.actualThickness <= myMaximalThickness;
461 template < typename TInputPoint, typename TConstIterator>
463 std::vector<TInputPoint>
464 DGtal::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);
477 template < typename TInputPoint, typename TConstIterator>
480 DGtal::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);
552 template < typename TInputPoint, typename TConstIterator>
555 DGtal::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);
594 template < typename TInputPoint, typename TConstIterator>
597 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::className() const
599 return "AlphaThickSegment";
604 template < typename TInputPoint, typename TConstIterator>
607 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getSegmentLength() const
609 PointD pt1, pt2, pt3, pt4;
610 getBoundingBox(pt1, pt2, pt3, pt4);
611 return (pt2-pt1).norm();
616 template < typename TInputPoint, typename TConstIterator>
619 DGtal::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;
631 template < typename TInputPoint, typename TConstIterator>
634 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getThickness() const
636 return myState.actualThickness;
640 template < typename TInputPoint, typename TConstIterator>
642 typename DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::PointD
643 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getNormal() const
645 return primitive().normal();
649 template < typename TInputPoint, typename TConstIterator>
652 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getMu() const
654 return primitive().mu();
658 template < typename TInputPoint, typename TConstIterator>
661 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getNu() const
663 return primitive().nu();
667 template < typename TInputPoint, typename TConstIterator>
670 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::isStoringSegmentPoints() const
672 return myIsStoringPoints;
677 template < typename TInputPoint, typename TConstIterator>
680 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::getNumberSegmentPoints() const
682 return static_cast<unsigned int>(myNbPointsAddedFromIterators+myPointContainer.size());
687 template < typename TInputPoint, typename TConstIterator>
688 template<typename TPoint, typename TPointD>
691 DGtal::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]));
724 template< typename TInputPoint, typename TConstIterator>
725 template<typename TConstIteratorG>
727 DGtal::AlphaThickSegmentComputer< TInputPoint, TConstIterator>::
728 computeExtremaPoints(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.
780 template < typename TInputPoint, typename TConstIterator>
783 DGtal::operator<< ( std::ostream & out,
784 const AlphaThickSegmentComputer< TInputPoint, TConstIterator> & object )
786 object.selfDisplay ( out );
791 ///////////////////////////////////////////////////////////////////////////////