Newsgroup: it.comp.os.linux.development
Titolo: Rotazione di Surface in SDL

Ho il seguente codice che ruota una Surface in SDL.
Ovviamente questa rotazione non e' effettuata durante il loop
ma dopo il caricamento di una bitmap originale che poi
viene ruotata 15 volte.
Applicando questo algoritmo pero' ho notato che per problemi di
approssimazione alcuni punti all'interno dell'immagine restano
vuoti, risultando quindi trasparenti.
Vorrei cambiare l'algoritmo. Invece di calcolare per ogni punto
le sue nuove coordinate rotate dell'angolo desiderato, vorrei
calcolare la coordinata del vertice e da li iniziare a copia
la prima riga riscrivendola pero' inclinata del corrispondete
coeficiente angola.
Questo mi risolve il problema dei pixel vuoti ?
Qualcuno ha un pezzo di codice che gia' fa' questo ??
Grazie in anticipo, AGX
------------------
#include "math.h"
#include <SDL.h>
SDL_Surface *RotateSurface( SDL_Surface *src, int angle, int trasp ) {
  SDL_Surface *dest;
  SDL_Rect srect, drect;
  int cx, newx, x, x2;
  int cy, newy, y, y2;
  dest = SDL_AllocSurface( 0, src->w, src->h, src->format->BitsPerPixel,
    src->format->Rmask, src->format->Gmask, src->format->Bmask, 
    src->format->Amask
  );
  cx = src->w >> 1;
  cy = src->h >> 1;
  for (y2=0; y2 < src->h; y2++) {
    for (x2=0; x2 <src->w; x2++) {
      x = x2 - cx;
      y = y2 - cy;
      newx = x * cos( (float)angle * M_PI / 180 ) - 
        y * sin( (float)angle * M_PI / 180 );
      newy = x * sin( (float)angle * M_PI / 180 ) + 
        y * cos( (float)angle * M_PI / 180 );
      if ( ( newx >= -cx ) && ( newx <= cx ) && 
         ( newy >= -cy ) && ( newy <= cy ) ) 
      {
        srect.x = x2;         srect.y = y2;         srect.w = 1;  srect.h = 1;
	drect.x = newx + cx;  drect.y = newy + cy;  drect.w = 1;  drect.h = 1;
        SDL_BlitSurface( src, &srect, dest, &drect );
      }
    }
  }
  if ( trasp > 0 ) {
    SDL_SetColorKey( dest, SDL_SRCCOLORKEY, *(Uint8 *)dest->pixels );
  }
  return dest;
}

 wrote in message
slrn87ej4...@localhost.localnet...:
[zak]
: Questo mi risolve il problema dei pixel vuoti ?
di solito è un problema di granularità: se usi i float, devi usare una
corrispondenza punto - pixel alta (almeno 50 punti per 1 pixel), e non 1 a
1 come hai fatto tu, con una conversione da float ad int.
: Qualcuno ha un pezzo di codice che gia' fa' questo ??
va bene il tuo, basta una divisione.
--
____ __         __,_      __  _____
\  _\_ \  ___ _/ / /\  /\/  \/ / _/ It is better to reign in Hell
 \  _ \ \/ _ '/ , |\ VV / / / / _/ Than serve in Heaven.- MILTON
  \_,_/\_\_,_/_/|_| \__/\__/_/_/
      -- the one and only --     e-mail : 
blak...@tiscalinet.it
                                ICQ    : 59394345
The UNIX Guru's View of Sex:
$unzip;strip;touch;finger;mount;fsck;more;yes;umount;sleep

Pape' Satan, pape' Satan aleppe, comincio' Antonio con voce chioccia:
AG> Applicando questo algoritmo pero' ho notato che per problemi di
AG> approssimazione alcuni punti all'interno dell'immagine restano
AG> vuoti, risultando quindi trasparenti.
AG> Vorrei cambiare l'algoritmo. Invece di calcolare per ogni punto
AG> le sue nuove coordinate rotate dell'angolo desiderato, vorrei
Per risolvere il problema dei pixel vuoti di solito si fa il
contrario di quello che hai fatto tu. 
Tu hai l'immagine A originale e una B in cui vuoi farla apparire
ruotata. Invece di prendere ogni pixel di A, ruotarlo e metterlo in
B, prendi ogni pixel di B, fai l'inverso della rotazione e cerchi
quale pixel di A va a finire in quel punto di B. In questo modo
risolvi tutti i problemi di pixel 'vuoti' con rotazioni, zoom e
qualsiasi altra cosa.
Se vuoi avevo scritto qualcosina per svgalib, ma il codice e'
un po' contorto, non e' molto utile per fini didattici.
-- 
ciao,
Claudio

va bene il tuo, basta una divisione.
Ho provato anche a convertire con ceil() e floor() ma non cambia
nulla

 wrote in message
: Ho provato anche a convertire con ceil() e floor() ma non cambia
: nulla
l'errore non e' nella parte intera, ma nell'insieme di operazioni che porta
al risultato: un errore piccolo (5% diciamo) ripetuto 20 volte ti sballa il
risultato. devi portare la risoluzione dell'immagine a un valore superiore
per arginare questi errori, in modo che l'errore resti all'interno dei
valori che portano allo stesso pixel. Un buon testo di calcolo numerico ti
puo' fornire indizi.
