package graphic; import java.awt.*; import javax.swing.*; import java.awt.event.*; public class EnterF extends JFrame { String f = ""; double x1; double x2; double y1; double y2; TextField Tf; TextField Tx1; TextField Tx2; TextField Ty1; TextField Ty2; JFrame JF; JPanel JP; JButton b; JLabel er; EnterF() { JF = new JFrame(); JF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JP = new JPanel(); JF.add(JP); JP.setBackground(Color.green); JP.setLayout(null); b = new JButton("GO"); JF.setSize(500, 500); JF.setTitle("График функции"); Tf = new TextField(); Tx1 = new TextField("", 40); Tx2 = new TextField("", 40); Ty1 = new TextField("", 40); Ty2 = new TextField("", 40); Tf.setLocation(100, 60); Tf.setSize(300, 25); Tx1.setLocation(60, 100); Tx2.setLocation(180, 100); Tx1.setSize(50, 20); Tx2.setSize(50, 20); JP.add(Tx1); JP.add(Tx2); Ty1.setLocation(60, 145); Ty2.setLocation(180, 145); Ty1.setSize(50, 20); Ty2.setSize(50, 20); JP.add(Ty1); JP.add(Ty2); JP.add(Tf); JLabel Lf = new JLabel("Введите функцию:"); JLabel Lfx = new JLabel("F(x) ="); JLabel Lx1 = new JLabel("X от:"); JLabel Lx2 = new JLabel("до:"); JLabel Ly1 = new JLabel("Y от:"); JLabel Ly2 = new JLabel("до:"); Lf.setLocation(20, 20); Lf.setSize(140, 20); JP.add(Lf); Lfx.setLocation(10, 60); Lfx.setSize(40, 20); JP.add(Lfx); Lx1.setLocation(14, 100); Lx1.setSize(40, 20); JP.add(Lx1); Lx2.setLocation(150, 100); Lx2.setSize(40, 20); JP.add(Lx2); Ly1.setLocation(14, 145); Ly1.setSize(40, 20); JP.add(Ly1); Ly2.setLocation(150, 145); Ly2.setSize(40, 20); JP.add(Ly2); b.setLocation(190, 180); b.setSize(60, 50); JP.add(b); er = new JLabel(""); er.setLocation(10, 210); er.setSize(170, 20); JP.add(er); JF.setVisible(true); JF.setResizable(false); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { f = Tf.getText(); if (!f.equals("")) { set(""); x1 = Double.parseDouble(Tx1.getText()); x2 = Double.parseDouble(Tx2.getText()); try { if (x1 < x2) { set(""); y1 = Double.parseDouble(Ty1.getText()); y2 = Double.parseDouble(Ty2.getText()); try { if (y1 < y2) { set(""); set("УРА!"); try { Paint p = new Paint(x1, x2, y1, y2, f); } catch (Exception w3) { set("класс Paint - говно!"); System.out.println(w3); } } else { set("некорректный интервал Y"); } } catch (Exception w1) { set("некорректные координаты"); } } else { set("некорректный интервал X"); } } catch (Exception w2) { set("некорректные координаты"); } } else { set("ВВедите функцию"); } } }); } public void set(String s) { er.setText(s); } public static void main(String args[]) { new EnterF(); } } package graphic; import java.util.*; public class calc { ArrayList post; calc(String Func) { ArrayList list = new ArrayList(); list.add("("); String[] ar = new String[1]; ar = (Func + " ").split(" "); String f = ""; for (int i = 0; i < ar.length; i++) { f = f + ar[i]; } ar = f.split(""); int ind = 0; for (int i = 0; i < ar.length; i++) { if (ar[i].equals("+") | ar[i].equals("-") | ar[i].equals("*") | ar[i].equals("/") | ar[i].equals("(") | ar[i].equals(")") | ar[i].equals("^")) { String s = ""; for (int j = ind; j < i; j++) { s = s + ar[j]; } list.add(s); list.add(ar[i]); ind = i + 1; } else { if ((i + 2) < ar.length) { if ((ar[i] + ar[i + 1] + ar[i + 2]).equals("sin") | (ar[i] + ar[i + 1] + ar[i + 2]).equals("cos") | (ar[i] + ar[i + 1] + ar[i + 2]).equals("ctg")) { list.add(ar[i] + ar[i + 1] + ar[i + 2]); i = i + 2; ind = i + 1; } } else { if ((i + 1) < ar.length) { if ((ar[i] + ar[i + 1]).equals("tg") | (ar[i] + ar[i + 1]).equals("ln") | (ar[i] + ar[i + 1]).equals("lg") | (ar[i] + ar[i + 1]).equals("Pi")) { list.add(ar[i] + ar[i + 1] + ar[i + 2]); i = i + 1; ind = i + 1; } } } } } String s = ""; for (int j = ind; j < ar.length; j++) { s = s + ar[j]; } list.add(s); int q = 0; while (q == 0) { q = 1; for (int i = 0; i < list.size(); i++) { if (list.get(i).equals("")) { list.remove(i); q = 0; } } } q = 0; while (q == 0) { q = 1; for (int i = 0; i < list.size(); i++) { if (list.get(i).equals("-")) { if (list.get(i - 1).equals("(")) { list.remove(i); list.add(i, "-1"); list.add(i + 1, "*"); q = 0; } } } } post = new ArrayList(); ArrayList steck = new ArrayList(); steck.add(""); list.add(")"); list.add("?"); int i = 0; while (!list.get(i).equals("?")) { if (list.get(i).equals("(")) { steck.add("("); i++; } else if (list.get(i).equals("*") | list.get(i).equals("/")) { if (steck.get(steck.size() - 1).equals("*") | steck.get(steck.size() - 1).equals("/")) { post.add(steck.get(steck.size() - 1)); steck.remove(steck.size() - 1); } else { steck.add(list.get(i)); i++; } } else if (list.get(i).equals("+") | list.get(i).equals("-")) { if (steck.get(steck.size() - 1).equals("(")) { steck.add(list.get(i)); i++; } else { post.add(steck.get(steck.size() - 1)); steck.remove(steck.size() - 1); } } else if (list.get(i).equals(")")) { while (!steck.get(steck.size() - 1).equals("(")) { post.add(steck.get(steck.size() - 1)); steck.remove(steck.size() - 1); } i++; steck.remove(steck.size() - 1); } else if (list.get(i).equals("^") | list.get(i).equals("sin") | list.get(i).equals("cos") | list.get(i).equals("tg") | list.get(i).equals("ctg") | list.get(i).equals("lg") | list.get(i).equals("ln")) { steck.add(list.get(i)); i++; } else { post.add(list.get(i)); i++; } } q = 0; while (q == 0) { q = 1; for (i = 0; i < post.size(); i++) { if (post.get(i).equals("")) { post.remove(i); q = 0; } } } } public Double alg(double x) { ArrayList steck = new ArrayList(); for (int i = 0; i < post.size(); i++) { if (post.get(i).equals("+")) { double n = steck.get(steck.size() - 1) + steck.get(steck.size() - 2); steck.remove(steck.size() - 1); steck.remove(steck.size() - 1); steck.add(n); } else if (post.get(i).equals("-")) { double n = steck.get(steck.size() - 2) - steck.get(steck.size() - 1); steck.remove(steck.size() - 1); steck.remove(steck.size() - 1); steck.add(n); } else if (post.get(i).equals("*")) { double n = steck.get(steck.size() - 2) * steck.get(steck.size() - 1); steck.remove(steck.size() - 1); steck.remove(steck.size() - 1); steck.add(n); } else if (post.get(i).equals("/")) { double n = steck.get(steck.size() - 2) / steck.get(steck.size() - 1); steck.remove(steck.size() - 1); steck.remove(steck.size() - 1); steck.add(n); } else if (post.get(i).equals("^")) { double n = Math.pow(steck.get(steck.size() - 2), steck.get(steck.size() - 1)); steck.remove(steck.size() - 1); steck.remove(steck.size() - 1); steck.add(n); } else if (post.get(i).equals("x") | post.get(i).equals("X")) { steck.add(x); } else if (post.get(i).equals("sin")) { double n = Math.sin(steck.get(steck.size() - 1)); steck.remove(steck.size() - 1); steck.add(n); } else if (post.get(i).equals("cos")) { double n = Math.cos(steck.get(steck.size() - 1)); steck.remove(steck.size() - 1); steck.add(n); } else if (post.get(i).equals("tg")) { double n = Math.tan(steck.get(steck.size() - 1)); steck.remove(steck.size() - 1); steck.add(n); } else if (post.get(i).equals("ctg")) { double n = Math.cos(steck.get(steck.size() - 1)) / Math.sin(steck.get(steck.size() - 1)); steck.remove(steck.size() - 1); steck.add(n); } else if (post.get(i).equals("ln")) { double n = Math.log(steck.get(steck.size() - 1)); steck.remove(steck.size() - 1); steck.add(n); } else if (post.get(i).equals("lg")) { double n = Math.log10(steck.get(steck.size() - 1)); steck.remove(steck.size() - 1); steck.add(n); } else if (post.get(i).equals("Pi") | post.get(i).equals("pi")) { steck.add(Math.PI); } else if (post.get(i).equals("e") | post.get(i).equals("E")) { steck.add(Math.E); } else { steck.add(Double.parseDouble(post.get(i))); } } double y = steck.get(0); return y; } } package graphic; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import javax.swing.JFrame; import javax.swing.JPanel; public class Paint extends JPanel { double[] X; double x1, x2, y1, y2, step_x, step_y; int WIDTH; int HEIGHT; int lastX; int lastY; calc f; Paint(double x1, double x2, double y1, double y2, String s) { this.x1 = x1; this.x2 = x2; this.y1 = y1; this.y2 = y2; HEIGHT = 480; WIDTH = 640; step_x = Math.PI; step_y = 1; lastX = 0; lastY = 0; f = new calc(s); frameOp(); } public void frameOp() { JFrame JF = new JFrame("test_title"); JF.setBounds(100, 100, WIDTH + 6, HEIGHT + 28); JF.setLayout(null); JF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JF.setVisible(true); JF.setResizable(false); this.setSize(WIDTH, HEIGHT); JF.add(this); this.setBackground(Color.WHITE); MouseAdapter MA = new MouseAdapter() { @Override public void mouseMoved(MouseEvent evt) { lastX = evt.getX(); lastY = evt.getY(); } @Override public void mousePressed(MouseEvent evt) { lastX = evt.getX(); lastY = evt.getY(); } @Override public void mouseDragged(MouseEvent evt) { if (evt.getModifiers() == evt.BUTTON1_MASK) { int newX = evt.getX(); int newY = evt.getY(); double dx = (x2 - x1) / WIDTH * (lastX - newX); double dy = -(y2 - y1) / HEIGHT * (lastY - newY); x1 += dx; x2 += dx; y1 += dy; y2 += dy; lastX = newX; lastY = newY; repaint(); } else if (evt.getModifiers() == evt.BUTTON3_MASK) { int newX = evt.getX(); int newY = evt.getY(); double dx = (x2 - x1) / WIDTH * (lastX - newX); double dy = -(y2 - y1) / HEIGHT * (lastY - newY); //x1 += dx; x2 += dx; y1 += dy; //y2 += dy; lastX = newX; lastY = newY; repaint(); } } }; addMouseListener(MA); addMouseMotionListener(MA); this.addMouseWheelListener(new MouseWheelListener() { @Override public void mouseWheelMoved(MouseWheelEvent e) { int r = e.getWheelRotation(); double dx = (x2 - x1) / (10 + Math.abs(r + 1) / 2); double dy = (y2 - y1) / (10 + Math.abs(r + 1) / 2); x1 -= r * dx * lastX / WIDTH; x2 += r * dx * (WIDTH - lastX) / WIDTH; y1 -= r * dy * (HEIGHT - lastY) / HEIGHT; y2 += r * dy * lastY / HEIGHT; repaint(); } }); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); paintD(g); Graphics2D g2d = (Graphics2D) g; g2d.setStroke(new BasicStroke(2)); g.setColor(Color.RED); paintF(g); } public void paintD(Graphics g) { g.setColor(Color.GRAY); int OX = (int) (-x1 / (x2 - x1) * WIDTH); int OY = (int) (HEIGHT + y1 / (y2 - y1) * HEIGHT); for (int i = (int) Math.floor(x1 / step_x); i <= Math.floor(x2 / step_x); i++) { int positionX = (int) (-(x1 - step_x * i) / (x2 - x1) * WIDTH); g.drawLine(positionX, 0, positionX, HEIGHT); int positionY; if (OY < 12) { positionY = 10; } else if (OY > HEIGHT - 2) { positionY = HEIGHT - 2; } else { positionY = OY - 2; } int format = (int) (HEIGHT / 5 / (x2 - x1) / step_x); if (step_x * i == (int) (step_x * i)) { format = 0; } else if (format > 10) { format = 10; } g.drawString(String.format("%." + String.valueOf(format) + "f", i * step_x), positionX + 2, positionY); } for (int i = (int) Math.floor(y1 / step_y); i <= Math.floor(y2 / step_y); i++) { int positionY = (int) (HEIGHT + (y1 - step_y * i) / (y2 - y1) * HEIGHT); g.drawLine(0, positionY, WIDTH, positionY); int positionX; int format = (int) (HEIGHT / 5 / (x2 - x1) / step_y); if (step_y * i == (int) (step_y * i)) { format = 0; } else if (format > 10) { format = 10; } String formated_value = String.format("%." + String.valueOf(format) + "f", i * step_y); int len = (int) new TextLayout(formated_value, g.getFont(), new FontRenderContext(null, true, true)).getBounds().getWidth(); if (OX < 1) { positionX = 2; } else if (OX > WIDTH - 7 - len) { positionX = WIDTH - 5 - len; } else { positionX = OX + 2; } g.drawString(formated_value, positionX, positionY - 1); } g.setColor(Color.BLACK); //g.drawLine((int) (-x1 / (x2 - x1) * WIDTH), 0, (int) (-x1 / (x2 - x1) * WIDTH), HEIGHT); //g.drawLine(0, (int) (HEIGHT + y1 / (y2 - y1) * HEIGHT), WIDTH, (int) (HEIGHT + y1 / (y2 - y1) * HEIGHT)); g.fillRect(OX - 1, 0, 3, HEIGHT); g.fillRect(0, OY - 1, WIDTH, 3); } public void paintF(Graphics g) { int q1 = HEIGHT - (int) Math.floor((HEIGHT / (Math.abs(y2 - y1))) * (f.alg(x1) - y1)); for (int i = 1; i < WIDTH; i++) { double i2 = f.alg(x1 + ((Math.abs(x2 - x1)) / WIDTH) * i); int q2 = HEIGHT - (int) Math.floor((HEIGHT / (Math.abs(y2 - y1))) * (i2 - y1)); g.drawLine(i - 1, q1, i, q2); q1 = q2; } } }