// Fig. 15.24: FractalJPanel.java
// FractalJPanel demonstrates recursive drawing of a fractal.
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JPanel;

public class FractalJPanel extends JPanel
{
   private Color color; // stores color used to draw fractal
   private int level;   // stores current level of fractal

   private final int WIDTH = 400;  // defines width of JPanel
   private final int HEIGHT = 400; // defines height of JPanel

   // set the initial fractal level to the value specified
   // and set up JPanel specifications
   public FractalJPanel( int currentLevel )
   {
      color = Color.BLUE;  // initialize drawing color to blue
      level = currentLevel; // set initial fractal level
      setBackground( Color.WHITE );
      setPreferredSize( new Dimension( WIDTH, HEIGHT ) );
   } // end constructor FractalJPanel

   // draw fractal recursively
   public void drawFractal( int level, int xA, int yA, int xB, 
      int yB, Graphics g )
   {
      // base case: draw a line connecting two given points
      if ( level == 0 ) 
         g.drawLine( xA, yA, xB, yB );
      else // recursion step: determine new points, draw next level
      {	
         // calculate midpoint between (xA, yA) and (xB, yB)
         int xC = ( xA + xB ) / 2;
         int yC = ( yA + yB ) / 2;

         // calculate the fourth point (xD, yD) which forms an 
         // isosceles right triangle between (xA, yA) and (xC, yC) 
         // where the right angle is at (xD, yD)
         int xD = xA + ( xC - xA ) / 2 - ( yC - yA ) / 2;
         int yD = yA + ( yC - yA ) / 2 + ( xC - xA ) / 2;
         
         // recursively draw the Fractal
         drawFractal( level - 1, xD, yD, xA, yA, g );
         drawFractal( level - 1, xD, yD, xC, yC, g );
         drawFractal( level - 1, xD, yD, xB, yB, g );  
      } // end else
   } // end method drawFractal

   // start the drawing of fractal
   public void paintComponent( Graphics g )
   {
      super.paintComponent( g );

      // draw fractal pattern
      g.setColor( color );
      drawFractal( level, 100, 90, 290, 200, g ); 
   } // end method paintComponent

   // set the drawing color to c
   public void setColor( Color c )
   {
      color = c;
   }
    
   // set the new level of recursion
   public void setLevel( int currentLevel )
   {
      level = currentLevel;
   }

   // returns level of recursion 
   public int getLevel()
   {
      return level;
   }
}; // end class FractalJPanel

/*************************************************************************
* (C) Copyright 1992-2007 by Deitel & Associates, Inc. and               *
* Pearson Education, Inc. All Rights Reserved.                           *
*                                                                        *
* DISCLAIMER: The authors and publisher of this book have used their     *
* best efforts in preparing the book. These efforts include the          *
* development, research, and testing of the theories and programs        *
* to determine their effectiveness. The authors and publisher make       *
* no warranty of any kind, expressed or implied, with regard to these    *
* programs or to the documentation contained in these books. The authors *
* and publisher shall not be liable in any event for incidental or       *
* consequential damages in connection with, or arising out of, the       *
* furnishing, performance, or use of these programs.                     *
*************************************************************************/