Description
Overview
This assignment tests your understanding of encapsulation and constructors, and their
implementations in Java. You are required to implement 2 classes, namely Shape and
RegularPolygon. The RegularPolygon class is used to model regular n-sided polygons, and it
is a subclass of the Shape class which provides an abstraction of general shapes. For each of
the 2 classes mentioned above, you are required to design and implement a tester class to test
the correctness of your implementation. You are also required to write Javadoc for all public
classes and their public class members.
Specifications
The Shape class
The Shape class is used to model general shapes. It has private instance variables for storing
color, fill-type, orientation, screen coordinates of the center, and the local coordinates of the
vertices of a shape. It has public getters and setters for accessing its private instance variables.
It also has public methods for translating and rotating a shape, and for getting the screen
coordinates of the vertices of a shape. Below is a detailed description for the Shape class.
Specification of the Shape class:
private instance variables
Color color – a Color object specifying the color of the shape.
boolean filled – a boolean value specifying whether the shape is filled or not filled.
double theta – a double value specifying the orientation (in radians) of the shape in the
screen coordinate system.
double xc – a double value specifying the x-coordinate of the center of the shape in the
screen coordinate system.
double yc – a double value specifying the y-coordinate of the center of the shape in the
screen coordinate system.
double[] xLocal – an array of double values specifying the x-coordinates of the
vertices (in counter clock-wise order) of the shape in its local coordinate system.
double[] yLocal – an array of double values specifying the y-coordinates of the
vertices (in counter clock-wise order) of the shape in its local coordinate system.
public methods:
Color getColor() – a method for retrieving the color of the shape.
boolean getFilled() – a method for retrieving the fill-type of the shape.
double getTheta() – a method for retrieving the orientation (in radians) of the shape in
the screen coordinate system.
double getXc() – a method for retrieving the x-coordinate of the center of the shape in
the screen coordinate system.
double getYc() – a method for retrieving the y-coordinate of the center of the shape in
the screen coordinate system.
double[] getXLocal() – a method for retrieving the x-coordinates of the vertices (in
counter clock-wise order) of the shape in its local coordinate system.
double[] getYLocal() – a method for retrieving the y-coordinates of the vertices (in
counter clock-wise order) of the shape in its local coordinate system.
void setColor(Color color) – a method for setting the color of the shape.
void setFilled(boolean filled) – a method for setting the fill-type of the shape.
void setTheta(double theta) – a method for setting the orientation of the shape.
void setXc(double xc) – a method for setting the x-coordinate of the center of the
shape in the screen coordinate system.
void setYc(double yc) – a method for setting the y-coordinate of the center of the
shape in the screen coordinate system.
void setXLocal(double[] xLocal) – a method for setting the x-coordinates of the
vertices (in counter clock-wise order) of the shape in its local coordinate system.
void setYLocal(double[] yLocal) – a method for setting the y-coordinates of the
vertices (in counter clock-wise order) of the shape in its local coordinate system.
void translate(double dx, double dy) – a method for translating the center of the
shape by dx and dy, respectively, along the x and y directions of the screen coordinate
system. (i.e., dx and dy should be added to xc and yc respectively.)
void rotate(double dt) – a method for rotating the shape about its center by an angle
of dt (in radians). (i.e., dt should be added to theta.)
int[] getX() – a method for retrieving the x-coordinates of the vertices (in counter
clock-wise order) of the shape in the screen coordinate system*.
int[] getY() – a method for retrieving the y-coordinates of the vertices (in counter
clock-wise order) of the shape in the screen coordinate system*.
* Please refer to the formula given in assignment 1 on how to compute the screen
coordinates of the vertices of a shape from its local coordinates based on its center and
orientation.
The RegularPolygon class
The RegularPolygon class is a subclass of the Shape class, and is used to model regular nsided polygons. Besides the properties it inherited from the Shape class, the RegularPolygon
class also declares a number of private instance variables for storing the number of sides and
the radius of a polygon. It has public getters and setters for accessing its private instance
variables. It also has public methods for setting the local coordinates of the vertices of a
polygon and for checking if a point (in the screen coordinate system) is contained by a
polygon. Below is a detailed description for the RegularPolygon class.
Specification of the RegularPolygon class:
public constructors:
RegularPolygon(int n, double r) – a constructor for building a regular n-sided
polygon with a radius of r. (Note that if the argument n is less than 3, the number of
sides will be set to 3; if the argument r is less than 0, the radius will be set to 0).
RegularPolygon(int n) – a constructor for building a regular n-sided polygon with a
radius of 1.0. (Note that if the argument n is less than 3, the number of sides will be set
to 3).
RegularPolygon() – a constructor for building a regular 3-sided polygon with a radius
of 1.0.
private instance variables:
int numOfSides – an integer value specifying the number of sides of the regular n-sided
polygon.
double radius – a double value specifying the radius of the regular n-sided polygon.
public/private methods:
int getNumOfSides() – a method for retrieving the number of sides of the regular
polygon.
double getRadius() – a method for retrieving the radius of the regular polygon.
void setNumOfSides(int n) – a method for setting the number of sides of the regular
n-sided polygon. This method should also reset the local coordinates of the vertices of
the regular n-sided polygon. (Note that if the argument n is less than 3, the number of
sides will be set to 3).
void setRadius(double r) – a method for setting the radius of the regular n-sided
polygon. This method should also reset the local coordinates of the vertices of the
regular n-sided polygon. (Note that if the argument r is less than 0, the radius will be
set to 0).
void setVertices() – a method for setting the local coordinates of the vertices of the
regular n-sided polygon based on its number of sides and radius (see appendix). If the
number of sides is an odd number, the first vertex should lie on the positive x-axis and
its distance from the origin is given by the radius of the regular n-sided polygon. The
rest of the vertices can be obtained by rotating this vertex about the origin by a multiple
of 2p/n, where n is the number of sides, in a counter clock-wise manner (see figure 1).
Figure 1. Examples of regular n-sided polygons with an odd number of sides.
If the number of sides is an even number, the first vertex should lie in the first quadrant
(i.e., both its x and y coordinates being positive) and make an angle of p/n, where n is
the number of sides, with the positive x-axis. Its distance from the origin is again given
by the radius of the regular n-sided polygon. Similarly, the rest of the vertices can be
obtained by rotating this vertex about the origin by a multiple of 2p/n, where n is the
number of sides, in a counter clock-wise manner (see figure 2).
Figure 2. Examples of regular n-sided polygons with an even number of sides.
boolean contains(double x, double y) – a method for determining if a point (x, y) in
the screen coordinate system is contained by the regular n-sided polygon. A point is
considered to be contained by a polygon if it lies either completely inside the polygon,
or on any of the sides or vertices of the polygon (see appendix).
For the above methods of the RegularPolygon class, you should decide whether you declare
them as public or private depending on whether they are supposed to be called from outside
the class.
The tester classes
The tester classes are used to verify the correctness of your implementation of the above 2
classes. You should design your own tester classes. Generally, your tester class should create
an object of a class and access all its public instance variables and methods using the dot
x
y
� = #$
%
x
y
� = #$
&
radius
radius
first vertex
first vertex
x
y
� = #$
‘
x
y
� = #$
(
radius
radius
� = $
(
first vertex
� = $
‘
first vertex
operator, and print out debugging messages to the console. (You do not need to actually draw
the shapes in your tester classes!)
A simple GUI for visualization
Figure 3. Assign2_GUI.java implements a simple GUI for visualizing the shape classes.
Assign2_GUI.java implements a simple GUI for you to test and visualize your shape classes.
You can select the number of sides and color on the tools panel on the left, and draw a
regular n-sided polygon by clicking and dragging with your left mouse button in the drawing
canvas on the right. You can also select and move an existing polygon by clicking and
dragging with your right mouse button. Finally, you can select and remove an existing
polygon by clicking with your right mouse button while holding the crtl-key down.
Marking Scheme
Marks are distributed as follows:
– Implementation of the Shape class and its tester class (20%)
– Implementation of the RegularPolygon class and its tester class (40%)
– Proper design and use of encapsulation (20%)
– Javadoc and comments (20%)
Submission
Please pack the source code (*.java) of your shape classes and tester classes into a single zip
file, and submit it to the course Moodle page.
A few points to note:
– Always remember to write Javadoc for all public classes and their public class
members.
– Always remember to submit the source code files (*.java) but NOT the bytecode
files (*.class).
– Always double check after your submission to ensure that you have submitted the
most up-to-date source code files.
– Your assignment will not be marked if you have only submitted the bytecode files
(*.class). You will get zero mark for the assignment.
– Please submit your assignment on time. Late submission will not be accepted.
~ End ~
Appendix
Local coordinates of the vertices of a regular n-sided polygon
For a regular n-sided polygon with a radius of r, the local coordinates of its i-th vertex can be
computed using the following formula:
�+ = � cos(� − ��)
�+ = � sin(� − ��)
where � ∈ {0,1, . . , � − 1}, � = 2�/�, � = 0 if n is odd (see figure 1) or �/� if n is even (see
figure 2).
Transforming a point from screen coordinates into local coordinates
Given a point defined in the screen coordinate system, it can be transformed into a point
defined in the local coordinate system of the polygon using the following formula:
� = (�B − ��) cos(−�) − (�B − ��) sin(−�)
� = (�B − ��) sin(−�) + (�B − ��) cos(−�)
where (x, y) and (x’, y’) denote the local and screen coordinates of the point, respectively, �
the orientation (in radians) of the shape, and (xc, yc) the screen coordinates of the center of
the shape.
Checking if a point is contained by a regular n-sided polygon
Figure 4. Checking if a point is contained by a triangle.
Consider a regular 3-sided polygon (i.e., a triangle) and a point (x, y) defined in the local
coordinate system of the triangle. Referring to figure 4, obviously the point must lie outside
the triangle if it lies to the left of the vertical (red) side of the triangle. This condition can be
checked easily by simply comparing the x-coordinate of the point with that of the vertices
forming the vertical (red) side. In figure 4, since the point lies to the right of the vertical (red)
side, further checking against the other 2 sides is needed.
x
y
� = #$
&
(x, y)
Figure 5. Checking if a point is contained by a triangle.
To simplify the checking, both the triangle and the point are rotated together about the origin
by an angle of 2�/3, giving raise to the configuration in figure 5. The point is now checked
against the vertical (blue) side. Since the point lies to the right of the vertical (blue) side,
further checking against the remaining side is needed.
Figure 6. Checking if a point is contained by a triangle.
Same as above, both the triangle and the point are rotated together about the origin again by
an angle of 2�/3, giving raise to the configuration in figure 6. This time the point lies to the
left of the vertical (green) side, and therefore it can be concluded that the point is not
contained by the triangle.
Note that in the above process, the triangle stays unchanged after each rotation. Hence, it is
only necessary to rotate the point when carrying out the checking. If the point does not lie to
the left of the vertical side after each rotation, it can then be concluded that the point is
contained by the triangle, otherwise the point is not contained by the triangle. This method
can be generalized and applied to check if a point is contained by a regular n-sided polygon.
In this case, the point has to be rotated (n – 1) times about the origin by an angle of 2�/�.
x
y
x
y