1  /*
  2   *  File:  TriangleTest.java
  3   *
  4   *  Draw a Sierpinski triangle (a fractal)
  5   *
  6   *  Copyright:  Northeast Parallel Architectures Center
  7   *  
  8   */
  9  
 10  import java.applet.Applet;
 11  import java.awt.Graphics;
 12  import java.awt.Color;
 13  import java.awt.Point;
 14  
 15  public class TriangleTest extends Applet {
 16  
 17     // create a reference to a triangle:
 18     private Triangle triangle;
 19     
 20     // create references to the vertices of a triangle:
 21     private Point v0, v1, v2;
 22     
 23     // maximum depth of recursion:
 24     private int maxDepth;      
 25     
 26     public void init() {
 27     
 28        // triangle vertices:
 29        v0 = new Point( 150,  25 );
 30        v1 = new Point( 294, 275 );
 31        v2 = new Point(   6, 275 );
 32        
 33        // get 'maxDepth' parameter from the HTML document:
 34        String maxDepthStr = getParameter( "maxDepth" );
 35        if ( maxDepthStr == null ) {
 36           maxDepth = 3;  // default
 37        } else {
 38           maxDepth = Integer.parseInt( maxDepthStr );
 39        }
 40  
 41     }
 42     
 43     public void paint( Graphics g ) {
 44  
 45        // draw initial triangle:
 46        triangle = new Triangle( v0, v1, v2 );
 47        triangle.setColor( Color.black );
 48        triangle.fill( g );
 49        
 50        // divide and fill:
 51        divideAndFill( g, 0 );
 52  
 53     }
 54     
 55     private void divideAndFill( Graphics g, int depth ) {
 56        
 57        if ( depth < maxDepth ) {
 58            
 59            // get the vertices of this triangle:
 60            Point[] points = triangle.getPoints();
 61            
 62            // compute the midpoint of each side:
 63            Point p01 = midpoint( points[0], points[1] );
 64            Point p02 = midpoint( points[0], points[2] );
 65            Point p12 = midpoint( points[1], points[2] );
 66            
 67            // fill the inner triangle:
 68            Triangle innerTriangle = new Triangle( p01, p02, p12 );
 69            innerTriangle.setColor( Color.white );
 70            innerTriangle.fill( g );
 71            
 72            // recurse on three subtriangles:
 73            triangle = new Triangle( points[0], p01, p02 );
 74            divideAndFill( g, depth + 1 );
 75            triangle = new Triangle( points[1], p01, p12 );
 76            divideAndFill( g, depth + 1 );
 77            triangle = new Triangle( points[2], p02, p12 );
 78            divideAndFill( g, depth + 1 );
 79            
 80        }
 81         
 82     }
 83     
 84     private Point midpoint( Point p, Point q ) {
 85  
 86        return new Point( (int) Math.round( (p.x + q.x)/2.0 ), 
 87                          (int) Math.round( (p.y + q.y)/2.0 )  );
 88  
 89     }
 90     
 91  }