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
00029
00032 #include <iostream>
00033
00034 #include "Kernel.hpp"
00035
00036
00037 using namespace Millie;
00038
00040 Kernel::Kernel(int taillex, int tailley, int originex, int originey)
00041 {
00042
00043 if(taillex<=0 | tailley<=0)
00044 throw IllegalArgument("Kernel::KernelP");
00045 if(originex>=taillex || originey>=tailley)
00046 throw IllegalArgument("Kernel::KernelP");
00047 if(originex<0 || originey<0)
00048 throw IllegalArgument("Kernel::KernelP");
00049
00050 _largeur = taillex;
00051 _hauteur = tailley;
00052 _originex = originex;
00053 _originey = originey;
00054 _isSeparable = false;
00055
00056
00057 _data.resize(getHeight() * getWidth());
00058 for(int i = 0; i<_data.getSize(); i++)
00059 _data[i] = 0.0f;
00060
00061 }
00062
00063 Kernel::Kernel(int taillex, int tailley, int originex, int originey, const float * data)
00064 {
00065 if(data==NULL)
00066 throw NullPointer("Kernel::Kernel");
00067
00068 if(taillex<=0 | tailley<=0)
00069 throw IllegalArgument("Kernel::Kernel");
00070 if(originex>=taillex || originey>=tailley)
00071 throw IllegalArgument("Kernel::Kernel");
00072 if(originex<0 || originey<0)
00073 throw IllegalArgument("Kernel::Kernel");
00074
00075 _largeur = taillex;
00076 _hauteur = tailley;
00077 _originex = originex;
00078 _originey = originey;
00079 _isSeparable = false;
00080
00081
00082 _data.resize(getHeight() * getWidth());
00083 for(int i = 0; i< _data.getSize(); i++)
00084 _data[i] = data[i];
00085
00086 }
00087
00088 Kernel::Kernel(int taillex, int tailley, int originex, int originey, const float * datax, const float * datay)
00089 {
00090 if(datax==NULL || datay==NULL)
00091 throw NullPointer("Kernel::Kernel");
00092 if(taillex<=0 || tailley<=0)
00093 throw IllegalArgument("Kernel::Kernel");
00094 if(originex>=taillex || originey>=tailley)
00095 throw IllegalArgument("Kernel::Kernel");
00096 if(originex<0 || originey<0)
00097 throw IllegalArgument("Kernel::Kernel");
00098
00099 _largeur = taillex;
00100 _hauteur = tailley;
00101 _originex = originex;
00102 _originey = originey;
00103 _isSeparable = true;
00104
00105
00106 _dataX.resize(getWidth());
00107 for(int i = 0; i< _dataX.getSize(); i++)
00108 _dataX[i] = datax[i];
00109
00110 _dataY.resize(getHeight());
00111 for(int i = 0; i< _dataX.getSize(); i++)
00112 _dataY[i] = datay[i];
00113
00114
00115 }
00116
00117 Kernel & Kernel::operator=(Kernel& origine)
00118 {
00119 if(origine.getHeight() != getHeight() | origine.getWidth() != getWidth())
00120 {
00121 throw IllegalArgument("Kernel::operator=");
00122 }
00123
00124 _originex = origine.getXOrigin();
00125 _originey = origine.getYOrigin();
00126
00127 if(origine.isSeparable())
00128 {
00129 _dataX = origine._dataX;
00130 _dataY = origine._dataY;
00131 }
00132 else
00133 {
00134 _data = origine._data;
00135 }
00136
00137
00138 _isSeparable = origine.isSeparable();
00139 return (*this);
00140 }
00141
00142 Kernel::Kernel(const Kernel& origine)
00143 {
00144
00145 _originex = origine.getXOrigin();
00146 _originey = origine.getYOrigin();
00147 _largeur = origine.getWidth();
00148 _hauteur = origine.getHeight();
00149
00150 if(origine.isSeparable())
00151 {
00152 _dataX = origine._dataX;
00153 _dataY = origine._dataY;
00154 }
00155 else
00156 {
00157 _data = origine._data;
00158 }
00159
00160 _isSeparable = origine.isSeparable();
00161
00162 }
00163
00164 bool Kernel::isSeparable() const
00165 {
00166 return _isSeparable;
00167 }
00168
00169 Kernel::~Kernel()
00170 {
00171 }
00172
00173 int Kernel::getXOrigin() const
00174 {
00175 return _originex;
00176 }
00177
00178 int Kernel::getYOrigin() const
00179 {
00180 return _originey;
00181 }
00182
00183 int Kernel::getWidth() const
00184 {
00185 return _largeur;
00186 }
00187
00188 int Kernel::getHeight() const
00189 {
00190 return _hauteur;
00191 }
00192
00193
00194 float Kernel::operator()(int x, int y) const
00195 {
00196 if(isSeparable())
00197 return (_dataX[x] * _dataY[y]);
00198 else
00199 return(_data[y * getWidth() + x]);
00200 }
00201
00202 void Kernel::setValue(int x, int y, float value)
00203 {
00204 if(isSeparable())
00205 throw IllegalArgument("Kernel is separable, no sense !");
00206 else
00207 _data[y * getWidth() + x] = value;
00208
00209 }
00210
00211 int Kernel::getTopPadding() const
00212 {
00213 return getYOrigin();
00214 }
00215
00216 int Kernel::getBottomPadding() const
00217 {
00218 return getHeight() - getYOrigin()-1;
00219 }
00220
00221 int Kernel::getLeftPadding() const
00222 {
00223 return getXOrigin();
00224 }
00225
00226 int Kernel::getRightPadding() const
00227 {
00228 return getWidth() - getXOrigin()-1;
00229 }