IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Problème avec rotozommSurface


Sujet :

SDL

  1. #1
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 559
    Points
    1 559
    Par défaut Problème avec rotozommSurface
    Bonjour à tous,

    Suite au post de AceSir, j'ai voulu faire quelques test avec rotozoomSurface(), fonction que j'emploie assez peu. Mais je me suis aperçu rapidement du problème suivant: la surface que je tourne (un carré de 500x500) prend de l'ampleur à chaque rotation. Voici le code (je le mets au complet, si qqun veut le tester), et en dessous le fichier stdout.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
     
     
    #include <sdl\sdl.h>
    #include <sdl\sdl_rotozoom.h>
     
    #define WNDP 32
    //#define WNDA 24
    #define WNDA 32
    #define BORDERWIDTH 2
     
    #pragma warn -par
    int main(int argc,char *argv[])
    {
    	int done;
    	double angle;
    	Uint32 red;
    	SDL_Surface *wnd,*abc,*a;
    	SDL_Event event;
    	SDL_Rect coo;
     
    	putenv("SDL_VIDEO_WINDOW_POS=center");
    	if(SDL_Init(SDL_INIT_VIDEO)!=0) exit(0);
     
    	wnd=SDL_SetVideoMode(1000,800,WNDP,SDL_HWSURFACE|SDL_DOUBLEBUF);
     
    	SDL_FillRect(wnd,NULL,SDL_MapRGB(wnd->format,255,255,255));
    	SDL_Flip(wnd);
     
    	abc=SDL_CreateRGBSurface(SDL_HWSURFACE,500,500,WNDA,0,0,0,0);
    	SDL_FillRect(abc,NULL,SDL_MapRGB(abc->format,255,255,255));
    	red=SDL_MapRGB(abc->format,0xff,0,0);
     
    	coo.x=0;
    	coo.y=0;
    	coo.w=abc->w;
    	coo.h=BORDERWIDTH;
    	SDL_FillRect(abc,&coo,red);		// up
     
    	coo.y=abc->h-BORDERWIDTH;
    	SDL_FillRect(abc,&coo,red);		// down
     
    	coo.y=0;
    	coo.w=BORDERWIDTH;
    	coo.h=abc->h;
    	SDL_FillRect(abc,&coo,red);		// left
     
    	coo.x=abc->w-BORDERWIDTH;
    	SDL_FillRect(abc,&coo,red);		// right
     
     
     
    	a=SDL_CreateRGBSurface(SDL_HWSURFACE,50,50,WNDA,0,0,0,0);
    	SDL_FillRect(a,NULL,SDL_MapRGB(a->format,0x4e,0x98,0x98));
    	coo.x=10;
    	coo.y=(abc->h-a->h)/2;
    	SDL_BlitSurface(a,NULL,abc,&coo);
     
    	SDL_FillRect(a,NULL,SDL_MapRGB(a->format,0xff,0,0));
    	coo.x=(abc->w-a->w)/2;
    	coo.y=10;
    	SDL_BlitSurface(a,NULL,abc,&coo);
     
    	SDL_FillRect(a,NULL,SDL_MapRGB(a->format,0,0xff,0));
    	coo.x=abc->w-10-a->w;
    	coo.y=(abc->h-a->h)/2;
    	SDL_BlitSurface(a,NULL,abc,&coo);
     
    	SDL_FillRect(a,NULL,SDL_MapRGB(a->format,0,0,0xff));
    	coo.x=(abc->w-a->w)/2;
    	coo.y=(abc->h-a->h)-10;
    	SDL_BlitSurface(a,NULL,abc,&coo);
     
    	SDL_FreeSurface(a);
     
    	done=0;
    	angle=1.;
    	while(!done) {
    		if(angle!=0.) {
    			coo.x=(wnd->w-abc->w)/2;
    			coo.y=(wnd->h-abc->h)/2;
    			SDL_BlitSurface(abc,NULL,wnd,&coo);
    			SDL_UpdateRect(wnd,coo.x,coo.y,abc->w,abc->h);
    			printf("abc->w=%d, abc->h=%d\n",abc->w,abc->h);
    			}
    		angle=0.;
    		SDL_WaitEvent(&event);
    		switch(event.type) {
    			case SDL_QUIT: done=1; break;
    			case SDL_KEYDOWN:
    				switch(event.key.keysym.sym) {
    					case SDLK_ESCAPE: done=1; break;
    					case SDLK_LEFT: angle=-90.; break;
    					case SDLK_RIGHT: angle=90.; break;
    					default: break;
    					}
    				break;
    			default: break;
    			}
    		if(angle) {
    			SDL_Surface *tmp;
    			tmp=rotozoomSurface(abc,angle,1.,1);
    			SDL_FreeSurface(abc);
    			abc=tmp;
    			}
    		}
    	SDL_FreeSurface(abc);
    	SDL_FreeSurface(wnd);
     
    	SDL_Quit();
    	return(0);
    }
    #pragma warn .par
    Le fichier stdout (extrait)
    abc->w=500, abc->h=500
    abc->w=502, abc->h=502
    abc->w=504, abc->h=504
    abc->w=506, abc->h=506
    abc->w=508, abc->h=508
    abc->w=510, abc->h=510
    abc->w=512, abc->h=512
    abc->w=514, abc->h=514
    abc->w=516, abc->h=516
    abc->w=518, abc->h=518
    abc->w=520, abc->h=520
    abc->w=522, abc->h=522
    abc->w=524, abc->h=524
    abc->w=526, abc->h=526
    abc->w=528, abc->h=528
    abc->w=530, abc->h=530
    abc->w=532, abc->h=532
    abc->w=534, abc->h=534
    abc->w=536, abc->h=536
    abc->w=538, abc->h=538
    abc->w=540, abc->h=540
    abc->w=542, abc->h=542
    abc->w=544, abc->h=544
    abc->w=546, abc->h=546
    abc->w=548, abc->h=548
    abc->w=550, abc->h=550
    abc->w=552, abc->h=552

    Si quelqu'un a une idée du pourquoi....

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Parce qu'il y a un probleme de pointeur , moi quand je le test mon programme plante x)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    #include <SDL/SDL.h>
    #include <SDL/SDL_rotozoom.h>
     
    #define WNDP 32
    //#define WNDA 24
    #define WNDA 32
    #define BORDERWIDTH 2
     
    int main(int argc,char *argv[])
    {
    	int done;
    	double angle;
    	Uint32 red;
    	SDL_Surface *wnd,*abc,*a;
    	SDL_Event event;
    	SDL_Rect coo;
     
    	putenv("SDL_VIDEO_WINDOW_POS=center");
    	if(SDL_Init(SDL_INIT_VIDEO)!=0) exit(0);
     
    	wnd=SDL_SetVideoMode(1000,800,WNDP,SDL_HWSURFACE|SDL_DOUBLEBUF);
     
    	SDL_FillRect(wnd,NULL,SDL_MapRGB(wnd->format,255,255,255));
    	SDL_Flip(wnd);
     
    	abc=SDL_CreateRGBSurface(SDL_HWSURFACE,500,500,WNDA,0,0,0,0);
    	SDL_FillRect(abc,NULL,SDL_MapRGB(abc->format,255,255,255));
    	red=SDL_MapRGB(abc->format,0xff,0,0);
     
    	coo.x=0;
    	coo.y=0;
    	coo.w=abc->w;
    	coo.h=BORDERWIDTH;
    	SDL_FillRect(abc,&coo,red);		// up
     
    	coo.y=abc->h-BORDERWIDTH;
    	SDL_FillRect(abc,&coo,red);		// down
     
    	coo.y=0;
    	coo.w=BORDERWIDTH;
    	coo.h=abc->h;
    	SDL_FillRect(abc,&coo,red);		// left
     
    	coo.x=abc->w-BORDERWIDTH;
    	SDL_FillRect(abc,&coo,red);		// right
     
     
     
    	a=SDL_CreateRGBSurface(SDL_HWSURFACE,50,50,WNDA,0,0,0,0);
    	SDL_FillRect(a,NULL,SDL_MapRGB(a->format,0x4e,0x98,0x98));
    	coo.x=10;
    	coo.y=(abc->h-a->h)/2;
    	SDL_BlitSurface(a,NULL,abc,&coo);
     
    	SDL_FillRect(a,NULL,SDL_MapRGB(a->format,0xff,0,0));
    	coo.x=(abc->w-a->w)/2;
    	coo.y=10;
    	SDL_BlitSurface(a,NULL,abc,&coo);
     
    	SDL_FillRect(a,NULL,SDL_MapRGB(a->format,0,0xff,0));
    	coo.x=abc->w-10-a->w;
    	coo.y=(abc->h-a->h)/2;
    	SDL_BlitSurface(a,NULL,abc,&coo);
     
    	SDL_FillRect(a,NULL,SDL_MapRGB(a->format,0,0,0xff));
    	coo.x=(abc->w-a->w)/2;
    	coo.y=(abc->h-a->h)-10;
    	SDL_BlitSurface(a,NULL,abc,&coo);
     
    	SDL_FreeSurface(a);
     
    	done=0;
    	angle=1.;
     
    	coo.x=(wnd->w-abc->w)/2;
        coo.y=(wnd->h-abc->h)/2;
     
    	while(!done)
    	{
    		SDL_FillRect(wnd,NULL,SDL_MapRGB(wnd->format,0xff,0xff,0xff));
    		angle=0.;
    		SDL_WaitEvent(&event);
    		switch(event.type)
    		{
    			case SDL_QUIT: done=1; break;
    			case SDL_KEYDOWN:
    				switch(event.key.keysym.sym)
    				{
    					case SDLK_ESCAPE: done=1; break;
    					case SDLK_LEFT: angle=-90.; break;
    					case SDLK_RIGHT: angle=90.; break;
    					default: break;
                    }
    				break;
    			default: break;
            }
     
     
            SDL_Surface *tmp;
            tmp=rotozoomSurface(abc,angle,1,0);
            SDL_BlitSurface(tmp,NULL,wnd,&coo);
            printf("abc->w=%d, abc->h=%d\n",tmp->w,tmp->h);
            SDL_FreeSurface(tmp);
     
     
            SDL_Flip(wnd);
        }
     
    	SDL_FreeSurface(abc);
    	SDL_FreeSurface(wnd);
     
    	SDL_Quit();
    	return(0);
    }
    j'ai réglais le probleme mais il fait 502,502 , j'imagine que la fonction rotozoom et pas precise pour les angles apres je vois aucun autre souci.

    Apres le probleme de AceSir , je pense que c'est un probleme de pointeur ( ça y ressemble en tous cas).

    Parce que en reprenant son image de son screen (336x122).
    J'ai pas les bandes noire qu'il a :
    image

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    L'augmentation de la taille du rectangle contenant l'image tournée me semble normal. En effet, si on prend un carré, sa rotation augmentera la taille du rectangle l'englobant.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 559
    Points
    1 559
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    L'augmentation de la taille du rectangle contenant l'image tournée me semble normal. En effet, si on prend un carré, sa rotation augmentera la taille du rectangle l'englobant.
    Merci de la réponse.

    Cela revient dont à dire qu'il m'est impossible d'effectuer la rotation d'un carré en conservant la taille d'orgine? Pourtant, un carré de 500x500 tourné de +90 ou -90 degrés reste un carré de 500x500. Si la rotation était de 45°, ok, la taille changerait, mais un carré

    Evidement on pourrait contourner le problème en appliquant la rotation à chaque fois sur la surface d'origine (abc dans mon test), et en cumulant les angles. Mais, malgré tout, cette augmentation de surface.... Cela devient gênant si pour une raison quelconque la surface à un bpp de 24, car elle convertie 'on the fly', MAIS les pixels ajoutés lors de la conversion sont à zéro, et cela donne donc une couleur noire... et noir sur un fond blanc, ça se voit comme le nez au milieu du visage (c'est pour tester cela que j'avais deux define pour WNDA).

    Enfin, je suppose que c'est dans l'algorithme de la rotation qu'il faudrait chercher la réponse.

    @kanagi: désolé, chez moi pas de plantage, ça tourne (dans tous les sens du terme ) aussi longtemps que je veux....
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Arf, pour des rotations d'angle de 90°, il n'y a pas de raison ...
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    @kannagi: désolé, chez moi pas de plantage, ça tourne (dans tous les sens du terme ) aussi longtemps que je veux....
    Vraiment étrange parce que chez moi il plante bien , et il me file une erreur de segmentation (d'ou pourquoi ça augmente alors que moi non).


    Mais sinon , on faisant mon test il y a pas de souci , et ça fait seulement 502,502.

    Citation Envoyé par edgarjacobs Voir le message
    aussi longtemps que je veux....
    C'est la toute la perfidie des pointeurs , il peut y avoir des soucis et le programme tourne sans problème (quoique tu as une erreur avec les cotés qui augmente mais il aurait pu très bien marcher) ,alors tu pense que le plem vient de sdl_gfx alors que c'est un problème de pointeur et crois moi j'ai de expérience dedans .

  7. #7
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 559
    Points
    1 559
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    Vraiment étrange parce que chez moi il plante bien , et il me file une erreur de segmentation (d'ou pourquoi ça augmente alors que moi non).


    Mais sinon , on faisant mon test il y a pas de souci , et ça fait seulement 502,502.


    C'est la toute la perfidie des pointeurs , il peut y avoir des soucis et le programme tourne sans problème (quoique tu as une erreur avec les cotés qui augmente mais il aurait pu très bien marcher) ,alors tu pense que le plem vient de sdl_gfx alors que c'est un problème de pointeur et crois moi j'ai de expérience dedans .
    Mais je viens de re-parcourir ton code, et tu ne fais pas la même chose que moi! Tu effectues à chaque fois la rotation sur la surface abc d'origine, pas sur la surface abc qui a déjà été tournée précédemment! Si tu fais la rotation sur la surface déjà modifiée, tu verras qu'elle augmente de taille après chaque rotozoomSurface().
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  8. #8
    Membre régulier Avatar de c1702
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 22
    Points : 90
    Points
    90
    Par défaut
    Bonjour,

    Citation Envoyé par edgarjacobs Voir le message
    Le fichier stdout (extrait)
    abc->w=500, abc->h=500
    abc->w=502, abc->h=502
    abc->w=504, abc->h=504
    abc->w=506, abc->h=506
    abc->w=508, abc->h=508
    abc->w=510, abc->h=510
    abc->w=512, abc->h=512
    abc->w=514, abc->h=514
    abc->w=516, abc->h=516
    abc->w=518, abc->h=518
    abc->w=520, abc->h=520
    ...

    Si quelqu'un a une idée du pourquoi....
    Oui, le souci est dans cette fonction (je pense) :
    http://www.ferzkopp.net/Software/SDL...ce.html#l00949

    Avec tes valeurs (img 500x500, rotation 90°, zoom 1.0), on finit sur des valeurs float valant (avec 20 décimales) :
    250.00000000000002842171 250.00000000000002842171
    et le 'ceil' arrondi ça à 251. (x2 => 502). Donc ça grossit au fur et à mesure.

    Ceci dit, tu devrais partir de l'image de base à chaque fois. Surtout si le smooth est activé !

    (Note : Je n'ai testé que cette fonction, je n'ai pas la lib sdl_gfx installée).

    Sinon tu as aussi la fonction rotateSurface90Degrees. A vue de nez, avec cette fonction les tailles ne devraient pas augmenter.

    Clément.

  9. #9
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 559
    Points
    1 559
    Par défaut
    Envoyé par Clément
    Sinon tu as aussi la fonction rotateSurface90Degrees. A vue de nez, avec cette fonction les tailles ne devraient pas augmenter.
    Mais que vois-je? Je n'ai pas cette librairie-là! La mienne se contente de rotozoomSurface, rotozoomSurfaceXY, rotozoomSurfaceSize, rotozoomSurfaceSizeXY, zoomSurface et zoomSurfaceSize.

    Il va falloir que je me penche sur cette version-là.

    Quant au problème de la surface qui augmente, tu as sans doute raison (ah, les conversions et les floats.... )

    Merci à toi, je clos la discussion.

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo