Assignment 1

Handed out:

Thursday, October 1 1998

Due:

5pm, Thursday, October 15, 1998

Your assignment is to implement an impressionistic paint system, similar
in spirit to Paul Haeberli's The
Impressionist (this program exists as a Java Applet). Please try
out Haeberli's program to get a feel for how the system should work.

Some images to get you started are in /usr/class/cs248/assignments/assignment1/images.

Your version of the The Impressionist program will load a full
color image, allow the user to create a painting, and then save the resulting
image. The painting, unlike the original image, will consist of a set of
brush strokes: each stroke will have a color, a shape, a position, a size
and an orientation. The strokes will be created by the user, by sweeping
the mouse over the image, in the process picking up the color from the
original image and laying down a stroke at the cursor location.

Your system should have the following features.

Provide a palette of at least three brush shapes. The following three shapes
are required: a circle, a rectangle rotated by 45 degrees, and a scattered
collection of lines.

Provide a control so that the user can set the size of the brush.

Provide at least three methods for controlling the position and orientation
of the brush. The first, and simplest, method should be to place the brush
at the current cursor location in a fixed orientation. The second method
should orient the brush in the direction of mouse motion. The final method
should continually jitter (randomly perturb) the position and orientation
of the brush about the cursor location.

Provide a blending mode. This requires that you provide a controller for
setting the opacity to a value between 0 and 1. The opacity will control
the transparency of the brush stroke. If the stroke is opaque (opacity
equals 1), then the stroke will overwrite the current painted colors; if
the stroke is transparent, it will be blended into the painting using the
"over" operator.

To help you get started, and to help you concentrate on the more interesting
aspects of this assignment, we will provide a sample program and a collection
of interesting images. The sample program will read in a full color image,
and store the image in a 2D array. This program will also implement a clear
button that erases the canvas, and a save button (that saves the painting
in a file). Here is some documentation
on the sample program.

80% of your grade will be based on the features that you implement.
That is, you will lose points for each of the above features that does
not work correctly. 20% of your grade will be based on programming
style; in particular, we may take off points for obfuscated code, or very
inefficient use of OpenGL.

Your program should have the same user interface as the example program.
Your program will be tested semi automatically, so deviations from that
user interface will break the testing process and will make everyone involved
very unhappy.

Extra Credit. Up to 10 points of extra credit are available for
implementing novel, and unique extensions to the base assignment. To apply
for extra credit, write a one paragraph description of what you have come
up with, and why you think it is interesting. Only highly original ideas
will be awarded extra credit.

Here are a few suggestions:

Add brushes that are substantially different from those you are required
to implement. Explain how your brushes are different and the types of effects
they allow you to create.

It can be time-consuming to paint an image manually. Add a feature so that
a whole painting can be created automatically. Describe your algorithm
for choosing the brush attributes in this automatic painting mode.

One problem with the base system is that you can not see which part of
the image you are painting while you paint. Solve this problem by showing
a dimmed version of the original image while you paint. Add controls to
show/remove the dimmed image from the canvas.

Add methods for orienting the brush to the x,y color gradient or the edges
in the original image.

Automatically find edges in the original image and clip long brush stokes
to those edges.

Note that some of these suggestions are much more difficult to implement
than others. We will judge the amount of extra credit you receive accordingly.