```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
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
```