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 }