コード例 #1
0
void VistaFigAgrandable::redraw(){
	
	int tempAncho = EscalasDeEjes::getInstance()->getCantidadUnidadesFisicasX(1);
	if(orig==NULL || tempAncho!= escalaAnterior){
		delete orig;
		Imagen* temp = (Imagen*)(Contenedor::getMultimedia(fig->getID()));
		orig = temp->scaleImagen(EscalasDeEjes::getInstance()->getCantidadUnidadesFisicasX(fig->getDimension()->getAncho()/fig->getLargo()),EscalasDeEjes::getInstance()->getCantidadUnidadesFisicasY(fig->getDimension()->getAlto()));
		escalaAnterior = tempAncho;
		largo_anterior = -1;
	}

	if (largo_anterior != fig->getLargo()){
		delete imggrande;
		imggrande = new Imagen((orig->getAncho())*(this->fig->getLargo()),orig->getAlto());
		Uint32 aux = imggrande->atransparentar();
		largo_anterior = fig->getLargo();

		for(int i=0;i<fig->getLargo();i++){
			imggrande->dibujarImagen(orig,NULL,i*orig->getAncho(),0);
		}
		imggrande->atransparentar(aux);
	}

	delete rotada;
	rotada = imggrande->rotarImagen(fig->getDimension()->getAngulo());
	
	if (fig->traslucido) rotada->setTransparency(150);
	if(fig->superpuesta) rotada->pintarRojo();
}
コード例 #2
0
ファイル: arteASCII.cpp プロジェクト: Panilla93/MP2016
int main(int argc, char **argv){
    
    char grises[500]="";   
    char ruta[300] = "imagenes/";
    char ima[100] = "";
    Imagen origen;

    cout<<"Diga el nombre de la imagen con la extension"<< endl;
    cin >> ima;

    strcat(ruta,ima);

    if (!origen.leerImagen(ruta)){
       cerr << "error leyendo "<< ruta << "\n";
       return 1;
    }
    int tama = (origen.filas()*origen.columnas())+1;

    char arteASCII[tama];

    cout<<"Inserta los caracteres: "<< endl;
    cin >> grises;

    cout << "\nLa imagen en arte ASCII es:\n";
    if(origen.aArteASCII(grises, arteASCII, tama))
        cout << arteASCII;
    else
        cout << "La conversión no ha sido posible" << endl;  

}
コード例 #3
0
vector<Imagen> dividir (const Imagen &img, int n, int m) {
    vector<Imagen> resultado;

    int cols  = img.ancho() / n;
    int filas = img.alto() / m;

    int i = 0;

    while(i < img.alto()) {
        int j = 0;
        while(j < img.ancho()) {

            Imagen esta_imagen(filas, cols);

            int i_img = 0;
            while (i_img < filas) {
                int j_img = 0;
                while(j_img < cols) {
                    Pixel este_pixel = img.obtenerPixel(i + i_img, j + j_img);
                    esta_imagen.modificarPixel(i_img, j_img, este_pixel);

                    j_img++;
                }
                i_img++;
            }
            resultado.push_back(esta_imagen);
            j += cols;
        }
        i += filas;
    }

    return resultado;
}
コード例 #4
0
	Imagen Imagen::operator+( Imagen &imagen){

		int filas, columnas;

		if( nfilas > imagen.filas())
			filas = nfilas;
		else
			filas = imagen.filas();
		columnas = ncolumnas + imagen.columnas();
		
		Imagen resultado(filas,columnas);
		
		

		for (int i = 0; i < nfilas; i++){
			for( int j = 0; j < ncolumnas; j++){
				resultado.datos[i][j] = datos[i][j];
				
			}
		}
		
		for (int i = 0; i < imagen.filas(); i++){
			for ( int j = 0; j < imagen.columnas(); j++){
				resultado.datos[i][j+ncolumnas] = imagen.datos[i][j];
				
			}
		}
		
		return resultado;
	}
