Homework 5, due Wednesday, March 10.
When you have finished the assignment below,
email your source code to the grader,
and post the working applet onto the web.
Make sure the grader knows the URL of your web site
(it should match the one on the class page - if it doesn't, then tell him so).
For next week I'd like you to put together a simple
interactive polygon editor, along the lines of what we
discussed in class this week.
It should respond to mouse down events by going into
one of three modes:
- If the user clicks the mouse very close to the vertex
of any polygon (s)he has made, then your system should
go into a mode in which dragging the mouse
drags the location of that vertex (thereby modifying
the shape of the polygon).
- Otherwise, if the user clicks the mouse down outside of any
existing polygon, then the system should begin a new
polygon.
In this mode,
allow the user to left click at successive locations
to build up a polygon one vertex at a time.
The user finishes this mode,
indicating that the polygon is complete,
by clicking very near to the first vertex.
When that happens your system should close the polygon.
It's ok if you implement your system so that it
only works properly with convex polygons.
- Otherwise, the user has clicked the mouse inside of some
finished polygon. In this mode, the user
translates that polygon by dragging the mouse.
Note that you need to be able to detect when a mouse click
is very near a vertex, and also when a mouse click is inside
of a polygon.
As you recall from the last class, detecting when a mouse click
is within five pixels of a vertex is done by the following algorithm:
idNear = -1;
dsNear = 10000.0;
for (id = 0 ; id < nVertices ; id++) {
ds = distanceSquared(mouse, vertex);
if (ds < 5*5) {
idNear = id;
dsNear = ds;
}
}
if (idNear >= 0) {
/* USER CLICKED ON A VERTEX */
}
else {
/* USER DID NOT CLICK ON A VERTEX */
}
You can check whether a mouse click location is inside a polygon
by any of a number of methods, as we discussed in class.
Probably the simplest is to precompute the half-plane coefficients
(ie: the coefficients A,B,C that define Ax + By + C >= 0)
associated with each edge of the polygon, and to check
whether the mouse location is on the "inside" of
each of these half-planes.
When I say "precompute", what I mean is that for
efficiency, you should only calculate the half-plane equation
coefficients
at the following times:
- when the user has just finished defining the points of a new polygon or
- when the user has just finished dragging the vertex of a polygon.
Remember from our last class that you can
compute coeffients for the line between
(px,py) and (qx,qy) by:
dx = qx - px
dy = qy - py
A = -dy
B = dx
C = - ( pxA + pyB )
I'm going to give lots of options for extra credit on this assignment.
Feel free to do however many of these you want:
- Give the user a color palette.
When the user clicks on a color in this palette,
then that becomese the color of the
next polygons created (until the user clicks
somewhere else on the color palette to change the color).
- Detect when two polygons intersect, and show
the intersection in some clearly distinguished color.
It's just fine with me if you make this to only work for convex polygons.
- Add ways that the user can interactively do rotate and scale on polygons.
- Anything really cool you can think of, along the lines of the
discussion we had during the previous two classes.