/** * CCM0118 - Computação I * Bacharelado em Ciências Moleculares - USP - Segundo Semestre de 2023 * Professor: Fábio Kon * Monitor: Davi Gressler de Oliveira * Terceiro exercicio-programa - Propaga��o de Calor Simulada **/ import javax.swing.*; import java.awt.*; class PainelPiscina extends JPanel { static final long serialVersionUID = 1L; // Matriz que contem os valores de temperatura da superficie da superficie double[][] superficie; // Maior temperatura na escala utilizada double temperaturaMaxima; // Menor temperatura na escala utilizada double temperaturaMinima; void defineTemperaturaMaxima(double temperaturaMaxima) { this.temperaturaMaxima = temperaturaMaxima; } void defineTemperaturaMinima(double temperaturaMinima) { this.temperaturaMinima = temperaturaMinima; } /** * Sobrescrevendo o metodo "paint" do "JPanel". Eh nesse metodo * que efetivamente sera desenhada a matriz "superficie" * na tela. * * Nao ha necessidade de chamar diretamente esse metodo, pois * ao ser adicionado em um "JFrame", o proprio se encarregara * de fazer isso. * */ // @Override public void paint(Graphics graphics) { // sa faz alguma coisa se houver uma "superficie" a ser desenhada if (superficie == null) { return; } // vamos chamar o metodo "setPaint" do "Graphics2D", por isso a // conversao de tipo Graphics2D graphics2D = (Graphics2D) graphics; // calcula a largura e altura que cada retangulo tera Rectangle r = getBounds(); int altura = r.height / superficie.length; int largura = r.width / superficie[0].length; // calcula a "sobra" que existiria se todos os retangulos tivessem o mesmo tamanho int sobraLargura = r.width - (largura * superficie[0].length); int sobraAltura = r.height - (altura * superficie.length); // variaveis para guaradar os valores "ajustados" de cada retangulo int x, y, larguraAjustada, alturaAjustada; // varre a matriz da linha 0 ate a ultima linha for (int i = 0; i < superficie.length; i++) { // para cada linha, varre todas as colunas da respectiva linha for (int j = 0; j < superficie[i].length; j++) { // verifica se o valor da posicao ij eh valido if (superficie[i][j] > temperaturaMaxima || superficie[i][j] < temperaturaMinima) { System.out.println("Valor inv�lido de temperatura. Coordenada x = " + i + " y = " + j + " valor = " + superficie[i][j]); graphics2D.setPaint(new Color(0, 255, 0)); } else { /* * calcula a cor da celula (faz a conversao da escala utilizada para a * escala com temperatura minima igual a 0 e maxima igual a 100) */ int cor = (int) ((Math.abs(superficie[i][j] - temperaturaMinima) * 100) / Math .abs(temperaturaMaxima - temperaturaMinima)); if (cor >= 50) { // vermelha se estiver "quente" graphics2D.setPaint(new Color(155 + (cor - 50) * 2, 0, 0)); } else { // azul se estiver "fria" graphics2D.setPaint(new Color(0, 0, 156 + cor * 2)); } } // ajusta a largura if (j < sobraLargura) { x = (largura + 1) * j; larguraAjustada = largura + 1; } else { x = (largura + 1) * sobraLargura + (j - sobraLargura) * largura; larguraAjustada = largura; } // ajusta a altura if (i < sobraAltura) { y = (altura + 1) * i; alturaAjustada = altura + 1; } else { y = (altura + 1) * sobraAltura + (i - sobraAltura) * altura; alturaAjustada = altura; } // desenha o retangulo na posicao (x, y) com a area igual // a "larguraAjustada" x "alturaAjustada" graphics.fillRect(x, y, larguraAjustada, alturaAjustada); } } } }