コード例 #5
0
ファイル: codificar.cpp プロジェクト: seravp/Programacion
bool ocultar(Imagen &imagen, char cadena[]){
	int tama_ima = imagen.filas() * imagen.columnas();
	int tama_mens=strlen(cadena);
	int contador=0;

	if( (tama_mens +1) *8 > tama_ima){
		cerr << "La cadena es demasiado larga" << endl; // cerr
		return false;
	}else{
		for (int i =0;  i <= tama_mens; i++){
			for(int j=7; j>=0; j--){
				bool bit = get(cadena[i],j);
				byte byte_imagen = imagen.getPos(contador);
				if(bit){
					on(byte_imagen,0);
					imagen.setPos(contador,byte_imagen);
				}else{
					off(byte_imagen,0);
					imagen.setPos(contador,byte_imagen);
				}
				contador++;
			}
		}
		return true;		
	}
}
コード例 #6
0
ファイル: revelar.cpp プロジェクト: pacocp/GII-UGR-Primero
int main(int argc,   char * argv[])
{
  
      if(argc != 2)
      {
        cout << "Error en el número de argumentos." << endl;
        cout << "Forma de ejecución: " << endl;
        cout << "revelar salida.pgm > resultado.txt" << endl;
      }
      else
      {
        TipoImagen imag;
        int filas, columnas, Tamimagen;
        bool resultado,lectura;
        char cad[1000000/8];
        imag = LeerTipoImagen(argv[1],filas,columnas);
        Imagen img;
        if(imag == IMG_PGM)
           {
             lectura = img.LeerImagen(argv[1]);
             Tamimagen = filas*columnas;
             resultado = Revelar(img.Getvector(), cad, Tamimagen);
             cout << cad << endl;
           }
        else
           {
               cout << "Error en el formato de la imagen, tiene que ser PGM" << endl;
           }
      }
}
コード例 #7
0
ファイル: arteASCII.cpp プロジェクト: rafaellg8/MP
/**
   Crear un programa arteASCII que pida al usuario el nom-
   bre de la imagen de entrada, el conjunto de caracteres para realizar la
   ́ y escriba en pantalla la imagen convertida a arte ASCII
 */
