
Import java.Util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.*;
import java.awt.*;
public class NewDraw extends JPanel {
private String title = null;
private ArrayList<Double> data = new ArrayList<>();
private ArrayList<Integer> dataInt = new ArrayList<>();
public NewDraw(String title, CountryData data) {
this.title = title;
this.data = data.getData();
this.dataInt = convertToInt(this.data);
}
public ArrayList<Integer> convertToInt(ArrayList<Double> data){
ArrayList<Integer> dataInt = new ArrayList<>();
double number = 0.0;
for(int i = 0; i < data.size(); i++) {
number = data.get(i);
dataInt.add((int) number);
}
return dataInt;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int xStep = 50;
int yStep = 28;
int width = getWidth();
//int width = 1000;
////System.out.println("width: " + width);
int height = getHeight();
//int height = 500;
////System.out.println("height " + height);
double minX = 1.0;
double maxX = (double) data.size();
double min = Double.MAX_VALUE;
double max = Double.MIN_VALUE;
for (int i = 0; i < data.size(); i++) {
min = Math.min(min, data.get(i));
max = Math.max(max, data.get(i));
}
/*
System.out.println("minX: " + minX);
System.out.println("maxX: " + maxX);
System.out.println("minY: " + minYAL);
System.out.println("maxY: " + maxYAL);
System.out.println("minZ: " + minYLL);
System.out.println("maxZ: " + maxYLL);
*/
//int xStepTwo = 1;
//int collectionLength = COLLECTION_SIZES.length;
//Определение масштаба для отображения графика
double xScale = (width - xStep) / maxX;
int graphWidth = width - xStep * 2;
int graphHeight = (int) ((height - 60) + (0.1 / xScale));
//int graphHeight = height - xStep;
double yScaleAL = (graphHeight / (max - min));
////System.out.println("yScale: " + yScaleAL);
double yScaleLL = (graphHeight / (max - min));
////System.out.println("zScale: " + yScaleLL);
//Перевод координат в пиксели
int[] xPixels = new int[data.size()];
int[] yPixelsAL = new int[data.size()];
//int[] yPixelsLL = new int[timeCollectionLL.length];
for (int i = 0; i < data.size(); i++) {
//System.out.println("Точка: " + i);
xPixels[i] = (int) (i * xScale) + xStep;
//System.out.println("Координата х: " + (xPixels[i] - xStep));
yPixelsAL[i] = (int) ((max - data.get(i)) * yScaleAL);
//System.out.println("addTotalTimeAL: " + timeCollectionAL[i]);
//System.out.println("Координата у: " + yPixelsAL[i]);
}
//g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//Перекрас пространства для графика
g2.setColor(Color.WHITE);
g2.fillRect(xStep, 0, width, height - xStep);
//Нанесение клетки
g2.setColor(Color.lightGray);
int yStarstPoint = 0;
int xStarstPoint = 0;
//int len = yStep*50;
for (int i = 0; i <= 50; i++) {
g2.drawLine(0, yStarstPoint, getWidth(), yStarstPoint);
g2.drawLine(xStarstPoint, 0, xStarstPoint, getHeight());
yStarstPoint += yStep;
xStarstPoint += xStep;
}
Color lineColorAL = Color.BLUE;
Color pointColorAL = Color.RED;
Color lineColorLL = Color.GREEN;
Color pointColorLL = Color.ORANGE;
int sizePoint = 6;
//Отрисовка линий и точек
drawLineAndPoint(g2, xPixels, yPixelsAL, lineColorAL, pointColorAL, sizePoint);
//drawLineAndPoint(g2, xPixels, yPixelsLL, lineColorLL, pointColorLL, sizePoint);
/*
//Создание легенды
g2.setColor(Color.lightGray);
g2.fillRect(xStep * 9, 0, xStep * 3, yStep * 2);
g2.setColor(Color.BLACK);
g2.drawString("ArrayList", 10 * xStep - yStep - 5, yStep / 2 + 5);
g2.drawString("LinkedList", 10 * xStep - yStep - 5, yStep / 2 + yStep + 5);
g2.setColor(lineColorAL);
g2.drawLine(11 * xStep - 15, yStep / 2, 12 * xStep - 15, yStep / 2);
g2.setColor(lineColorLL);
g2.drawLine(11 * xStep - 15, yStep / 2 + yStep, 12 * xStep - 15, yStep / 2 + yStep);
g2.setColor(pointColorAL);
g2.fillOval((11 * xStep + (xStep / 2)) - (sizePoint / 2) - 15, yStep / 2 - (sizePoint / 2), sizePoint, sizePoint);
g2.setColor(pointColorLL);
g2.fillOval((11 * xStep + (xStep / 2)) - (sizePoint / 2) - 15, yStep / 2 + yStep - (sizePoint / 2), sizePoint, sizePoint);
*/
//Закрашевание оставшегося пространства
g2.setColor(Color.lightGray);
g2.fillRect(0, 0, xStep, height);
g2.fillRect(0, height - xStep - 12, width, height);
/*
g2.setColor(Color.BLACK);
g2.setStroke(new BasicStroke(3));
g2.drawLine(1, 0, 1, this.getHeight());
g2.drawLine(0, this.getHeight()-1, this.getWidth(), this.getHeight()-1);
*/
//Значения по оси х
g2.setColor(Color.BLACK);
//g2.drawString("0", 50 - 3, height - 50 + 10);
int xAxisStep = (int) (xStep / xScale);
for (int i = xAxisStep; i < width / xScale; i+=xAxisStep) {
g2.drawString(String.valueOf(i - xAxisStep), (int) (i * xScale) - 10, height - xStep + 10);
}
int maxPixels = getMaxValue(yPixelsAL);
//int maxYPixelsLL = getMaxValue(yPixelsLL);
int minPixels = getMinValue(yPixelsAL);
//int minYPixelsLL = getMinValue(yPixelsLL);
/*
System.out.println("maxYPixels: " + maxYPixelsAL);
System.out.println("maxZPixels: " + maxYPixelsLL);
System.out.println("maxPixels: " + maxPixels);
*/
//Шаги по оси у
long onePixel = (long) ((max - min)/(maxPixels - minPixels)) * yStep;
long step = onePixel;
int start = 4;
int st = start;
for (int i = height - xStep; i > yStep + 1; i-=yStep) {
g2.drawString(String.valueOf(start), 1, i - yStep);
start+=st;
}
//Подпись осей
g2.drawString("n, кол-во дней", getWidth() - yStep * 2 - 30, getHeight() - yStep);
g2.drawString("t, нс", yStep, yStep / 2);
/*
g2.drawString("1", getWidth()/2, getHeight()/2-50);
g2.drawString("2", getWidth()/2, getHeight()/2-100);
g2.drawString("3", getWidth()/2, getHeight()/2-150);
*/
/*
//Пунктир
g2.setColor(Color.BLACK);
for (int i = 0; i < xPixels.length; i++) {
int x1 = xPixels[i];
int y1 = yPixels[i];
//int x2 = xPixels[i + 1];
//int y2 = yPixels[i + 1];
int z1 = zPixels[i];
//int z2 = zPixels[i + 1];
//g2.drawLine(x1, y1, x2, y2);
//g2.drawLine(x1, z1, x2, z2);
float[] dashPattern = {5, 5};
BasicStroke dashedStroke = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 0, dashPattern, 0);
g2.setStroke(dashedStroke);
g2.drawLine(0, y1, x1, y1);
g2.drawLine(0, z1, x1, z1);
}
*/
}
private int getMaxValue(int[] data) {
int maxValue = data[0];
for (int i = 1; i < data.length; i++) {
if (data[i] > maxValue) {
maxValue = data[i];
}
}
return maxValue;
}
private int getMinValue(int[] data) {
int minValue = data[0];
for (int i = 1; i < data.length; i++) {
if (data[i] < minValue) {
minValue = data[i];
}
}
return minValue;
}
private void drawLineAndPoint(Graphics2D g2, int[] xPixels, int[] yPixels, Color colorLine, Color colorPoint, int sizePoint) {
g2.setColor(colorLine);
//Отрисовка линий между точками
for (int i = 0; i < xPixels.length - 1; i++) {
int x1 = xPixels[i];
int x2 = xPixels[i + 1];
int y1 = yPixels[i];
int y2 = yPixels[i + 1];
g2.drawLine(x1, y1, x2, y2);
}
/*
//Отрисовка точек
g2.setColor(colorPoint);
for (int i = 0; i < xPixels.length; i++) {
int x = xPixels[i];
int y = yPixels[i];
g2.fillOval(x - (sizePoint / 2), y - (sizePoint / 2), sizePoint, sizePoint);
}
*/
}
}