/home/neoflo/smb4k/SERVEUR/Millie/trunk/src/operator/GeometricOperators.cpp

Aller à la documentation de ce fichier.
00001 /******************************************************************************
00002  *       __    _    _   _       _       _   _____                             *
00003  *       | \  / |  | | | |     | |     | |  | ___|                            *
00004  *       |  \/  |  | | | |     | |     | |  | |_                              *
00005  *       |      |  | | | |     | |     | |  |  _|                             *
00006  *       | |\/| |  | | | |__   | |__   | |  | |__                             *
00007  *       |_|  |_|  |_| |____|  |____|  |_|  |____|                            *
00008  * __________________________________________________________________________ *
00009  *                 Multifunctional Library For Image Processing               *
00010  *                                                                            *
00011  *                                                                            *
00012  *                                                                            *
00013  *      (c) Copyright 2007 by Humbert Florent                                 *
00014  *                                                                            *
00015  *      This program is free software; you can redistribute it and/or modify  *
00016  *      it under the terms of the GNU General Public License as published by  *
00017  *      the Free Software Foundation; only version 2 of the License.          *
00018  *                                                                            *
00019  *      This program is distributed in the hope that it will be useful,       *
00020  *      but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00021  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00022  *      GNU General Public License for more details.                          *
00023  *                                                                            *
00024  *      You should have received a copy of the GNU General Public License     *
00025  *      along with this program; if not, write to the Free Software           *
00026  *      Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA             *
00027  *      02111-1307, USA.                                                      *
00028  ******************************************************************************/
00029 
00032 #include "operator/GeometricOperators.hpp"
00033 
00034 #include <cmath>
00035 
00036 using namespace Millie;
00037 
00038 void Millie::rotationOperator(Image& out, Image & in, float degree)
00039 {
00040   if(out.getNumComponents() != in.getNumComponents())
00041     throw IllegalArgument("rotationOperator");
00042 
00043   /* détermine la valeur en radian de l'angle*/
00044   float angle_radian = -degree * M_PI / 180.0;
00045 
00046   /*pour éviter pleins d'appel, on stocke les valeurs*/
00047   float tcos = cos(angle_radian);
00048   float tsin = sin(angle_radian);
00049 
00050   /*calcul de la taille de l'image de destination*/
00051   int largeurdest= (int)  ceil(in.getWidth() * fabs(tcos) + in.getHeight()* fabs(tsin));
00052   int hauteurdest= (int)  ceil(in.getWidth()* fabs(tsin) + in.getHeight() * fabs(tcos));
00053 
00054   /*on redimensionne l'image*/
00055   out.resize(largeurdest, hauteurdest);
00056 
00057   /*calcul du centre des images*/
00058   int mxdest = out.getWidth()/2;
00059   int mydest = out.getHeight()/2;
00060   int mx = in.getWidth()/2;
00061   int my = in.getHeight()/2;
00062 
00063   for(int canal=0; canal<in.getNumComponents(); canal++)
00064     for(int j=0;j< out.getHeight();j++)
00065       for(int i=0;i< out.getWidth();i++)
00066       {
00067         /* on détermine la valeur de pixel qui correspond le mieux pour la position
00068          * i,j de la surface de destination */
00069 
00070         /* on détermine la meilleure position sur la surface d'origine en appliquant
00071          * une matrice de rotation inverse
00072          */
00073 
00074         int bx = (int) (ceil (tcos * (i-mxdest) + tsin * (j-mydest) + mx));
00075         int by = (int) (ceil (-tsin * (i-mxdest) + tcos * (j-mydest) + my));
00076         /* on vérifie que l'on ne sort pas des bords*/
00077         if (bx>=0 && bx< in.getWidth() && by>=0 && by< in.getHeight())
00078         {
00079           out.setPixel(i,j, canal, in.getPixel(bx, by, canal));
00080         }
00081       }
00082 }
00083 
00084 void Millie::verticalFlipOperator(Image& out, const Image& in)
00085 {
00086   /*on vérifie que out et in ont le même nombre de canaux
00087    * sinon, l'opération n'a aucun sens, on lance une exception
00088    */
00089   if(out.getNumComponents() != in.getNumComponents())
00090     throw IllegalArgument("verticalFlipOperator");
00091 
00092   /*
00093    * on redéfini la taille de l'image de sortie
00094    */
00095   out.resize(in.getWidth(), in.getHeight());
00096 
00097   int largeur = out.getWidth();
00098   int hauteur = out.getHeight();
00099 
00100   /* on parcout tous les canaux et on effectue l'opération de flip*/
00101   for(int canal=0; canal< out.getNumComponents(); canal++)
00102     for(int j = 0; j< hauteur; j++)
00103       for(int i = 0; i< largeur; i++)
00104        out.setPixel(i,hauteur-j, canal, in.getPixel(i,j, canal));
00105 
00106 }
00107 
00108 
00109 void Millie::horizontalFlipOperator(Image& out, const Image& in)
00110 {
00111   if(out.getNumComponents() != in.getNumComponents())
00112     throw IllegalArgument("horizontalFlipOperator");
00113 
00114   out.resize(in.getWidth(), in.getHeight());
00115 
00116   int largeur = out.getWidth();
00117   int hauteur = out.getHeight();
00118 
00119   for(int canal=0; canal< out.getNumComponents(); canal++)
00120     for(int j = 0; j< hauteur; j++)
00121       for(int i = 0; i< largeur; i++)
00122         out.setPixel(largeur- i,j, canal, in.getPixel(i,j, canal));
00123 
00124 }
00125 
00126 

Généré le Fri May 18 23:24:40 2007 pour Millie par  doxygen 1.5.1