int main(){
        const int TAMANIO_MAX = 500*500;
        char nombreFichero [100];
        char nombreSalida [100];
        //char arteASCII[TAMANIO_MAX]; // 4500 + el \0
        const int maxlong =TAMANIO_MAX;

        cout<<"\nIntroduzca el nombre de la imagen de entrada."<<endl;
        cout<<"\nSi la imagen no esta en este directorio introducir en el formato: directorio/nombreImagen.extension"<<endl;
        cin.getline(nombreFichero,99);

        Imagen origen;

        // Leer la imagen gio.pgm
        if (!origen.leerImagen(nombreFichero)) {
                cerr << "error leyendo imagenes/"<<nombreFichero<<"\n";
                return 1;
        }

        //Leemos el nombre del fichero de salida
        cout<<"\nIntroduzca el nombre del fichero de salida"<<endl;
        cin.getline(nombreSalida,99);
        if(origen.leeraArteASCII("grises.txt",nombreSalida,maxlong))
                cout << "\nFicheros creados correctamente, busque los : "<<nombreSalida<<".txt"<<endl;
        else
                cout << "La conversion no ha sido posible" << endl;

}
コード例 #8
0
ファイル: pseudo_quilting.cpp プロジェクト: Almuva/Info2-P3
void marcaSegunSeamV(Imagen & LumMargenV, Imagen & BiR, Imagen & BiG, Imagen & BiB)
{
     //Marcamos con valores fuera de rango el seam en la imagen LumMargenVEscogido
	find_v_seam(LumMargenV);
	
	unsigned int col;
	
	for(unsigned int row = 0; row < LumMargenV.fils(); row++)
	{
		col = 0;
		while(LumMargenV(row, col) < 10E20) //10E20: valor fuera de rango.
		{
			BiR(row, col) = 10E20;
			BiG(row, col) = 10E20;
			BiB(row, col) = 10E20;
			col++;
			
			if(col == LumMargenV.cols()) //Debugger
			{
				fprintf(stderr,"En ''marcaSegunSeamV()'' se pasa de largo!!!\n");
				exit(1);
			}
		
		}
	}
}
コード例 #9
0
int main(){
    char grises[] = "@#%xo;:,. ";

    char arteASCII[4501]; // 4500 + el \0

    Imagen origen;

    // Leer la imagen gio.pgm
    if (!origen.leerImagen("imagenes/gio.pgm")){
	   cerr << "error leyendo imagenes/gio.pgm\n";
	   return 1;
    }

    cout << "\nLa imagen en arte ASCII es:\n";
    if(origen.aArteASCII(grises, arteASCII, 4500))
        cout << arteASCII;
    else
        cout << "La conversion no ha sido posible" << endl;

    cout << "Ahora Forzamos que no quepa. Debe aparecer un mensaje de error\n";
    if(origen.aArteASCII(grises, arteASCII, 4199))
        cout << arteASCII;
    else
        cout << "La conversion no ha sido posible" << endl;

    return 0;
}
コード例 #10
0
void TestImagenDAO::getById(ImagenDAO* dao, unsigned int id){
	Imagen buffer = dao->getImgById(id);
	std::cout << "**** getById -" << id << "-" << std::endl;
	if(buffer.getID() != 0)	//el ID 0 indica informacion invalida
		print(&buffer);
	else
		std::cout << "**** NULO" << std::endl;
}
コード例 #11
0
ファイル: Imagen.cpp プロジェクト: siraferradans/TMO
Imagen::Imagen(Imagen & im2)
{
  dim[0]=im2.fils();
  dim[1]=im2.cols();
  int largo=dim[0]*dim[1];
  datos=new double[largo];
  for(int i=0; i< largo; i++)
    datos[i]=im2.datos[i];
}
コード例 #12
0
ファイル: Main.cpp プロジェクト: TachoMex/redes-neuronales
void graficaPuntos(double xi, double yi, double xf, double yf, double x[], double y[], int n,Color c, Imagen& I){
	double dx = (xf - xi);
	double dy = (yf - yi);
	for(int i=1;i<n;i++){
		int x1 = (int)floor((x[i-1]-xi)*I.columnas()/dx);
		int y1 = (int)floor((y[i-1]-yi)*I.filas()/dy);
		int x2 = (int)floor((x[i]-xi)*I.columnas()/dx);
		int y2 = (int)floor((y[i]-yi)*I.filas()/dy);
		primitivas::linea(I, x1,y1,x2,y2,c);
	}
}
コード例 #13
0
int main(int argc, char * argv[]) {
    if (argc!=4) {
        cout<<"Los parametros son :"<<endl;
        cout<<"1. La imagen de entrada"<<endl;
        cout<<"2. El angulo de rotación (en grados)"<<endl;
        cout<<"3. El nombre de la imagen de salida"<<endl;
        return 0;
    }
    Imagen I;
    double angulo = atof(argv[2]);
    angulo = angulo*(M_PI)/180; //Pasamos el angulo a radianes
    I.leer(argv[1]).rotar(angulo).escribir(argv[3],"PPM");
}
コード例 #14
0
void GaleriaImagenes::dividirYAgregar(const Imagen &imagen, int n, int m) {
    int alto = imagen.alto();
    int ancho = imagen.ancho();

    if (alto % m == 0 && ancho % n == 0) {
        vector<Imagen> dividida = dividir(imagen, n, m);

        int i = 0;
        while(i < dividida.size()) {
            this->agregarImagen(dividida[i]);
            i++;
        }
    }
}
コード例 #15
0
ファイル: arteASCII.cpp プロジェクト: koji3/m_p_uno_5
int main(){
	char archivo_grises[255];
	char archivo_salida[255];
	char grises[100];
	
	const int TAM=100000;
	
    char arteASCII[TAM]; 
       
    Imagen origen;
    char nombre_imagen[255];
	
	cout << "Introduce el nombre de la imagen .pgm: " << endl;  
	cin >> nombre_imagen;
	
	cout << "Introduce el fichero de grises: " << endl;  
	cin >> archivo_grises;
	
	cout << "Introduce el fichero de salida: " << endl;  
	cin >> archivo_salida;
	
	if (!origen.leerImagen(nombre_imagen)){
	   cerr << "error leyendo " << nombre_imagen << " \n";
	   return 1;
    }
	
	string linea;
	int num_grises;
	ifstream fentrada;
	ofstream fsalida;
	fentrada.open(archivo_grises);
	if(fentrada){
		getline(fentrada,linea);				//Ignorar primera linea
		fentrada >> num_grises;
		for(int x=1; x<=num_grises; x++){
			fentrada>>grises;
		    if(origen.aArteASCII(grises, arteASCII, TAM)){
		    	char nombre_aux[255];
		    	//strcpy(nombre_aux,archivo_salida);
		    	sprintf(nombre_aux, "%s%d%s", archivo_salida,x,".txt");
		    	//strcat(nombre_aux,".txt");
				fsalida.open(nombre_aux);
				fsalida << arteASCII;
				fsalida.close();
			}else{
				cout << "La conversión " << x << " no ha sido posible" << endl;  
			}
		}
		fentrada.close();
	}else{
コード例 #16
0
	void Imagen::copia(Imagen & imagen){
		if(datos==NULL)
			destruir();
		nfilas = imagen.filas();
		ncolumnas = imagen.columnas();
		datos = new byte*[nfilas];
		datos[0]=new byte[nfilas*ncolumnas];
		for (int i=1; i < nfilas; i++){
			datos[i] = datos[i-1] + ncolumnas;
		} 
		for(int i=0;i<nfilas;i++)
			for(int j=0;j<ncolumnas;j++)
				datos[i][j]=imagen.get(i,j);
	}
コード例 #17
0
ファイル: Imagen.cpp プロジェクト: siraferradans/TMO
void Imagen::operator-=(Imagen & im2)
{
  int fil2=im2.fils();
  int col2=im2.cols();
  if(dim[0]!=fil2 || dim[1]!=col2)
    {
      fprintf(stderr,"Diferentes dimensiones al restar imagenes \n");
      return;
    }

  int largo=dim[0]*dim[1];
  for(int i=0; i<largo; i++)
    datos[i]-=im2.datos[i];

  return;
}
コード例 #18
0
ファイル: Imagen.cpp プロジェクト: siraferradans/TMO
void Imagen::operator*=(Imagen  & im2)
{
  int fil2=im2.fils();
  int col2=im2.cols();
  if(dim[0]!=fil2 || dim[1]!=col2)
    {
      fprintf(stderr,"Diferentes dimensiones al multiplicar imagenes \n");
      return;
    }

  int largo=dim[0]*dim[1];
  for(int i=0; i<largo; i++)
    this->datos[i] *= (&im2)->datos[i];

  return;
}
コード例 #19
0
int main(int argc, char * argv[]){
  if (argc!=4){
    cout<<"Los parametros son :"<<endl;
    cout<<"1.-La imagen de entrada"<<endl;
    cout<<"2.-El angulo de rotación (en grados)"<<endl;
    cout<<"3.-El nombre de la imagen de salida"<<endl;
    return 0;
  }
  Imagen I;
  I.LeerImagen(argv[1]);
  double angulo=atof(argv[2]);
  angulo = angulo*(M_PI)/180; //Pasamos el angulo radianes
  //Imagen Iout=Rota(I,angulo);
  //Iout.EscribirImagen(argv[3]);
  
}  
コード例 #20
0
ファイル: seam_finding.cpp プロジェクト: Almuva/Info2-P3
// BACKTRACK
void backtrackV(Imagen &cE, int i, unsigned int j, Imagen & E)
{

	if (i > 0)
	{
		// Aj = incremento de j 
		int Aj = minPosition(cE(i-1,j-1), cE(i-1,j), cE(i-1,j+1));
		int f = i-1;
		int c = j + Aj;

		if(c == -1) c = 1;
		if((unsigned int)c == cE.cols()) c = cE.cols()-2;

		E(f, c) = 10E20;

		backtrackV(cE, f, c, E);
	}	
}
コード例 #21
0
ファイル: seam_finding.cpp プロジェクト: Almuva/Info2-P3
unsigned int smallestH(Imagen &cumulativeE){

	int f = cumulativeE.fils() -1; // last row
	
	unsigned int h; 

	double min = 10E8; // valor de inicio

	for (unsigned int j=0; j<cumulativeE.cols(); j++)
	{
		if (cumulativeE(f,j)<min)
		{
			h = j;
			min = cumulativeE(f,j);
		}
 	}
	return h;
}
コード例 #22
0
ファイル: seam_finding.cpp プロジェクト: Almuva/Info2-P3
// finds the horizontal coordinate of the pixel in the last row with minimum value
unsigned int smallestV(Imagen &cumulativeE){

	int c = cumulativeE.cols()-1; // last column
	
	unsigned int v; 

	double min = 10E8; // valor de inicio

	for (unsigned int i=0; i<cumulativeE.fils(); i++)
	{
		if (cumulativeE(i,c)<min)
		{
			v = i;
			min = cumulativeE(i,c);
		}
 	}

	return v;
}
コード例 #23
0
ファイル: seam_finding.cpp プロジェクト: Almuva/Info2-P3
// BACKTRACK
void backtrackH(Imagen &cE, int i, unsigned int j, Imagen & E)
{

	//cout<<"bt"<<i<<endl;
	if (i > 0)
	{
		int c = i-1;
		// Aj = incremento de j 
		int Aj = minPosition(cE(j-1,c), cE(j,c), cE(j+1,c));
		int f = j + Aj;
		
		if(f == -1) f = 1;
		if((unsigned int)f == cE.fils()) f = cE.fils()-2;
		
		E(f, c) = 10E20;
		
		backtrackH(cE, c, f, E);
	}	
}
コード例 #24
0
ファイル: testimagen.cpp プロジェクト: Panilla93/MP2016
int main(){
    Imagen origen;
    Imagen destino(150,200);
	
	// Crear un degradado en la imagen destino
    for (int i=0; i < destino.filas()*destino.columnas(); i++)
		   destino.setPos(i, i%destino.columnas()+20);
	   
	// Guardar la imagen destino en el fichero degradado.pgm
	if (destino.escribirImagen("degradado.pgm", true)){
		// si todo va bien
		cout << "degradado.pgm guardado correctamente \n";
		cout << "usa: display degradado.pgm para ver el resultado\n";
	} else { // si error
		cerr << "Error guardando la imagen degradado.pgm\n";
		return 1;
	}
	
	// Leer la imagen lena.pgm
	if (!origen.leerImagen("imagenes/lena.pgm")){
		cerr << "error leyendo imagenes/lena.pgm\n";
		return 1;
	}
	
	// Recortar un trozo de la imagen origen
	destino.crear(40,90);
	for (int i=0; i < destino.filas(); i++)
		for (int j=0; j < destino.columnas(); j++)
			destino.set(i, j, origen.get(i+110,j+100));
		
	// Guardar la imagen destino en el fichero trozo.pgm
	if (destino.escribirImagen("trozo.pgm", true)){
		// si todo va bien
		cout << "trozo.pgm guardado correctamente \n";
		cout << "usa: display trozo.pgm para ver el resultado\n";
	} else { // si error
		cerr << "Error guardando la imagen trozo.pgm\n";
		return 1;
	}	
	
	return 0;
}
コード例 #25
0
ファイル: testimagen.cpp プロジェクト: rafaellg8/MP
int main() {
    Imagen origen;
    Imagen destino(150,200);

    // Crear un degradado en la imagen destino
    for (int i=0; i < destino.filas()*destino.columnas(); i++)
        destino.setPos(i, i%destino.columnas()+20);

    // Guardar la imagen destino en el fichero degradado.pgm
    if (destino.escribirImagen("degradado.pgm", false)) {
        // si todo va bien
        cout << "degradado.pgm guardado correctamente \n";
        cout << "usa: display degradado.pgm para ver el resultado\n";
    } else { // si error
        cerr << "Error guardando la imagen degradado.pgm\n";
        return 1;
    }

    // Leer la imagen lena.pgm
    if (!origen.leerImagen("imagenes/lena.pgm")) {
        cerr << "error leyendo imagenes/lena.pgm\n";
        return 1;
    }

    // Recortar un trozo de la imagen origen
    Imagen aux(40,90);
    Imagen salida (aux); //Llamamos al operador de asignacion
    for (int i=0; i < salida.filas(); i++)
        for (int j=0; j < salida.columnas(); j++)
            salida.set(i, j, origen.get((i+110)%origen.filas(),(j+100)%origen.columnas()));
    //Hemos aplicado un filtro de modulo para que no intente leear fuera del vector de datos
    // Guardar la imagen salida en el fichero trozo.pgm
    if (salida.escribirImagen("trozo.pgm", false)) {
        // si todo va bien
        cout << "trozo.pgm guardado correctamente \n";
        cout << "usa: display trozo.pgm para ver el resultado\n";
    } else { // si error
        cerr << "Error guardando la imagen trozo.pgm\n";
        return 1;
    }
    return 0;
}
コード例 #26
0
ファイル: Imagen.cpp プロジェクト: siraferradans/TMO
void Imagen::operator=(Imagen  & im2)
{
  // este operador no duplica la memoria //
  int fil2=im2.fils();
  int col2=im2.cols();
  if(dim[0]!=fil2 || dim[1]!=col2)
    {
      //      fprintf(stderr,"Diferentes dimensiones al copiar imagenes \n");
      dim[0]=fil2;
      dim[1]=col2;
      delete[] datos;
      datos=new double[fil2*col2];
    }

  int largo=dim[0]*dim[1];
  for(int i=0; i<largo; i++)
    datos[i]=im2.datos[i];

  return;
}
コード例 #27
0
ファイル: suma.cpp プロジェクト: adrianmorente/PracticasMP
int main(int argc, char *argv[]){

        if(argc != 5){
            cerr << "Error en el uso: ./suma <img1>.pgm <img2>.pgm <img_resultado>.pgm (t)exto/(b)inario" << endl;
            exit(-1);
        }

        Imagen primera, segunda;
        char nombre[100];
        bool es_binario;

        if(*argv[4]=='t')
            es_binario=false;
        else if(*argv[4]=='b')
            es_binario=true;
        else{
            cerr << "Formato de salida desconocido..." << endl;
            exit(-1);
        }
        strcpy(nombre, argv[1]);
        if(!primera.leerImagen(nombre)){
            cerr << "Error leyendo la primera imagen..." << endl;
            exit(-1);
        }
        strcpy(nombre, argv[2]);
        if(!segunda.leerImagen(nombre)){
            cerr << "Error leyendo la segunda imagen..." << endl;
            exit(-1);
        }

        //Si llegamos hasta aqui, no ha habido errores de lectura
        Imagen resultado = primera+segunda;
        strcpy(nombre, argv[3]);
        if(!resultado.escribirImagen(nombre, es_binario)){
            cerr << "Error al escribir en imagen de destino..." << endl;
            exit(-1);
        }else
            cout << "\nConcatenacion realizada. Comprueba el fichero de salida." << endl;

        return 0;
}
コード例 #28
0
ファイル: desplazar.cpp プロジェクト: algui91/MP-P3_mp-grado
int main(int argc, char *argv[]) {

	Imagen img;
	if (argc < 4) {
		cout << "Uso: " << "desplazar NumDesplazamientos ImagenEntrada ImagenSalida\n";
		return -1;
	}
	img.crear(0, 0);
	if (!img.leer_imagen(argv[2])) { //PAsamos el archivo a leer
		cout << "No se puede leer la imagen " << endl;
		return -2;
	}
	desplazar(img, atoi(argv[1]));
	if (!img.escribir_imagen(argv[3])) {
		cout << "No se puede escribir la imagen " << endl;
		return -3;
	}
	img.destruir();

	return 0;
}
コード例 #29
0
ファイル: arteASCII.cpp プロジェクト: guillermogotre/MP15
int main(){
	const int MAX_CSTR_SIZE = 100;
	const int MAX_ASCII_ART = 4500;
	Imagen imagen;
	char ascii_chars[MAX_CSTR_SIZE], 
		file_path[MAX_CSTR_SIZE],
		ascii_art[MAX_ASCII_ART];

	cout << "Introduzca la ruta del archivo:";
	cin.getline(file_path, MAX_CSTR_SIZE);

	cout << "Introduzca los caracteres de conversion:";
	cin.getline(ascii_chars, MAX_CSTR_SIZE);

	if(!imagen.leerImagen(file_path))
		cout << "Error leyendo imagen" << endl;
	
	if(imagen.aArteASCII(ascii_chars, ascii_art, MAX_ASCII_ART))
		cout << ascii_art;
	else
		cout << "Error transformando a ASCIIart" << endl;
}
コード例 #30
0
ファイル: Imagen.cpp プロジェクト: siraferradans/TMO
void Imagen::operator/=(Imagen  & im2)
{
  // si el divisor es 0, pone 0 en el cociente...
  int fil2=im2.fils();
  int col2=im2.cols();
  if(dim[0]!=fil2 || dim[1]!=col2)
    {
      fprintf(stderr,"Diferentes dimensiones al multiplicar imagenes \n");
      return;
    }

  int largo=dim[0]*dim[1];
  double div;
  for(int i=0; i<largo; i++)
    {
      div=im2.datos[i];
      if(fabs(div)>1e-10)
	datos[i]/=div;
      else
	datos[i]=0.0;
    }
  return;
}