http://web.ics.purdue.edu/~pritchey/courses/cs426/project.pdf