package bayesGame.ui.painter;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import org.apache.commons.math3.fraction.Fraction;
import bayesGame.bayesbayes.BayesNode;
public class BayesPainter {
public static Image paintPercentage(double percentage, Color gridColor,
Color falseColor, int rows, int columns, int cell_size, BayesNode node, Fraction parentNodeProbability) {
percentage = percentage / 100.0;
int size_x = cell_size * columns;
int size_y = cell_size * rows * 2;
BufferedImage img = new BufferedImage(size_x, (int)(1.5*size_y)+1, BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics();
NodePainter.graphicBackgroundPainter(g, 0, 0, size_x, (int)(1.5*size_y));
Color greyScaleTrueColor = Color.GRAY;
Color greyScaleFalseColor = Color.BLACK;
String CPTDescription = node.cptDescription;
int trueFirstDigit = 0;
while (!Character.isDigit(CPTDescription.charAt(trueFirstDigit))) trueFirstDigit++;
int trueSecondDigit = trueFirstDigit + 1;
while (!Character.isDigit(CPTDescription.charAt(trueSecondDigit))) trueSecondDigit++;
Fraction probabilityIfTrue = new Fraction(Integer.parseInt(CPTDescription.substring(trueFirstDigit, trueFirstDigit+1)), Integer.parseInt(CPTDescription.substring(trueSecondDigit, trueSecondDigit+1)));
double trueProbability = probabilityIfTrue.doubleValue();
int falseFirstDigit = trueSecondDigit + 1;
while (!Character.isDigit(CPTDescription.charAt(falseFirstDigit))) falseFirstDigit++;
int falseSecondDigit = falseFirstDigit + 1;
while (!Character.isDigit(CPTDescription.charAt(falseSecondDigit))) falseSecondDigit++;
Fraction probabilityIfFalse = new Fraction(Integer.parseInt(CPTDescription.substring(falseFirstDigit, falseFirstDigit+1)), Integer.parseInt(CPTDescription.substring(falseSecondDigit, falseSecondDigit+1)));
double falseProbability = probabilityIfFalse.doubleValue();
paintProbabilityGrid(g, (columns * trueProbability), greyScaleTrueColor, greyScaleFalseColor, 0, 0, rows / 2, columns, (int)(cell_size * 0.5), cell_size, true);
paintProbabilityGrid(g, (columns * falseProbability), greyScaleTrueColor, greyScaleFalseColor, (int)(columns * cell_size * 0.5), 0, rows / 2, columns, (int)(cell_size * 0.5), cell_size, true);
Color trueBarColor = gridColor;
Color falseBarColor = falseColor;
if (node.getProbability().compareTo(Fraction.ZERO) == 0){
trueBarColor = Color.WHITE;
} else if (node.getProbability().compareTo(Fraction.ONE) == 0){
falseBarColor = Color.WHITE;
}
// int rows1 = processProbability(parentNodeProbability);
// int rows2 = processProbability(Fraction.ONE.subtract(parentNodeProbability));
double rows1 = (parentNodeProbability.divide(Fraction.ONE_FIFTH)).doubleValue();
double rows2 = 5.0 - rows1;
int rows1_asint = (int)rows1;
int rows2_asint = (int)rows2;
double rows1_remainder = rows1 - rows1_asint;
double rows2_remainder = rows2 - rows2_asint;
for (int i = 0; i < rows1_asint; i++){
paintProbabilityGrid(g, (columns * trueProbability), trueBarColor, falseBarColor, 0, (cell_size + 2) + (i * cell_size), 1, columns, (int)(cell_size * 0.5), cell_size, true);
}
if (rows1_remainder > 0){
paintProbabilityGrid(g, (columns * trueProbability), trueBarColor, falseBarColor, 0, (cell_size + 2) + ((int)rows1 * cell_size), 1, columns, (int)(cell_size * 0.5), (int)(Math.round(cell_size*rows1_remainder)), false);
}
for (int i = 0; i < rows2_asint; i++){
paintProbabilityGrid(g, (columns * falseProbability), trueBarColor, falseBarColor, (int)(columns * cell_size * 0.50), (cell_size + 2) + (i * cell_size), 1, columns, (int)(cell_size * 0.5), cell_size, true);
}
if (rows2_remainder > 0){
paintProbabilityGrid(g, (columns * falseProbability), trueBarColor, falseBarColor, (int)(columns * cell_size * 0.50), (cell_size + 2) + ((int)rows2 * cell_size), 1, columns, (int)(cell_size * 0.5), (int)(Math.round(cell_size*rows2_remainder)), false);
}
// NodePainter.paintProbabilityGrid(g, coloredCells, gridColor, falseColor, 0, size_y, rows, columns, cell_size);
return img;
}
public static void paintProbabilityGrid(Graphics g, double coloredCells, Color gridColor, Color falseColor, int x0, int y0, int rows, int columns, int cell_size_x, int cell_size_y, boolean closeBox){
int cells = rows * columns;
if (cells < coloredCells){
throw(new IllegalArgumentException("Requested " + coloredCells + " cells when only " + cells + " cells available"));
}
int size_x = cell_size_x * columns;
int size_y = cell_size_y * rows;
int x = 0;
int y = 0;
g.setColor(falseColor);
g.fillRect(x0, y0, size_x, size_y);
int coloredCellsFractional = (int)coloredCells;
double coloredCellsIntegral = coloredCells % 1;
g.setColor(gridColor);
// System.out.println(rows + "," + (int)rows);
// rows = (int)rows;
rows = 1;
for (int i=0; i < coloredCellsFractional; i++){
int cellX = x0 + (x * cell_size_x);
int cellY = y0 + (y * cell_size_y);
g.fillRect(cellX, cellY, cell_size_x, cell_size_y);
if (i == coloredCellsFractional-1 && coloredCellsIntegral > 0.0){
if (y == (int)(rows - 1)){
cellX = cellX + cell_size_x;
} else {
cellY = cellY + cell_size_y;
}
double fractionalCellSize = cell_size_x * coloredCellsIntegral;
int roundedFractionalCellSize = (int)Math.round(fractionalCellSize);
g.fillRect(cellX, cellY, roundedFractionalCellSize, cell_size_y);
}
if (y == (int)(rows - 1)){
y = 0;
x++;
} else {
y++;
}
}
g.setColor(Color.BLACK);
if (closeBox){
g.drawRect(x0, y0, size_x, size_y);
} else {
g.drawLine(x0, y0, x0 + size_x, y0);
g.drawLine(x0 + size_x, y0, x0 + size_x, y0 + size_y);
g.drawLine(x0, y0, x0, y0 + size_y);
}
}
}