// Last edited on 2000-09-05 04:03:19 by stolfi import java.awt.Point; import java.awt.Rectangle; import Ponto; import Retangulo; import Escala; public class EscalaImpl extends Escala { private double minX; // X do mapa que corresponde a abcissa 0 da tela private double maxY; // Y do mapa que corresponde a ordenada 0 da tela private double tamPixel; // em unidades do mapa // Construtor public void define(Rectangle tR, Retangulo mR) { // Calcula os parâmetros da conversão de modo a garantir // escalas iguais em X e em Y. double mDX = mR.xMax - mR.xMin; double mDY = mR.yMax - mR.yMin; double escalaX = mDX / (double) tR.width; double escalaY = mDY / (double) tR.height; double escala = (escalaX > escalaY ? escalaX : escalaY); double hX = (escala/escalaX-1)/2; double hY = (escala/escalaY-1)/2; minX = mR.xMin - mDX*hX; maxY = mR.yMax + mDY*hY; tamPixel = escala; } public void mapaParaTela(Ponto mP, Point tP) { tP.x = (int)((mP.x - minX) / tamPixel + 0.5); tP.y = (int)((maxY - mP.y) / tamPixel + 0.5); } public void mapaParaTela(Retangulo mR, Rectangle tR) { tR.x = (int)((mR.xMin - minX) / tamPixel + 0.5); tR.y = (int)((maxY - mR.yMax) / tamPixel + 0.5); tR.width = (int)((mR.xMax - mR.xMin) / tamPixel + 0.5); tR.height = (int)((mR.yMax - mR.yMin) / tamPixel + 0.5); } public void telaParaMapa(Point tP, Ponto mP) { mP.x = ((double)tP.x) * tamPixel + minX; mP.y = maxY - ((double)tP.y) * tamPixel; } public void telaParaMapa(Rectangle tR, Retangulo mR) { mR.xMin = ((double)tR.x) * tamPixel + minX; mR.xMax = ((double)(tR.x + tR.width)) * tamPixel + minX; mR.yMin = maxY - ((double)(tR.y + tR.height)) * tamPixel; mR.yMax = maxY - ((double)tR.y) * tamPixel; } public final double unidadesPorPixel() { return tamPixel; } }