// 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);
	}
}