Добавлена универсальная панель для рисования графиков

This commit is contained in:
Victor 2013-06-04 00:20:51 +03:00
parent 733e6e19e8
commit 634e3f8c2a

109
src/util/GraphicPanel.java Normal file
View File

@ -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<Point2D[]> pointsHolder;
private Point clickedPoint;
public GraphicPanel() {
pointsHolder = new ArrayList<Point2D[]>();
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();
}
}