// TreeCanvas.java// Written by Julian Devlin, 8/97, for the text book// "Introduction to Probability," by Charles M. Grinstead & J. Laurie Snellimport java.awt.*;public class TreeCanvas extends java.awt.Canvas {	int w, h;								// width and height of this component		float a, b, c, d, cga, dga, cgb, dgb, agc, bgc, agd, bgd, ac, ad, bc, bd;		// Set up a TreeCanvas	public TreeCanvas(float pa, float pcga, float pcgb) {		super();								// Set up as we would for a canvas		a = pa;		cga = pcga;		cgb = pcgb;				b = 1f - a;		dga = 1f - cga;		dgb = 1f - cgb;		ac = a * cga;		ad = a * dga;		bc = b * cgb;		bd = b * dgb;		c = ac + bc;		d = ad + bd;		agc = ac / c;		bgc = bc / c;		agd = ad / d;		bgd = bd / d;			}			// Paint method, which should be redefined by subclasses to actually show the data points	public void paint(Graphics g) {		// ORIGINAL		g.drawString("Original tree",  1, 19);		g.drawLine(0, 115, 25, 115);			// Main fork		g.drawLine(25, 65, 25, 165);		g.drawLine(25, 65, 75, 65);		g.drawLine(25, 165, 75, 165);				g.drawLine(85, 65, 110, 65);		// Top (a) fork		g.drawLine(110, 40, 110, 90);		g.drawLine(110, 40, 160, 40);		g.drawLine(110, 90, 160, 90);				g.drawLine(85, 165, 110, 165);		// Bottom (b) fork		g.drawLine(110, 140, 110, 190);		g.drawLine(110, 140, 160, 140);		g.drawLine(110, 190, 160, 190);				g.drawString(String.valueOf(a), 26, 64);	// a, b probability		g.drawString(String.valueOf(b), 26, 164);				g.drawString("a", 76, 70);			// Label a, b		g.drawString("b", 76, 170);				g.drawString(String.valueOf(cga), 111, 39);	// c|a, d|a probability		g.drawString(String.valueOf(dga), 111, 89);		g.drawString(String.valueOf(cgb), 111, 139);	// c|b, d|b probability		g.drawString(String.valueOf(dgb), 111, 189);				g.drawString("c", 161, 45);			// Label c, d		g.drawString("d", 161, 95);		g.drawString("c", 161, 145);			// Label c, d		g.drawString("d", 161, 195);				g.drawString(String.valueOf(ac), 181, 45);	// ac, ad probability		g.drawString(String.valueOf(ad), 181, 95);		g.drawString(String.valueOf(bc), 181, 145);	// bc, bd probability		g.drawString(String.valueOf(bd), 181, 195);				// REVERSE		g.drawString("Reverse tree",  250 + 1, 19);		g.drawLine(250 + 0, 115, 250 + 25, 115);			// Main fork		g.drawLine(250 + 25, 65, 250 + 25, 165);		g.drawLine(250 + 25, 65, 250 + 75, 65);		g.drawLine(250 + 25, 165, 250 + 75, 165);				g.drawLine(250 + 85, 65, 250 + 110, 65);		// Top (a) fork		g.drawLine(250 + 110, 40, 250 + 110, 90);		g.drawLine(250 + 110, 40, 250 + 160, 40);		g.drawLine(250 + 110, 90, 250 + 160, 90);				g.drawLine(250 + 85, 165, 250 + 110, 165);		// Bottom (b) fork		g.drawLine(250 + 110, 140, 250 + 110, 190);		g.drawLine(250 + 110, 140, 250 + 160, 140);		g.drawLine(250 + 110, 190, 250 + 160, 190);				g.drawString(String.valueOf(c), 250 + 26, 64);	// c, d probability		g.drawString(String.valueOf(d), 250 + 26, 164);				g.drawString("c", 250 + 76, 70);			// Label c, d		g.drawString("d", 250 + 76, 170);				g.drawString(String.valueOf(agc).substring(0, 4), 250 + 111, 39);	// a|c, b|c probability		g.drawString(String.valueOf(bgc).substring(0, 4), 250 + 111, 89);		g.drawString(String.valueOf(agd).substring(0, 4), 250 + 111, 139);	// a|d, b|d probability		g.drawString(String.valueOf(bgd).substring(0, 4), 250 + 111, 189);				g.drawString("a", 250 + 161, 45);			// Label a, b		g.drawString("b", 250 + 161, 95);		g.drawString("a", 250 + 161, 145);			// Label a, b		g.drawString("b", 250 + 161, 195);				g.drawString(String.valueOf(ac), 250 + 181, 45);	// ac, bc probability		g.drawString(String.valueOf(bc), 250 + 181, 95);		g.drawString(String.valueOf(ad), 250 + 181, 145);	// ad, bd probability		g.drawString(String.valueOf(bd), 250 + 181, 195);	}}
