/** * This is used to convert an image'x x,y location into lonLat values. * * @param x x pixel of user click on image * @param y y pixel of user click on image * @param intWESN is the WESN of the graph on the image. Note that S will be numerically greater * than N. * @param doubleWESN is the lon lat WESN of the graph on the image * @param extentWESN is the maximum extent allowed (so center not shifted too far) * @return double[2] 0=lon 1=lat. or null if trouble (e.g., intWESN is null) */ public static double[] xyToLonLat( int x, int y, int[] intWESN, double[] doubleWESN, double[] extentWESN) { if (intWESN == null || doubleWESN == null || intWESN[0] >= intWESN[1] || intWESN[2] <= intWESN[3]) return null; double xRange = doubleWESN[1] - doubleWESN[0]; double yRange = doubleWESN[3] - doubleWESN[2]; double newX, newY; if (x < intWESN[0] || x > intWESN[1]) { // a click outside of graph shifts center to (theoretical) adjacent panel newX = x < intWESN[0] ? doubleWESN[0] - xRange / 2 : doubleWESN[1] + xRange / 2; newY = y < intWESN[3] ? doubleWESN[3] + yRange / 2 : // N y > intWESN[2] ? doubleWESN[2] - yRange / 2 : // S doubleWESN[2] + yRange / 2; // ensure not too far newX = Math.max(newX, extentWESN[0] + xRange / 2); newX = Math.min(newX, extentWESN[1] - xRange / 2); newY = Math.max(newY, extentWESN[2] + yRange / 2); newY = Math.min(newY, extentWESN[3] - yRange / 2); } else if (y < intWESN[3] || y > intWESN[2]) { // y is outside of graph, but x must be within graph newX = doubleWESN[0] + xRange / 2; newY = y < intWESN[3] ? doubleWESN[3] + yRange / 2 : doubleWESN[2] - yRange / 2; // ensure not too far newX = Math.max(newX, extentWESN[0] + xRange / 2); newX = Math.min(newX, extentWESN[1] - xRange / 2); newY = Math.max(newY, extentWESN[2] + yRange / 2); newY = Math.min(newY, extentWESN[3] - yRange / 2); } else { // click within the graph newX = doubleWESN[0] + (x - intWESN[0]) * xRange / (intWESN[1] - intWESN[0]); newY = doubleWESN[2] + (y - intWESN[2]) * yRange / (intWESN[3] - intWESN[2]); } return new double[] {newX, newY}; }