00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef OLENA_IO_SE_NEIGHBORHOOD_HH
00029 # define OLENA_IO_SE_NEIGHBORHOOD_HH
00030
00031 # include <oln/core/image2d.hh>
00032 # include <oln/core/neighborhood2d.hh>
00033 # include <oln/core/macros.hh>
00034 # include <oln/io/image.hh>
00035
00036 namespace oln {
00037
00038 namespace io {
00039
00040 namespace internal {
00041
00048 inline bool
00049 read(neighborhood2d& output, const std::string& name)
00050 {
00051 image2d<ntg::bin> im;
00052 if (!read(im, name))
00053 return false;
00054
00055 if (!(im.ncols() % 2) || !(im.nrows() % 2))
00056 {
00057
00058
00059 return false;
00060 }
00061 image2d<ntg::bin>::fwd_iter_type it(im);
00062 neighborhood2d w;
00063 dpoint2d dcenter = dpoint2d(im.nrows()/2, im.ncols()/2);
00064 for_all (it)
00065 {
00066 if (it.row() == im.nrows()/2 && it.col() == im.ncols()/2+1)
00067 break;
00068 if (im[it])
00069 {
00070 dpoint2d dp = dpoint2d(it) - dcenter;
00071 if (dp.is_centered()) return false;
00072 w.add(dp);
00073 }
00074 }
00075 for_all_remaining (it)
00076 {
00077 point2d p = it - dcenter;
00078 point2d inv_p = -p + dcenter;
00079 if (im[it] != im[inv_p])
00080 {
00081
00082
00083 return false;
00084 }
00085 }
00086 output = w;
00087 return true;
00088 }
00089
00096 inline bool
00097 write(const neighborhood2d& input, const std::string& name)
00098 {
00099 image2d<ntg::bin> im(input.delta()*2+1, input.delta()*2+1);
00100 image2d<ntg::bin>::fwd_iter_type it(im);
00101 for_all (it) im[it] = false;
00102 for (unsigned i = 0; i < input.card(); ++i)
00103 im[point2d(input.delta(),input.delta()) + input.dp(i)] = true;
00104 if (!write(im, name))
00105 return false;
00106 return true;
00107 }
00108
00109 }
00110
00111 }
00112
00113 }
00114
00115 #endif // OLENA_IO_SE_NEIGHBORHOOD_HH