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 }
Image::Image(Entity *entity) : AComponent(entity, T_IMAGE, 0, 1) { POSITION(entity); VISIBILITY(entity); ROTATION(entity); this->bitmap = NULL; }
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); }