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     public 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        maxDepth = string2int( maxDepthStr );
 36  
 37     }
 38  
 39     public int string2int( String s ) {
 40        if ( s == null ) {
 41           return 3;  // default
 42        } else {
 43           return Integer.parseInt( s );
 44        }
 45     }
 46  
 47     
 48     public void paint( Graphics g ) {
 49  
 50        // draw initial triangle:
 51        triangle = new Triangle( v0, v1, v2 );
 52        g.setColor( Color.black );
 53        triangle.fill( g );
 54        
 55        // divide and fill:
 56        g.setColor( Color.white );
 57        divideAndFill( g, 0 );
 58  
 59     }
 60     
 61     private void divideAndFill( Graphics g, int depth ) {
 62        
 63        if ( depth < maxDepth ) {
 64            
 65            // get the vertices of the current triangle:
 66            Point p0 = new Point( triangle.xpoints[0],
 67                                  triangle.ypoints[0]  );
 68            Point p1 = new Point( triangle.xpoints[1],
 69                                  triangle.ypoints[1]  );
 70            Point p2 = new Point( triangle.xpoints[2],
 71                                  triangle.ypoints[2]  );
 72            
 73            // compute the midpoint of each side:
 74            Point p01 = midpoint( p0, p1 );
 75            Point p02 = midpoint( p0, p2 );
 76            Point p12 = midpoint( p1, p2 );
 77            
 78            // fill the inner triangle:
 79            ( new Triangle( p01, p02, p12 ) ).fill( g );
 80            
 81            // recurse on three subtriangles:
 82            triangle = new Triangle( p0, p01, p02 );
 83            divideAndFill( g, depth + 1 );
 84            triangle = new Triangle( p1, p01, p12 );
 85            divideAndFill( g, depth + 1 );
 86            triangle = new Triangle( p2, p02, p12 );
 87            divideAndFill( g, depth + 1 );
 88            
 89        }
 90         
 91     }
 92     
 93     private Point midpoint( Point p, Point q ) {
 94  
 95        return new Point( (int) Math.round( (p.x + q.x)/2.0 ), 
 96                          (int) Math.round( (p.y + q.y)/2.0 )  );
 97  
 98     }
 99     
100  }