示例#1
0
文件: ejercicio09.c 项目: drozas/c
int main(void)
{
	punto puntos[N];

	int i,j,p1,p2;
	float aux, actual;
	
	/*Leemos las coordenadas de los puntos que nos da el usuario*/
	for(i=0; i<N; i++)
	{
		printf("Introduce la coordenada x el %iº punto : ", i+1);
		scanf("%f", &puntos[i].x1);
		printf("Introduce la coordenada y el %iº punto : ", i+1);
		scanf("%f", &puntos[i].x2);
	}
	
	/*Mostramos la informacion */
	for(i=0; i<N; i++)
	{
		printf("Pto %i : (%.2f,%.2f)\n", i+1, puntos[i].x1, puntos[i].x2);
	}
	
	/*A continuacion calculamos las distancias euclídeas de todos con todos
	y nos guardaremos las referencias de la menor*/
	
	i = 0;
	j = 0;
	p1 = 0;
	p2 = 0;
	/*Inicializamos con el primer par de puntos*/
	actual = distanciaEuclidea(puntos[0],puntos[1]);
	aux = 0.0;
	
	while(i<N)
	{
		j = i + 1;
		while(j<N)
		{
			aux = distanciaEuclidea(puntos[i],puntos[j]);
			printf("Distancia entre  (%.2f , %.2f) con (%.2f , %.2f) = ", puntos[i].x1, puntos[i].x2, puntos[j].x1, puntos[j].x2);
			printf("%.2f\n", aux);
			if (aux<actual) 
			{
				actual = aux;
				p1 = i;
				p2 = j;
			}
			j++;
		}
		i++;
	}
	
	printf("\n-------------------------------------------------------------------------------\n");
	printf("Los puntos mas cercanos son (%.2f , %.2f) con (%.2f , %.2f)", puntos[p1].x1, puntos[p1].x2, puntos[p2].x1, puntos[p2].x2);
	printf("\n-------------------------------------------------------------------------------\n");
	
	return 0;
}
int main(int argc, char *argv[])
{
    std::ifstream fichTest, fichTraining;
    long aciertos = 0;
    Vecinos vecinosMasProximos[KVECINOS];

    if (!seguridad(argc, argv, fichTest)) return 0;

    int hisTraining[NCLUSTERS], hisTest[NCLUSTERS];
    std::string imageTest, imageTraining;

    long posicionTest = 0;
    char basura;
    while( !fichTest.eof() )
    {
        long totalCoincidencias = 0;
        double minimo = -1;
        int posicionVecino = 0;
        std::string pertenece, perteneceEuclidea, perteneceKVecinos;
        for (int i = 0; i < KVECINOS; i++) vecinosMasProximos[i].distancia = 0;

        if (posicionTest != 0) fichTest.seekg(posicionTest, fichTest.beg);
        std::string tipoTest = leerHistograma(hisTest, imageTest, fichTest);

        fichTraining.open(argv[argc-2]);
        if( !fichTraining.is_open() )
        {
            std::cerr << "No se ha podido abrir el fichero de imágenes de Training" << std::endl;
            return false;
        }
        //std::cout << "TEST: " << tipoTest << std::endl;
        std::cout << "Calculando tipo de la imagen: " << imageTest << std::endl;
        long posicionTraining = 0;
        while( !fichTraining.eof() )
        {
            if (posicionTraining != 0) fichTraining.seekg(posicionTraining, fichTraining.beg);
            std::string tipoTraining = leerHistograma(hisTraining, imageTraining, fichTraining);
            //std::cout << "\tTRAINING: " <<  tipoTraining << std::endl;

            //compararHistogramas(hisTest, hisTraining, totalCoincidencias, pertenece, tipoTraining);
            //distanciaEuclidea(hisTest, hisTraining, minimo, perteneceEuclidea, tipoTraining);
            encuentraKVecinos(vecinosMasProximos, posicionVecino, tipoTraining, distanciaEuclidea(hisTest, hisTraining, minimo, perteneceEuclidea, tipoTraining));
            //imprimeKVecinos(vecinosMasProximos);
            posicionTraining = fichTraining.tellg();
            fichTraining >> basura;
        }
        fichTraining.close();
        perteneceKVecinos = votaVecino(vecinosMasProximos);
        guardaResultado(imageTest.substr(imageTest.find_last_of("/"), imageTest.size()), pertenece, perteneceEuclidea, perteneceKVecinos);

        //if(tipoTest == pertenece) aciertos++;
        //if(tipoTest == perteneceEuclidea) aciertos++;
        if(tipoTest == perteneceKVecinos) aciertos++;

        posicionTest = fichTest.tellg();
        fichTest >> basura;

        //std::cout << "El Test: " << tipoTest << ", y el resultado por Coincidencias es: " << pertenece /*<< ", y por Proximidad es: " << perteneceEuclidea*/ << std::endl;
        std::cout << "El Test: " << tipoTest << ", y el resultado por Coincidencias es: " << perteneceKVecinos << std::endl;
    }
    fichTest.close();

    std::cout << "TOTAL DE ACIERTOS: " << aciertos << std::endl;

    return 1;
}
int main(int argc, char *argv[])
{
	std::ifstream fichCandidate, fichTraining;
	//long aciertos = 0;
	Vecinos vecinosMasProximos[KVECINOS];

	if (!seguridad(argc, argv, fichCandidate)) return 0;
	//ListHistrograms listHistCandidate;
	std::list<NodeCandidate> listHistCandidate;
	rellenaLista(listHistCandidate, fichCandidate);
	fichCandidate.close();


	std::cout << "HAY : " << listHistCandidate.size() << " ELEMENTOS" << std::endl;
	std::list<NodeCandidate>::iterator it = listHistCandidate.begin();
	//std::cout << "the first is the number " << it->img /*<< ", and the last is the number " << listHistCandidate.end()*/ << std::endl;
	int hisTraining[NCLUSTERS], hisCandidate[NCLUSTERS];
	std::string /*imageCandidate,*/ imageTraining;
	int noMatch = 0;

	bool endOfWilsone = false;
	int positionCandidate = 0;
	char basura;
	while( !endOfWilsone )
	{
		long totalCoincidencias = 0;
		double minimo = -1;
		int posicionVecino = 0;
		std::string pertenece, perteneceEuclidea, perteneceKVecinos;
		for (int i = 0; i < KVECINOS; i++) vecinosMasProximos[i].distancia = 0;

		fichTraining.open(argv[argc-1]);
		if( !fichTraining.is_open() )
		{
			std::cerr << "No se ha podido abrir el fichero de imágenes de Training" << std::endl;
			return false;
		}
		//std::cout << "Candidate: " << tipoCandidate << std::endl;
		std::cout << "Calculando tipo de la imagen: " << it->img << std::endl;
		long posicionTraining = 0, countTraining = 0;
		while( !fichTraining.eof() )
		{
			if (posicionTraining != 0) fichTraining.seekg(posicionTraining, fichTraining.beg);
			std::string tipoTraining = leerHistograma(hisTraining, imageTraining, fichTraining);
			//std::cout << "\tTRAINING: " <<  tipoTraining << std::endl;
		
			//compararHistogramas(hisCandidate, hisTraining, totalCoincidencias, pertenece, tipoTraining);
			//distanciaEuclidea(hisCandidate, hisTraining, minimo, perteneceEuclidea, tipoTraining);
			if (it->img.compare(imageTraining))
				encuentraKVecinos(vecinosMasProximos, posicionVecino, tipoTraining, distanciaEuclidea(it->hisCandidate, hisTraining, minimo, perteneceEuclidea, tipoTraining));
			//imprimeKVecinos(vecinosMasProximos);
			posicionTraining = fichTraining.tellg();
			fichTraining >> basura;
			countTraining++;
		}
		fichTraining.close();
		perteneceKVecinos = votaVecino(vecinosMasProximos);
		//guardaResultado(imageCandidate.substr(imageCandidate.find_last_of("/"), imageCandidate.size()), pertenece, perteneceEuclidea, perteneceKVecinos);

		if(it->tipo != perteneceKVecinos) 
		{
			listHistCandidate.erase(it++);
			noMatch++;
std::cout << "		---->>>> ELIMINADO! <<<<----	" << std::endl;
		}
		else{
			positionCandidate++; //it++;

			if (++it == listHistCandidate.end())
			{
				usleep(2000);
				if(noMatch < LIMITMATCHES) break;//endOfWilsone = true; //break;
				it = listHistCandidate.begin();
				noMatch = positionCandidate = 0;
	std::cout << "|||||||||||||||||||||||||||||||||||||||||||||| OTRA VEZZZZZ! ||||||||||||||||||||||||||||||||||||||||||||||" << std::endl;
			}
		}
		
		//std::cout << "El Candidate: " << tipoCandidate << ", y el resultado por Coincidencias es: " /*<< pertenece << ", y por Proximidad es: "*/ << perteneceEuclidea << std::endl;
		//std::cout << "El Candidate: " << it->tipo << ", y el resultado por Coincidencias es: " << perteneceKVecinos << std::endl;
	}
	for(it = listHistCandidate.begin(); it != listHistCandidate.end(); it++)
		guardaHistograma(it->hisCandidate, it->img); ////////////////////ESCRIBIMOS EL HISTOGRAMA EN EL NUEVO FICHERO PARA WILSON ALGORITHM////////////////
	//std::cout << "TOTAL DE ACIERTOS: " << aciertos << std::endl;
	std::cout << "TOTAL DE FALLOS: " << noMatch << ", y tamaño de la lista: " << listHistCandidate.size() << std::endl;

	return 1;
}