/** * Applique la convolution 2d sur l'image passée en paramètre * @param source image source * @param destination image de destination * @param filtre filtre à appliquer à l'image * @param debut premier pixel que l'on traite * @param debut dernier pixel que l'on traite * @return ne retourne rien */ void convolution(img_t* source, img_t* destination, char* filtre, int debut, int fin) { //récupère le filtre passé en paramètre filtre_t K = getFiltre(filtre); int h, i, j; //indices des boucles for int N = K.size; //ordre de la matrice K (Kernel) int M = N/2; //marge par rapport au centre du Kernel int ligne = source->width; //largeur de ligne (en pixel [si on fait 2 * ligne on se retrouve à la deuxieme ligne]) int nbrLigne = source->height; //hauteur de l'image (en pixel) //variables nous permettant le calcul des trois composantes r, g et b de l'image double calcul_r, calcul_g, calcul_b; //parcours toute l'image. h est la position du pixel actuel. for (h = debut; h < fin; h++) { calcul_r = 0; calcul_g = 0; calcul_b = 0; //test que la position actuelle (h) soit en dehors de la marge M des bords de l'image if ((h > (M*ligne)) && (h < ((ligne*nbrLigne) - (M*ligne))) && ((h % ligne) > M) && ((h % ligne) < ligne-M)) { for (j=-M; j<=M; j++) { //ligne du Kernel for (i=-M; i<=M; i++) { //colonne du Kernel pixel_t *p1 = &source->data[h+(ligne*j)+i]; //récupère pixel de l'image de base double z = *(K.f+((j+M)*N)+(i+M)); //récupère la valeur du Kernel (filtre) calcul_r += z * p1->r; //calcul de la valeur pour le rouge calcul_g += z * p1->g; //calcul de la valeur pour le vert calcul_b += z * p1->b; //calcul de la valeur pour le bleu } } } //récupère pixel de l'image de destination pixel_t *p2 = &destination->data[h]; //écrit pixel de l'image de destination avec les valeurs calculées p2->r = test_limite(calcul_r); p2->g = test_limite(calcul_g); p2->b = test_limite(calcul_b); } }
int validite_coup(jeu_s j,coup_s c){ if( !test_limite(c) ){ return(1); } if( c->source[ORD] != -1 && c->source[ABS] != -1 && est_vide_source(j,c) ){ return(2); } if( !est_vide_destination(j,c) ){ return(3); } if(c->source[ORD] != -1 && c->source[ABS] != -1 && c->type != get_pion(j->p,c->source[ORD],c->source[ABS])){ return(4); } if( c->source[ORD] == VIDE && c->type == TIGRE ){ return(5); } if( test_immobile(c)){ return(6); } if( c->type == TIGRE && !test_deplacement(c) && ! test_deplacement_tigre(j,c) ){ return(7); } /*Phase de placement*/ if( j->g->phase == PHASE_PLACEMENT ){ if( c->source[ORD] != VIDE && c->type == CHEVRE ){ return(8); } return(0); } /*Phase de deplacement*/ if( c->type == CHEVRE && c->source[ORD] == VIDE ){ return(9); } if( c->type == CHEVRE && !test_deplacement(c) ){ return(10); } return(0); }