https://svn.lrde.epita.fr/svn/oln/trunk/milena
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Have win::disk2d and win::sphere3d (new) rely on win::ball.
* mln/win/ball.hh: New.
(diameter): New method; replace both...
(disk2d::length): ...this and...
(ball3d::length): ...this.
* mln/win/ball3d.hh: Rename as...
* mln/win/sphere3d.hh: ...this.
(ball3d): Remove; replace by...
(sphere3d): ...this new typedef.
* mln/win/disk2d.hh (disk2d): Remove; replace by...
(disk2d): ...this new typedef.
* mln/win/all.hh (Copyright): Fix.
(include): Update.
* tests/win/ball.cc: New.
* tests/win/sphere3d.cc: New.
* tests/win/disk2d.cc: Remove echo.
* tests/win/Makefile.am: Update.
mln/win/all.hh | 5 +
mln/win/ball.hh | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++
mln/win/disk2d.hh | 78 ++------------------------
mln/win/sphere3d.hh | 86 +++-------------------------
tests/win/Makefile.am | 4 +
tests/win/ball.cc | 53 +++++++++++++++++
tests/win/disk2d.cc | 9 ---
tests/win/sphere3d.cc | 42 ++++++++++++++
8 files changed, 271 insertions(+), 156 deletions(-)
Index: mln/win/all.hh
--- mln/win/all.hh (revision 3458)
+++ mln/win/all.hh (working copy)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007, 2008 EPITA, 2009 Research and Development
+// Copyright (C) 2007, 2008, 2009 EPITA Research and Development
// Laboratory (LRDE)
//
// This file is part of the Olena Library. This library is free
@@ -46,7 +46,7 @@
// Types.
# include <mln/win/backdiag2d.hh>
-# include <mln/win/ball3d.hh>
+# include <mln/win/ball.hh>
# include <mln/win/cube3d.hh>
# include <mln/win/cuboid3d.hh>
# include <mln/win/diag2d.hh>
@@ -58,6 +58,7 @@
# include <mln/win/octagon2d.hh>
# include <mln/win/rectangle2d.hh>
# include <mln/win/segment1d.hh>
+# include <mln/win/sphere3d.hh>
# include <mln/win/vline2d.hh>
// Routines.
Index: mln/win/ball.hh
--- mln/win/ball.hh (revision 0)
+++ mln/win/ball.hh (revision 0)
@@ -0,0 +1,150 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_WIN_BALL_HH
+# define MLN_WIN_BALL_HH
+
+/// \file mln/win/ball.hh
+///
+/// Definition of the mln::win::ball window.
+
+# include <mln/core/internal/classical_window_base.hh>
+# include <mln/core/dpoint.hh>
+# include <mln/core/site_set/box.hh>
+# include <mln/fun/i2v/all_to.hh>
+
+
+namespace mln
+{
+
+ // Forward declaration.
+ namespace win { template <typename G, typename C> struct ball; }
+
+
+ namespace trait
+ {
+
+ template <typename G, typename C>
+ struct window_< mln::win::ball<G,C> > : classical_window_
+ {
+ };
+
+ } // end of namespace trait
+
+
+
+ namespace win
+ {
+
+ /*! \brief Generic ball window defined on a given grid.
+ *
+ * A ball is centered and symmetric; so its diameter is odd.
+ *
+ * G is the given grid on which the ball is defined and C is the
+ * type of coordinates.
+ */
+ template <typename G, typename C>
+ struct ball : public internal::classical_window_base< dpoint<G,C>,
ball<G,C> >
+ {
+
+ /// Constructor.
+ /// \param[in] diameter Diameter of the ball.
+ /// \pre \p diameter is odd.
+ ball(unsigned diameter);
+
+ /// Give the ball diameter.
+ unsigned diameter() const;
+
+ /// Give the maximum coordinate gap between the window
+ /// center and a window point.
+ unsigned delta_() const;
+
+ void print_(std::ostream& ostr) const;
+
+ protected:
+ unsigned diameter_;
+ };
+
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+
+ template <typename G, typename C>
+ inline
+ ball<G,C>::ball(unsigned diameter)
+ : diameter_(diameter)
+ {
+ mln_precondition(diameter % 2 == 1);
+ int
+ radius = diameter / 2,
+ sqr_radius = radius * radius;
+ typedef point<G,C> P;
+ box<P> b(all_to(-radius), all_to(+radius));
+ P O = literal::origin;
+ mln_piter(box<P>) p(b);
+ for_all(p)
+ {
+ unsigned d = 0;
+ for (unsigned i = 0; i < P::dim; ++i)
+ d += p[i] * p[i];
+ if (d <= sqr_radius)
+ this->insert(p - O);
+ }
+ }
+
+ template <typename G, typename C>
+ inline
+ unsigned ball<G,C>::diameter() const
+ {
+ return diameter_;
+ }
+
+ template <typename G, typename C>
+ inline
+ unsigned ball<G,C>::delta_() const
+ {
+ return diameter_ / 2;
+ }
+
+ template <typename G, typename C>
+ inline
+ void
+ ball<G,C>::print_(std::ostream& ostr) const
+ {
+ ostr << "[ball: diameter=" << diameter_ <<
']';
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::win
+
+} // end of namespace mln
+
+
+
+#endif // ! MLN_WIN_BALL_HH
Index: mln/win/sphere3d.hh
--- mln/win/sphere3d.hh (revision 3457)
+++ mln/win/sphere3d.hh (working copy)
@@ -26,94 +26,28 @@
// reasons why the executable file might be covered by the GNU General
// Public License.
-#ifndef MLN_WIN_BALL3D_HH
-# define MLN_WIN_BALL3D_HH
+#ifndef MLN_WIN_SPHERE3D_HH
+# define MLN_WIN_SPHERE3D_HH
-/// \file mln/win/ball3d.hh
+/// \file mln/win/sphere3d.hh
///
-/// Definition of the mln::win::ball3d window.
+/// Definition of the mln::win::sphere3d window.
-# include <mln/core/internal/classical_window_base.hh>
+# include <mln/win/ball.hh>
# include <mln/core/alias/dpoint3d.hh>
namespace mln
{
- mln_internal_add_classical_window_trait(ball3d);
-
-
namespace win
{
- /*! \brief Ball (sphere) window defined on the 3D square grid.
- *
- * A ball3d is centered and symmetric.
- *
- */
- struct ball3d : public internal::classical_window_base< dpoint3d, ball3d >
- {
- /*! \brief Constructor.
- *
- * \param[in] length Length, thus diameter.
- *
- */
- ball3d(unsigned length);
-
- /*! \brief Give the disk diameter.
- */
- unsigned length() const;
-
- /*! \brief Give the maximum coordinate gap between the window
- * center and a window point.
- */
- unsigned delta_() const;
-
- void print_(std::ostream& ostr) const;
-
- protected:
- unsigned length_;
- };
-
-
-
-# ifndef MLN_INCLUDE_ONLY
-
- inline
- ball3d::ball3d(unsigned length)
- : length_(length)
- {
- mln_precondition(length % 2 == 1);
- const def::coord
- r = static_cast<def::coord>(length / 2),
- minus_r = static_cast<def::coord>(-r),
- r2 = static_cast<def::coord>(r * r);
- for (def::coord a = minus_r; a <= r; ++a)
- for (def::coord b = minus_r; b <= r; ++b)
- for (def::coord c = minus_r; c <= r; ++c)
- if (a * a + b * b + c * c <= r2)
- insert(dpoint3d(a, b, c));
- }
-
- inline
- unsigned ball3d::length() const
- {
- return length_;
- }
-
- inline
- unsigned ball3d::delta_() const
- {
- return length_ / 2;
- }
-
- inline
- void ball3d::print_(std::ostream& ostr) const
- {
- ostr << "[ball3d: length=" << length_ << ']';
- }
+ /// 3D sphere window; precisely, ball-shaped window defined on the
+ /// 3D cubic grid.
+ //
+ typedef ball<grid::cube, def::coord> sphere3d;
-# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln::win
@@ -121,4 +55,4 @@
-#endif // ! MLN_WIN_BALL3D_HH
+#endif // ! MLN_WIN_SPHERE3D_HH
Index: mln/win/disk2d.hh
--- mln/win/disk2d.hh (revision 3458)
+++ mln/win/disk2d.hh (working copy)
@@ -1,5 +1,5 @@
-// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory
-// (LRDE)
+// Copyright (C) 2007, 2008, 2009 EPITA Research and Development
+// Laboratory (LRDE)
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
@@ -33,86 +33,22 @@
///
/// Definition of the mln::win::disk2d window.
-# include <mln/core/internal/classical_window_base.hh>
+# include <mln/win/ball.hh>
# include <mln/core/alias/dpoint2d.hh>
namespace mln
{
- mln_internal_add_classical_window_trait(disk2d);
-
namespace win
{
- /*! \brief Disk window defined on the 2D square grid.
- *
- * A disk2d is centered and symmetric.
- *
- */
- struct disk2d : public internal::classical_window_base< dpoint2d, disk2d >
- {
- /*! \brief Constructor.
- *
- * \param[in] length Length, thus diameter.
- *
- */
- disk2d(unsigned length);
-
- /*! \brief Give the disk diameter.
- */
- unsigned length() const;
-
- /*! \brief Give the maximum coordinate gap between the window
- * center and a window point.
- */
- unsigned delta_() const;
-
- void print_(std::ostream& ostr) const;
-
- protected:
- unsigned length_;
- };
-
-
-
-# ifndef MLN_INCLUDE_ONLY
-
- inline
- disk2d::disk2d(unsigned length)
- : length_(length)
- {
- mln_precondition(length % 2 == 1);
- const def::coord
- r = static_cast<def::coord>(length / 2),
- minus_r = static_cast<def::coord>(-r),
- r2 = static_cast<def::coord>(r * r);
- for (def::coord a = minus_r; a <= r; ++a)
- for (def::coord b = minus_r; b <= r; ++b)
- if (a * a + b * b <= r2)
- insert(dpoint2d(a, b));
- }
-
- inline
- unsigned disk2d::length() const
- {
- return length_;
- }
-
- inline
- unsigned disk2d::delta_() const
- {
- return length_ / 2;
- }
-
- inline
- void disk2d::print_(std::ostream& ostr) const
- {
- ostr << "[disk2d: length=" << length_ << ']';
- }
+ /// 2D disk window; precisely, ball-shaped window defined on the
+ /// 2D square grid.
+ //
+ typedef ball<grid::square, def::coord> disk2d;
-# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln::win
Index: tests/win/ball.cc
--- tests/win/ball.cc (revision 0)
+++ tests/win/ball.cc (revision 0)
@@ -0,0 +1,53 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+/// \file tests/win/ball.cc
+///
+/// Tests on mln::win::ball.
+
+#include <mln/win/ball.hh>
+#include <mln/convert/to_image.hh>
+#include <mln/debug/println.hh>
+
+
+int main()
+{
+ using namespace mln;
+
+ win::ball<grid::square, def::coord> b(7);
+ mln_assertion(b.delta() == 3);
+ mln_assertion(b.size() == 29);
+
+ debug::println(convert::to_image(b));
+ // - - - | - - -
+ // - | | | | | -
+ // - | | | | | -
+ // | | | | | | |
+ // - | | | | | -
+ // - | | | | | -
+ // - - - | - - -
+}
Index: tests/win/sphere3d.cc
--- tests/win/sphere3d.cc (revision 0)
+++ tests/win/sphere3d.cc (revision 0)
@@ -0,0 +1,42 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+/// \file tests/win/sphere3d.cc
+///
+/// Tests on mln::win::sphere3d.
+
+#include <mln/win/sphere3d.hh>
+
+
+int main()
+{
+ using namespace mln;
+
+ win::sphere3d s(3);
+ mln_assertion(s.delta() == 1);
+ mln_assertion(s.size() == 7);
+}
Index: tests/win/disk2d.cc
--- tests/win/disk2d.cc (revision 3458)
+++ tests/win/disk2d.cc (working copy)
@@ -1,5 +1,5 @@
-// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory
-// (LRDE)
+// Copyright (C) 2007, 2008, 2009 EPITA Research and Development
+// Laboratory (LRDE)
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
@@ -31,10 +31,7 @@
/// Tests on mln::win::disk2d.
#include <cmath>
-
#include <mln/win/disk2d.hh>
-#include <mln/convert/to_image.hh>
-#include <mln/debug/println.hh>
int main()
@@ -56,6 +53,4 @@
std::abs(x) > 27 ||
std::abs(y) > 27);
}
-
- debug::println(convert::to_image(disk));
}
Index: tests/win/Makefile.am
--- tests/win/Makefile.am (revision 3458)
+++ tests/win/Makefile.am (working copy)
@@ -4,6 +4,7 @@
check_PROGRAMS = \
backdiag2d \
+ ball \
cube3d \
cuboid3d \
diag2d \
@@ -15,10 +16,12 @@
rectangle2d \
segment1d \
shift \
+ sphere3d \
sym \
vline2d
backdiag2d_SOURCES = backdiag2d.cc
+ball_SOURCES = ball.cc
cube3d_SOURCES = cube3d.cc
cuboid3d_SOURCES = cuboid3d.cc
diag2d_SOURCES = diag2d.cc
@@ -30,6 +33,7 @@
rectangle2d_SOURCES = rectangle2d.cc
segment1d_SOURCES = segment1d.cc
shift_SOURCES = shift.cc
+sphere3d_SOURCES = sphere3d.cc
sym_SOURCES = sym.cc
vline2d_SOURCES = vline2d.cc