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_LEVEL_SET_LEVEL_HH
00029 # define OLENA_LEVEL_SET_LEVEL_HH
00030
00031 # include <oln/core/box.hh>
00032 # include <oln/core/dpoint2d.hh>
00033
00034 namespace oln {
00035
00036 namespace level {
00037
00038
00081 template <class I>
00082 void
00083 set_level(abstract::image_with_dim<2,I>& inout,
00084 const oln_point_type(I)& p1,
00085 const oln_point_type(I)& p2,
00086 oln_value_type(I) level)
00087 {
00088 int iRow1 = p1.row();
00089 int iCol1 = p1.col();
00090 int iRow2 = p2.row();
00091 int iCol2 = p2.col();
00092 int dRow = ( iRow2 > iRow1 ? iRow2 - iRow1 : iRow1 - iRow2 );
00093 int ddRow = 2 * dRow;
00094 int dCol = ( iCol2 > iCol1 ? iCol2 - iCol1 : iCol1 - iCol2 );
00095 int ddCol = 2 * dCol;
00096 int sRow = ( iRow2 != iRow1 ? ( iRow2 > iRow1 ? 1 : -1 ) : 0 );
00097 int sCol = ( iCol2 != iCol1 ? ( iCol2 > iCol1 ? 1 : -1 ) : 0 );
00098 int i, e;
00099 int iRow = iRow1;
00100 int iCol = iCol1;
00101
00102 if ( dCol > dRow )
00103 {
00104 e = ddRow - dCol;
00105 for ( i = 0; i < dCol; ++i )
00106 {
00107 inout(iRow, iCol) = level;
00108 while ( e >= 0 )
00109 {
00110 iRow += sRow;
00111 e -= ddCol;
00112 }
00113 iCol += sCol;
00114 e += ddRow;
00115 }
00116 }
00117 else
00118 {
00119 e = ddCol - dRow;
00120 for ( i = 0; i < dRow; ++i )
00121 {
00122 inout(iRow,iCol) = level;
00123 while ( e >= 0 )
00124 {
00125 iCol += sCol;
00126 e -= ddRow;
00127 }
00128 iRow += sRow;
00129 e += ddCol;
00130 }
00131 }
00132 inout(iRow,iCol) = level;
00133 }
00134
00139 template <class I, class BoxType>
00140 void
00141 set_level(abstract::image_with_dim<2,I>& inout,
00142 BoxType& box,
00143 const oln_value_type(I)& level)
00144 {
00145 if (box.card() != 0)
00146 {
00147 dpoint2d drows(box.top().row() - box.bottom().row(), 0);
00148 dpoint2d dcols(0, box.top().col() - box.bottom().col());
00149 set_level(inout, box.top(), box.top() - drows, level);
00150 set_level(inout, box.top(), box.top() - dcols, level);
00151 set_level(inout, box.bottom(), box.bottom() + drows, level);
00152 set_level(inout, box.bottom(), box.bottom() + dcols, level);
00153 }
00154 }
00155
00156 }
00157
00158 }
00159
00160 #endif // ! OLENA_LEVEL_SET_LEVEL_HH