See the coursework instructions (university website link) for a description of the task, and the final report for information about the algorithms, design, and implementation.
Note: the final report may seem a bit odd or limited in some places, this is because there were specific instructions and limits we had to follow. I would have preferred to write more about some things and less about others - some of it is basically just a copy of parts of the JavaDoc.