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 }