public void drawRotatedImage(Image image, Graphics g, double angle, int x, int y) 
{ 
   // W tym miejscu wstaw kod z listingu 13.8.
 
   // Obliczenie "punktu pocztkowego" (w omawianym przykadzie rodka) obrconego obrazu. 
   int referenceX = rotatedW / 2; 
   int referenceY = rotatedH / 2; 

   // Zarezerwowanie tablicy na dane piksela obrazu pocztkowego i obrconego. 
   int [] sourceData = new int[originalW * originalH]; 
   int [] rotatedData = new int[rotatedW * rotatedH]; 

   // Pobranie pikseli obrazu pocztkowego. 
   image.getRGB(sourceData, 0, originalW, 0, 0, originalW, originalH); 

   // Zmienne przeznaczone do oznaczenia pooenia X,Y pikseli w obrazach pocztkowych i obrconym. 
   int rotX,rotY; 
   int origX, origY; 

   // Zmienne przechowujce pozycje indeksu w tablicach RGB. 
   int origPos, rotatedPos; 

   // Przetworzenie kadego piksela obrazu obrconego. 
   for (rotX=0;rotX<rotatedW;rotX++) 
   { 
      for (rotY=0;rotY<rotatedH;rotY++) 
      { 
         // Dla biecego obrconego  piksela obliczamy wsprzdn
         // X piksela w obrazie pocztkowym. Dla tej operacji 
         // za punkt pocztkowy przyjmuje si rodek
         // tego punktu odniesienia. 
         origX = (int) ( (rotX - referenceX) * Math.cos(angle) - (rotY 
         - referenceY) *  Math.sin(angle) + originalW / 2); 
         // Sprawdzenie, czy otrzymana warto X mieci si w obrazie
         // pocztkowym czy nie. Jeeli tak jest, przechodzimy do kolejnego piksela. 
         if ( origX < 0 || origX >= originalW) 
         { 
            continue; 
         } 
         // Nastpnym krokiem jest obliczenie wsprzdnej Y. 
         origY = (int) ( (rotY - referenceY) * Math.cos(angle) + 
          (rotX -referenceX) *  Math.sin(angle) + originalH / 2); 
         // Obliczenie przyszej pozycji piksela w tablicy obrazu rdowego. 
         origPos = origY * originalW + origX ; 
         // Sprawdzenie, czy pozycja jest prawidowa. 
         // Jeeli pozycja jest nieprawidowa, przechodzimy do kolejnego piksela. 
         if ( origPos < 0 || origPos >= sourceData.length ) 
         { 
            continue; 
         }
         // Obliczenie pozycji piksela obrconego w tablicy obrazu obrconego.
         rotatedPos = rotY * rotatedW + rotX; 
         // Przeniesienie danych pikseli z tablicy pocztkowej do tablicy obrazu obrconego.
         rotatedData[rotatedPos] = sourceData[origPos]; 
      } 
   } 
   // Wywietlenie wygenerowanego obrazu. 
   g.drawRGB(rotatedData, 0, rotatedW, x, y, rotatedW, rotatedH, true); 
} 
