Добавлена универсальная панель для рисования графиков
This commit is contained in:
parent
733e6e19e8
commit
634e3f8c2a
109
src/util/GraphicPanel.java
Normal file
109
src/util/GraphicPanel.java
Normal 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();
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user