[Release] Polygons rotating, translating, dilating

Junior Spellweaver
Joined
Mar 24, 2009
Messages
173
Reaction score
18
PHP:
import javax.swing.JFrame;
import javax.swing.JOptionPane;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.Polygon;

@SuppressWarnings("serial")
public class Display extends JFrame implements MouseListener, MouseMotionListener {
    private Color GRID_COLOR = Color.BLACK;
    private Color SHAPE_COLOR = Color.RED;
    private Color BACKGROUND_COLOR = Color.BLACK;
    private Color BOX_COLOR = Color.GRAY;
    private int speed = 10;
    private double rate = 100;
    private double status = 0;
    private double frame = 0;
    private int DISPLAY_WIDTH = 900;
    private int DISPLAY_HEIGHT = 800;
    private int XG_OFFSET = 14;
    private int YG_OFFSET = 40;
    private int GRID_WIDTH = 500;  //only even numbers
    private int GRID_HEIGHT = 500; //only even numbers
    private int X_ZERO = XG_OFFSET + (GRID_HEIGHT / 2);
    private int Y_ZERO = YG_OFFSET + (GRID_WIDTH / 2);
    private int GRID_LINE = 3;
    int dragX = 608;
    int dragY = 608;
    private boolean first = true;
    private boolean fill = true;
    public static int MAX_POINTS = 100;
    private int run = 1;
    private NewPolygon save = new NewPolygon();
    public static String rotateFile = "rotate.png";
    public static String background = "background.jpg";
    public static String edwardpic = "edward.jpg";
    public int firstIt = 0;
    private boolean fat=true;
    String lol2,lol3;
    public String lol = JOptionPane.showInputDialog("What new matrix do you want? Format [x y]");
 
    public Display() {
        setSize(DISPLAY_WIDTH, DISPLAY_HEIGHT);
        getContentPane().setLayout(null);
        addMouseListener(this);
        addMouseMotionListener(this);
    }

    public void paint(Graphics g) {
        try {
            Thread.sleep(speed);
        } catch (InterruptedException e) {
        }
        drawLoop(g);
        drawComponents(g);
        nextGeneration();
    }
 
    void drawComponents(Graphics g) {
        if (fat)
        drawRotateButton(600, 600, g);
        else reset(g);
    }
   
    void reset(Graphics g) {
        drawRotateButton(0,0,g);
    }

    void drawLoop(Graphics g) {
        if (first) drawBackground(g);
        first = false;
        drawBox(g);
        if(fill) {drawShape(g); drawGrid(g);}
        else {drawGrid(g); drawShape(g);}
    }
 
