Esempio n. 1
0
void Button::draw(cv::Mat& img){
	cv::Point pos(x,y);
	cv::circle(img,pos, this->size,cv::Scalar(255,0,0),2, 8, 0 );

	cv::Point origine(this->x - this->size +5 ,this->y +5);

	cv::putText(img,this->name, origine,cv::FONT_HERSHEY_SIMPLEX,0.5,CV_RGB(255,255,255),2,8,false);


}
void EnveloppeConvexe::compute(){
        // pour protéger monEnsembleDePoints, mais pas indispensable
        cout<<"!-- entree de EnveloppeConvexe::compute()"<<endl;

        EnsembleDePoints* EnsPoints = monEnsembleDePoints;

	//recherche du point d'ordonnee minimum
	IteratorEnsembleDePoints   begin = EnsPoints->begin();
	IteratorEnsembleDePoints     end = EnsPoints->end();
	IteratorEnsembleDePoints courant = begin;
	double mini = numeric_limits<double>::max();
	while (begin != end){
	    if(begin->imag() < mini) {
		mini = begin->imag();
		courant = begin;
	    }
	    begin++;
	}
    // fin de recherche du point d'ordonnée minimum = *courant
     //   cout<< "courant mini = "<<*courant<<endl;
    // on retire ce point de Interieur
        IteratorEnsembleDePoints beginInterieur = Interieur.begin();
        IteratorEnsembleDePoints  endInterieur = Interieur.end();
        while (beginInterieur != endInterieur && *beginInterieur != *courant )
            beginInterieur++;
        Interieur.erase(beginInterieur);

// initialisation avant la boucle principale

	// premier argument de computeTableauPondere
	complex<double> origine(0,0);

	// deuxième argument de computeTableauPondere
	complex<double> extremite = *courant;

	// le premier élément de Enveloppe
	Enveloppe.push_back(extremite);

// boucle principale
	IteratorEnsembleDePoints first = EnsPoints->begin();
	IteratorEnsembleDePoints  last = EnsPoints->end();

	// on parcours EnsPoints
	while (first != last){
	//recherche du point d'angle minimum

	    // création du tableau (double, complex)
	    // ATTENTION = le premier élément d'une map doit être d'un
	    // type ordonnée. Donc pas complex !!
	    MapDoubleComplex Map = computeTableauPondere(origine, extremite);

	    // recherche dans Map du point d'angle minimum
	    ItMap begin = Map.begin();
	    ItMap  end  = Map.end();
	    ItMap courant = begin;
	    double min = 99999;// numeric_limits<double>::min();
	    while (begin != end){
		if(begin->first < min) {
		    min = begin->first;
		    courant = begin;
		}
		begin++;
	    }
	// fin de recherche dans Map du point d'angle minimum
	// cout<< "angle mini = "<<courant->first<<" point "<<courant->second<<endl<<endl;

	   // recherche dans monEnsembleDePoints du point d'angle minimum
	   IteratorEnsembleDePoints premier = EnsPoints->begin();
	   IteratorEnsembleDePoints  dernier = EnsPoints->end();
	   while(premier != dernier && *premier != courant->second)
	       premier++;
	   if(premier != dernier) {
		// on prépare l'appel à computeTableauPondere
		origine = extremite;
		extremite = *premier;

		// on recherche la présence de ce point dans Enveloppe
		IteratorEnsembleDePoints beginEnveloppe = Enveloppe.begin();
		IteratorEnsembleDePoints  endEnveloppe = Enveloppe.end();
		while (beginEnveloppe != endEnveloppe && *beginEnveloppe != extremite )
		    beginEnveloppe++;

		// si ce point n'est pas déjà dans Enveloppe, on l'ajoute à Enveloppe
		// et on le retire de Interieur
		if(beginEnveloppe == endEnveloppe){
			Enveloppe.push_back(extremite);
			// on le retire de Interieur
			IteratorEnsembleDePoints beginInterieur = Interieur.begin();
			IteratorEnsembleDePoints  endInterieur = Interieur.end();
			while (beginInterieur != endInterieur && *beginInterieur != extremite )
			    beginInterieur++;
			Interieur.erase(beginInterieur);
		}
	    }
	    first++;
	} // fin de la boucle principale
	//cout<<"Enveloppe = \n"<<toString(Enveloppe)<<endl<<endl;
	//cout<<"Interieur = \n"<<toString(Interieur)<<endl;
	//emit SIGNAL_Evc(Enveloppe,Interieur );
	cout<<"<!-- sortie de EnveloppeConvexe::compute()"<<endl;
}