Homework 05 Due 02102015 1155pm Triangles Oh Fractals Object
Homework 05 Due 02/10/2015 11:55pm Triangles! Oh Fractals! Objective: Write a program in which draws (yes it actually makes a picture) a triangular fractal using recursion. This is best if done using a java applet. Suggested Methodology The idea for it is this First draw a filled equilateral triangle Next draw another filled equilateral triangle of a different color that’s upside down in the middle of that triangle Using the other triangles formed repeat step 2 until a pixel limit of 4 is reached HINTS: It may be a good idea to look at the examples I gave 02/12/2015 The method fillPolygon(int[] xPoints, int[] yPoint, numberOfPoints) as called by the graphics device is important The method setColor(Color aColor) is important for picking different colors to draw things.
Solution
Here is the code:
Fratctal.java
package trai;
import javax.swing.*;
import java.awt.*;
class FrctalPanel extends JPanel
{
private String type;
private Color fregrnd, bckgrnd;
public FrctalPanel(String type, Color fregrnd, Color bckgrnd)
{
super();
this.type = type;
this.fregrnd = fregrnd;
this.bckgrnd = bckgrnd;
}
private static Coordinates mid(Coordinates a, Coordinates b)
{
return new Coordinates((a.x+b.x)/2, (a.y+b.y)/2);
}
private static Coordinates third(Coordinates a, Coordinates b)
{
return new Coordinates((b.x-a.x)/3+a.x, (b.y-a.y)/3+a.y);
}
private static double dist(Coordinates a, Coordinates b)
{
return Math.sqrt(Math.pow(b.x-a.x,2)+Math.pow(b.y-a.y,2));
}
private static void drawKochSide(Graphics2D g2, Coordinates a1, Coordinates b1)
{
//if lines are only 1 pixels in length
if (dist(a1,b1)<=1)
{
g2.drawLine((int)a1.x, (int)a1.y, (int)b1.x, (int)b1.y);
}
else
{
Coordinates c = new Coordinates(Math.cos(Math.PI/3.0 + Math.atan2(b1.y-a1.y,b1.x-a1.x))*
(dist(a1,b1)/3)+third(a1,b1).x,
Math.sin(Math.PI/3.0 + Math.atan2(b1.y-a1.y,b1.x-a1.x))*
(dist(a1,b1)/3)+third(a1,b1).y);
drawKochSide(g2, a1, third(a1,b1));
drawKochSide(g2, third(a1,b1), c);
drawKochSide(g2, c, mid(third(a1,b1), b1));
drawKochSide(g2, mid(third(a1,b1),b1), b1);
}
}
private static void drawSierpinski(Graphics2D g, Coordinates a, Coordinates b, Coordinates c)
{
if (dist(a,b)<=2) // if lines are only 2 pixels in length
{
g.drawLine((int)a.x, (int)a.y, (int)b.x, (int)b.y);
g.drawLine((int)b.x, (int)b.y, (int)c.x, (int)c.y);
g.drawLine((int)c.x, (int)c.y, (int)a.x, (int)a.y);
}
else
{
drawSierpinski(g, a, mid(a,b), mid(a,c));
drawSierpinski(g, mid(a,b), b, mid(b,c));
drawSierpinski(g, mid(a,c), mid(b,c), c);
}
}
public void paintComponent(Graphics g)
{
double w = getSize().getWidth();
double h = getSize().getHeight();
g.setColor(bckgrnd);
g.fillRect(0, 0, (int)w, (int)h);
g.setColor(fregrnd);
Graphics2D g2 = (Graphics2D)g;
if (\"Sierpinski\".equalsIgnoreCase(type))
{
drawSierpinski(g2, new Coordinates(0, h), new Coordinates(w/2.0, 0), new Coordinates(w, h));
}
else
{
double ox = 0.0, oy = 0.0;
if ((w*2.0*Math.sqrt(3.0))<h*3.0)
{
h = (w * 2.0 * Math.sqrt(3.0)) / 3.0;
oy = (getSize().getHeight()-1 - h)/2.0;
}
if ((w*2.0*Math.sqrt(3.0))>h*3.0)
{
w = (h * 3.0) / (2 * Math.sqrt(3.0));
ox = (getSize().getWidth()-1 - w)/2.0;
}
drawKochSide(g2, new Coordinates(w/2.0+ox, oy), new Coordinates(ox, h*0.75+oy));
drawKochSide(g2, new Coordinates(w+ox, h*0.75+oy), new Coordinates(w/2.0+ox, oy));
drawKochSide(g2, new Coordinates(ox, h*0.75+oy), new Coordinates(w+ox, h*0.75+oy));
}
}
}
class Coordinates
{
public double x, y;
public Coordinates(double x, double y)
{
this.x = x;
this.y = y;
}
}
class GraphWindow extends JFrame
{
private Container c;
public GraphWindow()
{
super(\"Fractal Maker\");
c = getContentPane();
c.add(new FrctalPanel(\"Kosh\", Color.white, Color.darkGray));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(600,520);
}
}
public class Fractal extends JApplet
{
public void init()
{
Container cont = getContentPane();
cont.add(new FrctalPanel(\"Sierpinski\", Color.blue, Color.white));
}
public static void main(String [] args)
{
GraphWindow app = new GraphWindow();
Dimension scrn = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frme = app.getSize();
if (frme.height > scrn.height) frme.height = scrn.height;
if (frme.width > scrn.width) frme.width = scrn.width;
app.setLocation((scrn.width - frme.width) / 2, (scrn.height - frme.height) / 2);
app.setVisible(true);
}
}


