From 634e3f8c2adef630a29f3e30efa05f379c359141 Mon Sep 17 00:00:00 2001 From: Victor Date: Tue, 4 Jun 2013 00:20:51 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=83=D0=BD=D0=B8=D0=B2=D0=B5=D1=80=D1=81=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B8=D1=81=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B3=D1=80=D0=B0=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/util/GraphicPanel.java | 109 +++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 src/util/GraphicPanel.java diff --git a/src/util/GraphicPanel.java b/src/util/GraphicPanel.java new file mode 100644 index 0000000..10d3691 --- /dev/null +++ b/src/util/GraphicPanel.java @@ -0,0 +1,109 @@ +package util; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Point; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionAdapter; +import java.awt.geom.Point2D; +import java.util.ArrayList; +import javax.swing.JPanel; + +/** + * @author aNNiMON + */ +public abstract class GraphicPanel extends JPanel { + + // Цвета для графиков. + private static final Color[] COLORS = { + Color.BLUE, new Color(0x00C000), Color.CYAN, Color.MAGENTA + }; + + private final ArrayList pointsHolder; + private Point clickedPoint; + + public GraphicPanel() { + pointsHolder = new ArrayList(); + setBackground(Color.WHITE); + addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent evt) { + formMousePressed(evt); + } + }); + addMouseMotionListener(new MouseMotionAdapter() { + @Override + public void mouseDragged(MouseEvent evt) { + formMousePressed(evt); + } + }); + clickedPoint = new Point(0, 0); + } + + public void addPoints(Point2D[] input) { + pointsHolder.add(input); + } + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + final int width = g.getClipBounds().width; + final int height = g.getClipBounds().height; + + if (pointsHolder.size() <= 0) return; + + // Расчет коэфициентов растягивания + Point2D[] input = pointsHolder.get(0); + double xMin = input[0].getX(); + double xMax = input[0].getX(); + double yMin = input[0].getY(); + double yMax = input[0].getY(); + + for (int j = 0; j < pointsHolder.size(); j++) { + input = pointsHolder.get(j); + for (int i = 0; i < input.length; i++) { + Point2D point = input[i]; + if (xMin > point.getX()) xMin = point.getX(); + else if (xMax < point.getX()) xMax = point.getX(); + if (yMin > point.getY()) yMin = point.getY(); + else if (yMax < point.getY()) yMax = point.getY(); + } + } + + double dx = width / (xMax - xMin); + double dy = height / (yMax - yMin); + + // Рисование графиков + for (int j = 0; j < pointsHolder.size(); j++) { + g.setColor(COLORS[j]); + input = pointsHolder.get(j); + + for (int i = 0; i < input.length; i++) { + Point2D p = input[i]; + plot(g, (p.getX() - xMin) * dx, height - (p.getY() - yMin) * dy); + } + } + + // Отображение позиции выбранной точки + g.setColor(Color.RED); + double x = clickedPoint.getX() / dx + xMin; + int graphX = (int) ((x - xMin) * dx); + g.drawLine(graphX, 0, graphX, height); + + // Подписи + drawLabels(g, x); + } + + protected abstract void drawLabels(Graphics g, double x); + + protected void plot(Graphics g, double x, double y) { + g.drawLine((int) x, (int) y, (int) x, (int) y); + } + + private void formMousePressed(java.awt.event.MouseEvent evt) { + clickedPoint = evt.getPoint(); + repaint(); + } + +}