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/>.
19 * @author Jocelyn Meyron (\c jocelyn.meyron@liris.cnrs.fr )
20 * Laboratoire d'InfoRmatique en Image et Systemes d'information - LIRIS (CNRS, UMR 5205), CNRS, France
24 * Implementation of inline methods defined in PlaneProbingEstimatorHelper.h
26 * This file is part of the DGtal library.
30 //////////////////////////////////////////////////////////////////////////////
32 //////////////////////////////////////////////////////////////////////////////
34 ///////////////////////////////////////////////////////////////////////////////
35 // IMPLEMENTATION of inline functions.
36 ///////////////////////////////////////////////////////////////////////////////
38 // ------------------------------------------------------------------------
39 template < typename Point >
41 typename Point::Coordinate
42 DGtal::detail::squaredNorm (Point const& aPoint)
44 using Integer = typename Point::Coordinate;
45 Integer res = DGtal::NumberTraits<Integer>::ZERO;
47 for (typename Point::Dimension i = 0; i < aPoint.size(); ++i)
49 res += aPoint[i] * aPoint[i];
55 // ------------------------------------------------------------------------
56 template < int N, typename T >
59 DGtal::detail::determinant (const T aMatrix[N][N])
61 DGtal::SimpleMatrix<T, N, N> m;
63 for (int i = 0; i < N; ++i)
65 for (int j = 0; j < N; ++j)
67 m.setComponent(i, j, aMatrix[i][j]);
71 return m.determinant();
74 // ------------------------------------------------------------------------
75 template < typename Point >
77 typename Point::Coordinate
78 DGtal::detail::distToSphere (std::array<Point, 5> const& aPoints)
80 using Integer = typename Point::Coordinate;
81 Integer one = DGtal::NumberTraits<Integer>::ONE,
82 zero = DGtal::NumberTraits<Integer>::ZERO;
84 Integer M0[4][4] = { { aPoints[0][0], aPoints[0][1], aPoints[0][2], one },
85 { aPoints[1][0], aPoints[1][1], aPoints[1][2], one },
86 { aPoints[2][0], aPoints[2][1], aPoints[2][2], one },
87 { aPoints[3][0], aPoints[3][1], aPoints[3][2], one } };
89 if ( DGtal::detail::determinant<4, Integer>(M0) == zero)
91 throw std::runtime_error("4 coplanar points in distToSphere");
93 Integer M[5][5] = { { aPoints[0][0], aPoints[0][1], aPoints[0][2], squaredNorm(aPoints[0]), one },
94 { aPoints[1][0], aPoints[1][1], aPoints[1][2], squaredNorm(aPoints[1]), one },
95 { aPoints[2][0], aPoints[2][1], aPoints[2][2], squaredNorm(aPoints[2]), one },
96 { aPoints[3][0], aPoints[3][1], aPoints[3][2], squaredNorm(aPoints[3]), one },
97 { aPoints[4][0], aPoints[4][1], aPoints[4][2], squaredNorm(aPoints[4]), one } };
98 return DGtal::detail::determinant<5, Integer>(M);
101 // ------------------------------------------------------------------------
102 template < typename Point >
105 DGtal::detail::isBasisReduced (Point const& aU, Point const& aV)
107 Point w = aU + aV, x = aU - aV;
108 return (squaredNorm(aU) <= squaredNorm(w)) &&
109 (squaredNorm(aU) <= squaredNorm(x)) &&
110 (squaredNorm(aV) <= squaredNorm(w)) &&
111 (squaredNorm(aV) <= squaredNorm(x));
114 ///////////////////////////////////////////////////////////////////////////////
115 // IMPLEMENTATION of inline methods.
116 ///////////////////////////////////////////////////////////////////////////////
118 ///////////////////////////////////////////////////////////////////////////////
119 // ----------------------- Standard services ------------------------------
121 // ------------------------------------------------------------------------
122 template < typename Integer >
124 DGtal::detail::PointOnProbingRay<Integer>::
125 PointOnProbingRay (Permutation const& aSigma, Integer const& aIndex)
126 : mySigma(aSigma), myIndex(aIndex)
131 // ------------------------------------------------------------------------
132 template < typename Integer >
134 DGtal::detail::PointOnProbingRay<Integer>
135 DGtal::detail::PointOnProbingRay<Integer>::getBase () const
137 return PointOnProbingRay(mySigma, 0);
140 // ------------------------------------------------------------------------
141 template < typename Integer >
143 typename DGtal::detail::PointOnProbingRay<Integer>::Permutation const&
144 DGtal::detail::PointOnProbingRay<Integer>::sigma () const
149 // ------------------------------------------------------------------------
150 template < typename Integer >
153 DGtal::detail::PointOnProbingRay<Integer>::sigma (int aIndex) const
155 assert(aIndex >= 0 && aIndex <= 2);
156 return mySigma[aIndex];
159 // ------------------------------------------------------------------------
160 template < typename Integer >
163 DGtal::detail::PointOnProbingRay<Integer>::index () const
168 // ------------------------------------------------------------------------
169 template < typename Integer >
172 DGtal::detail::PointOnProbingRay<Integer>::operator== (PointOnProbingRay const& aRay) const
174 return (mySigma == aRay.mySigma) && (myIndex == aRay.index());
178 // ------------------------------------------------------------------------
179 template < typename Integer >
182 DGtal::detail::PointOnProbingRay<Integer>::operator!= (PointOnProbingRay const& aRay) const
184 return !(*this == aRay);
187 // ------------------------------------------------------------------------
188 template < typename Integer >
191 DGtal::detail::PointOnProbingRay<Integer>::operator<= (PointOnProbingRay const& aRay) const
193 return (mySigma == aRay.mySigma) && (myIndex <= aRay.index());
196 // ------------------------------------------------------------------------
197 template < typename Integer >
199 DGtal::detail::PointOnProbingRay<Integer>
200 DGtal::detail::PointOnProbingRay<Integer>::next (Integer const& aInc) const
202 return PointOnProbingRay(mySigma, myIndex + aInc);
205 // ------------------------------------------------------------------------
206 template < typename Integer >
208 DGtal::detail::PointOnProbingRay<Integer>
209 DGtal::detail::PointOnProbingRay<Integer>::previous (Integer const& aDec) const
211 return PointOnProbingRay(mySigma, myIndex - aDec);
214 // ------------------------------------------------------------------------
215 template < typename Integer >
218 DGtal::detail::operator<< (std::ostream& aOs, PointOnProbingRay<Integer> const& aRay)
221 aRay.sigma(0) << ", " <<
222 aRay.sigma(1) << ", " <<
223 aRay.sigma(2) << "); i=" << aRay.index();