In keeping with my strange mathematical tendencies, I decided that it would be a good idea to draw a heptagon in Java for a (would-be) simple homework assignment.
Seeing as I've obviously already worked with Java graphics and drawing (see NCSpiral!), this should be no problem, right?
It's actually a real pain since I forgot most of my trig...
But, in any case, here you go!
It ought to look at least something like this:
Seeing as I've obviously already worked with Java graphics and drawing (see NCSpiral!), this should be no problem, right?
It's actually a real pain since I forgot most of my trig...
But, in any case, here you go!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.awt.*; | |
public class Heptagon { | |
private int x, y, radius; | |
private double area; | |
private Color theColor; | |
private boolean isVisible; | |
private Polygon polygon; | |
/** | |
* Construct a new Heptagon centered at initX, initY with a | |
* color indicated by initColor. The new Heptagon is visible by | |
* default. | |
* | |
* @param initX the x coordinate of the center of the 7-sided thingy. | |
* @param initY the y coordinate of the center of the heptagon. | |
* @param initRadius an arbitrary value of the distance from (initX, initY) to a point at which | |
* two sides meet at roughly 5(pi)/7 radians | |
* @param initColor the color of the heptagon. | |
*/ | |
public Heptagon(int initX, int initY, int initRadius, Color initColor) { | |
x = initX; | |
y = initY; | |
radius = initRadius; | |
theColor = initColor; | |
isVisible = true; | |
polygon = new Polygon(); | |
} | |
/** | |
* Increases the size of the heptagon by the specified factor. | |
* @param factor the amount by which you wish to increase the area of the heptagon. | |
*/ | |
@Override | |
public void scale(double factor) { | |
if (factor > 0) { | |
radius = (int) (Math.round(radius * factor)); | |
} | |
} | |
/** | |
* Move the center of the heptagon. | |
* @param newX | |
* @param newY | |
*/ | |
public void move(int newX, int newY) { | |
x = newX; | |
y = newY; | |
polygon.reset(); | |
} | |
/** | |
* Draws the heptagon using a Graphics object. | |
* Points are calculated and placed based on the radius relative | |
* to the starting x and y co-ordinates using basic trigonometric functions | |
* and therefore may not create a perfect regular heptagon where all sides | |
* meet at 5(pi)/7 radians. | |
* @param g a pointer to a pre-initialized Graphics drawing object. | |
*/ | |
public void draw(Graphics g) { | |
g.setColor(theColor); | |
for (int i = 0; i < 7; i++){ | |
polygon.addPoint((int) (x + radius * Math.cos(i * 2 * Math.PI / 7)), | |
(int) (y + radius * Math.sin(i * 2 * Math.PI / 7)));} | |
g.drawPolygon(polygon); | |
g.fillPolygon(polygon); | |
} | |
/** | |
* Calculates and returns the area of the heptagon accurate to 2 decimal places | |
* using the formula A = 7/4 * a^2 * cot(pi/7) where a is the length of a side | |
* calculated based on the radius relative to the starting x and y co-ordinates. | |
* @return area the approximate area of the heptagon, accurate to ~2 decimal places. | |
*/ | |
public Double getArea() { | |
// imagine we make points 1 and 2 from the draw() method above | |
double x1 = x + radius * Math.cos(1 * 2 * Math.PI / 7); | |
double x2 = x + radius * Math.cos(2 * 2 * Math.PI / 7); | |
double y1 = y + radius * Math.sin(1 * 2 * Math.PI / 7); | |
double y2 = y + radius * Math.sin(2 * 2 * Math.PI / 7); | |
// calculate the distance between these points | |
double xd = Math.abs(x1-x2); | |
double yd = Math.abs(y1-y2); | |
// and finally, determine the length of one side of the heptagon | |
double side = Math.sqrt((Math.pow(xd, 2))+(Math.pow(yd, 2))); | |
// now implement the area formula mentioned above | |
area = ((7/4) * Math.pow(side, 2)) * (1/(Math.tan((Math.PI / 7)))); | |
return area; | |
} | |
/** | |
* Tells you the current color being used for drawing. | |
* @return theColor the current color being used for drawing. | |
*/ | |
@Override | |
public Color getColor() { | |
return theColor; | |
} | |
/** | |
* Sets a new color for drawing. | |
* @param newColor the new color you wish to use. | |
*/ | |
@Override | |
public void setColor(Color newColor) { | |
theColor = newColor; | |
} | |
/** | |
* Sets the heptagon to visible or not. | |
* @param visible true for visible, false for hidden. | |
*/ | |
@Override | |
public void setVisible(boolean visible) { | |
isVisible = visible; | |
} | |
/** | |
* Tells you whether the heptagon is visible. | |
* @return isVisible true if visible, false if hidden. | |
*/ | |
@Override | |
public boolean isVisible() { | |
return isVisible; | |
} | |
} |
It ought to look at least something like this:
No comments:
Post a Comment