I. Types of Shapes
   A. Rectangular
      1. Rectangles
         a. Squares
	 b. Specification
	    i. Top/Left/Width/Height
	    ii. Top/Left and Bottom/Right corners
      2. Ellipses
         a. Circles
	 b. Specification
	    i. Ellipses: Same as rectangles
	    ii. Circles
	        1) same as rectangles
		2) center + radius 
      3. Arcs
         a. Specification
	    i. Start Angle/End Angle
	    ii. Start Angle/Increment Angle
	 b. Java
	    i. Start Angle measured from 0 degress on X-axis (the horizontal)
	    ii. Positive increment = counter-clockwise
	    iii. Uses degrees, not radians
	 c. Arc Types
	    i. Chord: Line segment connects start and end points
	    ii. Open: No line segment between start and end point
	    iii. Pie: Line segments from start and end points to the center,
	         thus creating a pie shape
      4. Text
      5. Images
   B. Lines
      1. Arrows
         a. Specification--One technique (see paper notes)
	    i. height - length along the line
	    ii. width - width of the arrow

	 b. Derivation of equations for the endpoints of an arrow
	    1) Equation for a line = P1 + d*t where t goes from 0 to 1,
	         d is a directional vector, and d = [P2.x - P1.x, P2.y - P1.y]
	    2) If d = (dx, dy), then the normal vector, n, to the line is (-dy, dx)
	    3) The unit directional vector is 
	         (dx / sqrt(dx*dx+dy*dy), dy / sqrt(dx*dx+dy*dy))
	    4) ArrowPt1 = P2 - length * unit_d + width * unit_n
	       ArrowPt2 = P2 - length * unit_d - width * unit_n
	    5) Arrow = Polyline(ArrowPt1, P2, ArrowPt2)

	    6) Pseudo-code

	    dx = X2 - X1;
    	    dy = Y2 - Y1;
	    line_length = sqrt(dx*dx + dy*dy)
	    normalized_dx = dx / line_length;
	    normalized_dy = dy / line_length;

    	    ArrowX1 = X2 - arrowLength * normalized_dx - arrowWidth * normalized_dy
    	    ArrowY1 = Y2 - arrowLength * normalized_dy + arrowWidth * normalized_dx
	    ArrowX2 = X2 - arrowLength * normalized_dx + arrowWidth * normalized_dy
    	    ArrowY2 = Y2 - arrowLength * normalized_dy - arrowWidth * normalized_dx

      2. Polylines
         a. Polygon: closes polyline
	 b. Join style is important attribute

   C. Curves
      1. Quadratic curves
      2. Cubic curves

   D. Areas: Union, Intersection, Difference, or Exclusive-Or of shapes

II. Model
    A. Need 3 categories of methods
        1. Accessor methods for querying state information
	2. Settor methods for changing state information
	    a. First notify all observers of the change and pass the old
	       value as a parameter
	    b. Second change the value
	3. Registration/deregistration methods for observers
    B. Requirements for view classes should be specified using an interface