    void drawBackground(Graphics g) {
        g.setColor(BACKGROUND_COLOR);
        g.fillRect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT);
    }

   
    void drawBox(Graphics g) {
        g.setColor(BOX_COLOR);
        g.fillRect(XG_OFFSET, YG_OFFSET, GRID_WIDTH, GRID_HEIGHT);
        g.fillRect(****650,300,100);
    }

    void drawGrid(Graphics g) {
        g.setColor(GRID_COLOR);
        g.drawLine(XG_OFFSET, Y_ZERO, XG_OFFSET + GRID_WIDTH - 1, Y_ZERO);
        g.drawLine(X_ZERO, YG_OFFSET, X_ZERO, YG_OFFSET + GRID_HEIGHT - 1);
        for (int n = 0; n <= 10; n++) {
            g.drawLine(X_ZERO - GRID_LINE, YG_OFFSET + roundInt((GRID_HEIGHT - 1) * n * 0.1),
                       X_ZERO + GRID_LINE, YG_OFFSET + roundInt((GRID_HEIGHT - 1) * n * 0.1));
            g.drawLine(XG_OFFSET + roundInt((GRID_WIDTH - 1) * n * 0.1), Y_ZERO - GRID_LINE,
                       XG_OFFSET + roundInt((GRID_WIDTH - 1) * n * 0.1), Y_ZERO + GRID_LINE);
        }
    }
 
    void drawShape(Graphics g) {
        NewPolygon p = new NewPolygon();
        if (run == 1) p = firstPolygon();
        else p = loadPolygon();
        switch (run) {
        case 1: drawTranslate(p, -25, 50); break;
        case 2: drawReflect(p, true); break;
        case 3: drawRotate(p, 2 * Math.PI); break;
        case 4:drawDilate(p, 0.5); break;
        }
        drawFinal(p, g);
    }

    NewPolygon firstPolygon() {
        NewPolygon p = new NewPolygon();
        p.addPoint(50, 50);
        p.addPoint(0, 0);
        p.addPoint(0, 100);
        lol2 = "" + lol.charAt(1);
        lol3 = "" + lol.charAt(3);
        if (lol2 != null && lol3 != null) {
        	p.addPoint(Integer.parseInt(lol2), Integer.parseInt(lol3));
        }
        System.out.println(lol2+lol3);
        return p;
    }
 
    NewPolygon loadPolygon() {
        NewPolygon p = new NewPolygon();
        for(int n = 0; n < save.index; n++) {
            p.addPoint(save.getX(n), save.getY(n));
        }
        return p;
    }
 
    void savePolygon(NewPolygon p) {
        save = p;
    }

    void drawFinal(NewPolygon p, Graphics g) {
        Polygon p2 = new Polygon();
        for(int n = 0; n < p.index; n++) {
            p2.addPoint(roundInt(p.getX(n)), roundInt(p.getY(n)));
        }
        p2.translate(X_ZERO, Y_ZERO);
        g.setColor(SHAPE_COLOR);
        if (fill) g.fillPolygon(p2);
        else g.drawPolygon(p2);
        if(status==rate) savePolygon(p);
        repaint();
    }
 
    void drawTranslate(NewPolygon p, double xtrav, double ytrav) {
        for (int n = 0; n < p.index; n++) {
            double x = p.getX(n);
            double y = p.getY(n);
            p.setPoint(x + frame * xtrav, y + frame * ytrav, n);
        }
    }
 
    void drawRotateButton(int x, int y, Graphics g) {
        Image img2 = Toolkit.getDefaultToolkit().getImage(background);
        Image img = Toolkit.getDefaultToolkit().getImage(rotateFile);
        g.drawImage(img2, dragX + img2.getWidth(null), dragY + img2.getHeight(null), null);
        g.drawImage(img, dragX - img.getWidth(null) / 2, dragY
                - img.getHeight(null) / 2, null);
    }
   
    void drawReflect(NewPolygon p, boolean axis) {
        for (int n = 0; n < p.index; n++) {
            double x = p.getX(n);
            double y = p.getY(n);
            double deltax = (2 * Math.abs(x) * frame);
            double deltay = (2 * Math.abs(y) * frame);
            double xfinal = x, yfinal = y;
            if (x > 0 && !axis) xfinal = x - deltax;
            if (x < 0 && !axis) xfinal = x + deltax;
            if (y > 0 &&  axis) yfinal = y - deltay;
            if (y < 0 &&  axis) yfinal = y + deltay;
            p.setPoint(xfinal, yfinal, n);
        }
    }

    void drawRotate(NewPolygon p, double theta) {
        double t = theta * frame;
        for (int n = 0; n < p.index; n++) {
            double x = p.getX(n);
            double y = p.getY(n);
            p.setPoint(x * Math.cos(t) - y * Math.sin(t),
                      (x * Math.sin(t) + y * Math.cos(t)), n);
        }
    }

    void drawDilate(NewPolygon p, double size) {
        double s = size - 1;
        for (int n = 0; n < p.index; n++) {
            double x = p.getX(n);
            double y = p.getY(n);
            p.setPoint(x + s * frame * x, y + s * frame * y, n);
        }
    }

    int roundInt(double n) {
        return (int) Math.round(n);
    }

    public void mouseClicked(MouseEvent e) {
        if (e.getX()>500 & e.getY()>500){
        }
    }
 
    boolean contains(Image img, MouseEvent e) {
        return ((e.getX()>(dragX - img.getWidth(null)))&&(e.getX()<(dragX + img.getWidth(null)))&&(e.getY()<(dragY + img.getHeight(null)))&&(e.getY()>(dragY - img.getHeight(null))));
    }
   
    public void mouseDragged(MouseEvent e) {
        Image img = Toolkit.getDefaultToolkit().getImage(rotateFile);
        if(contains(img, e)) {
            dragX = e.getX();
            dragY = e.getY();
        }
    }
   
    public void mousePressed(MouseEvent e) {}
   
    public void mouseReleased(MouseEvent e) {
        if(dragX < 400 && dragY < 750 && dragY > 650 && dragX>100){
            fat=true;
        } else fat=false;
        System.out.println(fat);
        painter();
    }
    public void mouseEntered(MouseEvent arg0) {}
    public void mouseExited(MouseEvent arg0) {}
    public void mouseMoved(MouseEvent arg0) {}
 
    void nextGeneration() {
        if (status < rate){
            status++;
            frame = status/rate;
        } else {
            status = 0;
            frame = 0;
            run++;
        }
    }
   
    void painter() {
        repaint();
    }
}

PHP:
public class NewPolygon {
    int MAX_POINTS = Display.MAX_POINTS;
    public int index = 0;
    public double[] x;
    public double[] y;
   
    public NewPolygon() {
        x = new double[MAX_POINTS];
        y = new double[MAX_POINTS];
    }
   
    void addPoint(double x, double y) {
        this.x[index] = x;
        this.y[index] = y;
        index++;
    }
   
    void setPoint(double x, double y, int n) {
        this.x[n] = x;
        this.y[n] = y;
    }
   
    double getX(int n) {return x[n];}
   
    double getY(int n) {return y[n];}
}

PHP:
import javax.swing.JFrame;

public class Main {      
    public static Display display = new Display();
  
    public static void main(String[] args) {                      
        display.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        display.setVisible(true);
    }
}
 
Back