Ejemplo n.º 1
0
float ImagePart::chercherTransformation(const ImagePart& origine, Transformation& min) const {
	/* Cherche la meilleur transformation de origine pour correspondre à cet objet
	 * Entrées :
	 *   - origine : l'image qui subis les transformations
	 *   - min : un type Transformation
	 * Sorties :
	 *   - retourne la variance correspondant à la transformation trouvée
	 *   - modifie min, la transformation trouvée
	 */
	extern float SEUIL_LISSAGE, SEUIL_VARIANCE;

	Transformation max = ROTATION(360); // max sert juste de borne mais ne peut pas être la valeur de retour
	Transformation mid = ROTATION(0);

	min.rotation = 0;
	min.droite.a = 0;					// Vérifie la fonction constante
	min.droite.b = couleurMoyenne();	// Donne la couleur exacte sur les bouts lisses, crée de la redondanec

	ImagePart img(mTaille);

	origine.transformer(img, max);
	float varmax = moyenneDifference(img); // max sert juste de borne

	origine.transformer(img, min);
	float varmin = moyenneDifference(img, &min.droite, false); // Il faut donner une valeur à min.droite au cas où il est retourné

	/* Application de la dichotomie :
	 * La variance en fonction de l'angle n'est pas (/rarement) monotone, l'algorithme tend vers un minimum local
	 * A chaque itération on choisis l'angle moitié, puis mon garde l'angle de variance la plus faible et ce nouvel angle
	 *  -> min < max gardent leur ordre mais le qualificatif n'est relatif qu'à leur angle
	 *  -> de toutes facons, à la fin varmin ~= varmax
	 */
	LinReg droite;
	if(varmin > SEUIL_LISSAGE) {
		while(max.rotation - min.rotation > 5 && varmin > SEUIL_VARIANCE) {
			mid.rotation = (max.rotation + min.rotation) / 2; // On prend le milieu et on calcul la transformation
			origine.transformer(img, mid);
			float variance = moyenneDifference(img, &droite);
			if(varmin < varmax) {
				max.rotation = mid.rotation;
				max.droite = droite;
				varmax = variance;
			}
			else {
				min.rotation = mid.rotation;
				min.droite = droite;
				varmin = variance;
			}
		}
	}
	return varmin; // On retourne la variance obtenue pour éviter de refaire le calcul
}
Ejemplo n.º 2
0
Image::Image(Entity *entity) : AComponent(entity, T_IMAGE, 0, 1)
{
  POSITION(entity);
  VISIBILITY(entity);
  ROTATION(entity);
  this->bitmap = NULL;
}
Ejemplo n.º 3
0
void					Image::draw()
{
  Position				*position = POSITION(this->entity);
  unsigned char				opacity = VISIBILITY(this->entity)->opacity;
  float					angle = ROTATION(this->entity)->angle;

  if (this->bitmap)
    al_draw_tinted_rotated_bitmap(this->bitmap,
				  al_map_rgba(opacity, opacity, opacity, opacity),
				  angle == 0 ? 0 : al_get_bitmap_width(this->bitmap) / 2,
				  angle == 0 ? 0 : al_get_bitmap_height(this->bitmap) / 2,
				  angle == 0 ? position->x : position->x + al_get_bitmap_width(this->bitmap) / 2,
				  angle == 0 ? position->y : position->y + al_get_bitmap_height(this->bitmap) / 2,
				  angle,
				  0);
}