Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import javax.swing.*;
- import javax.swing.Timer;
- import java.awt.*;
- import java.util.*;
- import java.util.List;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.awt.event.KeyEvent;
- import java.awt.event.KeyListener;
- import static java.lang.Math.*;
- public class Geom extends JFrame {
- private class PaintPanel extends JPanel {
- double maxX = 1000 / 10;
- double maxY = 1000 / 10;
- double minX = -maxX;
- double minY = -maxY;
- int state = 0;
- double[][] cord = new double[3][3];
- double[][] center;
- public PaintPanel() {
- addKeyListener(new KeyListener() {
- public void keyPressed(KeyEvent arg0) {
- }
- public void keyReleased(KeyEvent arg0) {
- }
- public void keyTyped(KeyEvent key) {
- if (key.getKeyChar() == ' ') {
- state = (state + 1) % MOD;
- repaint();
- }
- System.err.println(state);
- }
- });
- new Timer(100, new ActionListener() {
- public void actionPerformed(ActionEvent arg0) {
- repaint();
- }
- }).start();
- setFocusable(true);
- }
- public void paintComponent(Graphics g) {
- super.paintComponents(g);
- Graphics2D g2 = (Graphics2D) g;
- g2.setColor(Color.black);
- g2.fill(new Rectangle(getSize()));
- paintAxis(g2);
- g2.setColor(Color.yellow);
- if (false) {
- if (state == 0) {
- cord = createNewTriangle();
- } else if (state == 1) {
- double dx = cord[0][0];
- double dy = cord[0][1];
- for (int i = 0; i < cord.length; ++i) {
- cord[i] = move(cord[i], -dx, -dy);
- }
- } else if (state == 2) {
- double angle = Math.PI - Math.atan2(cord[1][1], cord[1][0]);
- for (int i = 0; i < cord.length; ++i) {
- cord[i] = rotate(cord[i], angle);
- }
- } else if (state == 3) {
- for (int i = 0; i < cord.length; ++i) {
- cord[i] = scale(cord[i], -1, -1);
- }
- } else if (state == 4) {
- double[][] ncord = new double[4][];
- ncord[0] = cord[1];
- ncord[1] = cord[2];
- ncord[2] = new double[] {-cord[1][0], -cord[1][1], 1};
- ncord[3] = new double[] {-cord[2][0], -cord[2][1], 1};
- cord = ncord;
- } else if (state == 5) {
- double kx = 1;
- double ky = Math.abs((cord[1][0] + cord[2][0]) / (cord[1][1] + cord[2][1]));
- for (int i = 0; i < cord.length; ++i) {
- cord[i] = scale(cord[i], kx, ky);
- }
- } else if (state == 6) {
- double dx = 0;
- for (int i = 0; i < cord.length; ++i) {
- dx = Math.max(dx, Math.abs(cord[i][0]));
- }
- for (int i = 0; i < cord.length; ++i) {
- if (Math.abs(cord[i][0]) < 1e-9) {
- if (cord[i][1] > 0) {
- cord[i] = move(cord[i], dx, 0);
- } else if (cord[i][1] < 0){
- cord[i] = move(cord[i], -dx, 0);
- }
- }
- }
- }
- } else {
- if (state == 0) {
- cord = createNewFigure();
- center = createNewCenter();
- } else {
- for (int i = 0; i < cord.length; ++i) {
- double dx = center[0][0];
- double dy = center[0][1];
- cord[i] = move(cord[i], -dx, -dy);
- cord[i] = rotate(cord[i], Math.PI / 150);
- cord[i] = move(cord[i], dx, dy);
- }
- }
- drawPolygon(cord, g2);
- drawPolygon(center, g2);
- }
- }
- int MOD = Integer.MAX_VALUE / 2;
- private double[][] createNewCenter() {
- double[][] res = new double[][] {{maxX / 5, maxY / 5, 1},
- {maxX / 5, maxY / 5, 1}};
- return res;
- }
- private double[][] createNewFigure() {
- double x = maxX / 10;
- double y = maxY / 8;
- double dx = maxX / 10;
- double dy = maxY / 3;
- double[][] res = new double[][] { {-x, -y, 1},
- {-x - dx / 2, -y, 1},
- {-x - dx, -y - dy, 1},
- {-x, -y -dy, 1}};
- return res;
- }
- private double[] scale(double[] a, double kx, double ky) {
- double[][] m = new double[][] { {kx, 0, 0},
- {0, ky, 0},
- {0, 0, 1} };
- return multiply(a, m)[0];
- }
- private void drawPolygon(double[][] cord, Graphics2D g2) {
- for (int i = 0; i < cord.length; ++i) {
- drawLine(cord[i][0], cord[i][1], cord[(i + 1) % cord.length][0], cord[(i + 1) % cord.length][1], g2);
- }
- }
- private double[][] createNewTriangle() {
- double[][] cord = new double[3][];
- Random rm = new Random();
- double x = (rm.nextDouble() + 0.5) * maxX / 3;
- double y = (rm.nextDouble() + 0.5) * maxY / 3;
- cord[0] = new double[] {0, 0, 1};
- cord[1] = new double[] {0, y, 1};
- cord[2] = new double[] {x, 0, 1};
- double dx = (rm.nextDouble() + 0.0) * maxX / 3 + maxX / 5;
- double dy = (rm.nextDouble() + 0.0) * maxY / 3 + maxY / 5;
- for (int i = 0; i < 3; ++i) {
- cord[i] = move(cord[i], dx, dy);
- }
- double angle = Math.PI * rm.nextDouble();
- for (int i = 0; i < 3; ++i) {
- cord[i] = rotate(cord[i], angle);
- }
- return cord;
- }
- private double[] rotate(double[] a, double angle) {
- double[][] m = new double[][] { {cos(angle), sin(angle), 0},
- {-sin(angle), cos(angle), 0},
- {0, 0, 1}};
- return multiply(a, m)[0];
- }
- private double[] move(double[] a, double dx, double dy) {
- double[][] m = new double[][] { {1, 0, 0},
- {0, 1, 0},
- {dx, dy, 1}};
- return multiply(a, m)[0];
- }
- private double[][] multiply(double[] cord, double[][] b) {
- double[][] a = new double[][] {cord};
- double[][] res = new double[a.length][b[0].length];
- for (int i = 0; i < res.length; ++i) {
- for (int j = 0; j < res[i].length; ++j) {
- for (int k = 0; k < a[i].length; ++k) {
- res[i][j] += a[i][k] * b[k][j];
- }
- }
- }
- return res;
- }
- private void paintAxis(Graphics2D g2) {
- g2.setColor(Color.green);
- drawLine(minX, 0, maxX, 0, g2);
- drawLine(0, minY, 0, maxY, g2);
- }
- private void drawLine(double x, double y, double x2, double y2, Graphics2D g2) {
- int ix = screenX(x);
- int iy = screenY(y);
- int ix2 = screenX(x2);
- int iy2 = screenY(y2);
- g2.drawLine(ix, iy, ix2, iy2);
- }
- private int screenY(double y) {
- Dimension dim = getSize();
- return (int) (dim.height * (1 - (y - minX) / (maxX - minX)));
- }
- private int screenX(double x) {
- Dimension dim = getSize();
- return (int) (dim.width * (x - minX) / (maxX - minX));
- }
- }
- public Geom() {
- Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
- setBounds(10, 10, 1000, 1000);
- add(new PaintPanel());
- setDefaultCloseOperation(EXIT_ON_CLOSE);
- setVisible(true);
- }
- public static void main(String[] args) {
- new Geom();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement