public void drawRotatedImage(Image image, Graphics g, double angle, int x, int y) 
{ 
   // W tym miejscu wstaw kod z listingu 13.8.
 
   // Obliczenie "punktu początkowego" (w omawianym przykładzie środka) obróconego obrazu. 
   int referenceX = rotatedW / 2; 
   int referenceY = rotatedH / 2; 

   // Zarezerwowanie tablicy na dane piksela obrazu początkowego i obróconego. 
   int [] sourceData = new int[originalW * originalH]; 
   int [] rotatedData = new int[rotatedW * rotatedH]; 

   // Pobranie pikseli obrazu początkowego. 
   image.getRGB(sourceData, 0, originalW, 0, 0, originalW, originalH); 

   // Zmienne przeznaczone do oznaczenia położenia X,Y pikseli w obrazach początkowych i obróconym. 
   int rotX,rotY; 
   int origX, origY; 

   // Zmienne przechowujące pozycje indeksu w tablicach RGB. 
   int origPos, rotatedPos; 

   // Przetworzenie każdego piksela obrazu obróconego. 
   for (rotX=0;rotX<rotatedW;rotX++) 
   { 
      for (rotY=0;rotY<rotatedH;rotY++) 
      { 
         // Dla bieżącego „obróconego”  piksela obliczamy współrzędną
         // X piksela w obrazie początkowym. Dla tej operacji 
         // za punkt początkowy 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 mieści się w obrazie
         // początkowym czy nie. Jeżeli tak jest, przechodzimy do kolejnego piksela. 
         if ( origX < 0 || origX >= originalW) 
         { 
            continue; 
         } 
         // Następnym krokiem jest obliczenie współrzędnej Y. 
         origY = (int) ( (rotY - referenceY) * Math.cos(angle) + 
          (rotX -referenceX) *  Math.sin(angle) + originalH / 2); 
         // Obliczenie przyszłej pozycji piksela w tablicy obrazu źródłowego. 
         origPos = origY * originalW + origX ; 
         // Sprawdzenie, czy pozycja jest prawidłowa. 
         // Jeżeli pozycja jest nieprawidłowa, przechodzimy do kolejnego piksela. 
         if ( origPos < 0 || origPos >= sourceData.length ) 
         { 
            continue; 
         }
         // Obliczenie pozycji piksela „obróconego” w tablicy obrazu obróconego.
         rotatedPos = rotY * rotatedW + rotX; 
         // Przeniesienie danych pikseli z tablicy początkowej do tablicy obrazu obróconego.
         rotatedData[rotatedPos] = sourceData[origPos]; 
      } 
   } 
   // Wyświetlenie wygenerowanego obrazu. 
   g.drawRGB(rotatedData, 0, rotatedW, x, y, rotatedW, rotatedH, true); 
} 
