001 package ui.recognizer; 002 003 import java.awt.Rectangle; 004 005 /** A class containing calibration information necessary for the correct mapping 006 * from image coordinates to data coordinates. 007 */ 008 009 // should we extend it from Rectangle2D? 010 011 public class Calibration extends Rectangle { 012 013 // can be more precise than integer pixels by locating the exact center of the border (sub-pixel resolution) 014 // plot extrema : the center of the lines defining the axes (in image units) 015 016 public static final double DEFAULT_MINX = 0.0d; 017 public static final double DEFAULT_MINY = 0.0d; 018 public static final double DEFAULT_MAXX = 1.0d; 019 public static final double DEFAULT_MAXY = 1.0d; 020 021 public static final double DEFAULT_UNITX = 1.0d; 022 public static final double DEFAULT_UNITY = 1.0d; 023 024 // plot extrema in data units (should this be an instance of rectangle class ?) 025 protected double minX = DEFAULT_MINX; 026 protected double minY = DEFAULT_MINY; 027 protected double maxX = DEFAULT_MAXX; 028 protected double maxY = DEFAULT_MAXY; 029 030 protected double unitX = DEFAULT_UNITX; 031 protected double unitY = DEFAULT_UNITY; 032 033 //This constructor is redundant because it is 'inherited' from Rectangle class ? 034 public Calibration() { 035 super(new Rectangle()); 036 } 037 038 //This constructor is redundant because it is 'inherited' from Rectangle class ? 039 public Calibration(Rectangle aBorder) { 040 this(aBorder, DEFAULT_MINX, DEFAULT_MINY, DEFAULT_MAXX, DEFAULT_MAXY); 041 } 042 043 // rectangle representing the plot window 044 public Calibration(Rectangle aBorder, double aMinX, double aMinY, double aMaxX, double aMaxY) { 045 this(aBorder, aMinX, aMinY, aMaxX, aMaxY, DEFAULT_UNITX, DEFAULT_UNITY); 046 047 } 048 049 // rectangle representing the plot window 050 public Calibration(Rectangle aBorder, double aMinX, double aMinY, double aMaxX, double aMaxY, double aUnitX, double aUnitY) { 051 super(aBorder); 052 minX = aMinX; 053 minY = aMinY; 054 maxX = aMaxX; 055 maxY = aMaxY; 056 unitX = aUnitX; 057 unitY = aUnitY; 058 } 059 060 /** Convert an image coordinate into a data coordinate. 061 * @param anImageCoordinate a coordinate in image format 062 * @return a data coordinate mapped from the image coordinate 063 */ 064 public DataCoordinate map(ImageCoordinate anImageCoordinate) { 065 double x = (double) anImageCoordinate.getX(); 066 double y = (double) anImageCoordinate.getY(); 067 double mapx = getMinX() + (x - getX()) / getWidth() * (getMaxX() - getMinX()); 068 double mapy = getMinY() + (y - getY()) / getHeight() * (getMaxY() - getMinY()); 069 // TODO: some mapping function which uses the current calibration state 070 return new DataCoordinate(mapx, mapy); 071 } 072 073 /** Convert data coordinate into an image coordinate in the native unit of the data. 074 * @param aDataCoordinate a coordinate in data format 075 * @return a coordinate in image format mapped from the data coordinate 076 */ 077 public ImageCoordinate mapInDataUnits(DataCoordinate aDataCoordinate) { 078 double x = aDataCoordinate.getX() / getUnitX(); 079 double y = aDataCoordinate.getY() / getUnitY(); 080 return map(new DataCoordinate(x, y)); 081 } 082 083 /** Convert data coordinate into an image coordinate. 084 * @param aDataCoordinate a coordinate in data format 085 * @return a coordinate in image format mapped from the data coordinate 086 */ 087 public ImageCoordinate map(DataCoordinate aDataCoordinate) { 088 double x = aDataCoordinate.getX(); 089 double y = aDataCoordinate.getY(); 090 091 double relativeX = (x - getMinX()) / (getMaxX() - getMinX()); 092 double relativeY = (y - getMinY()) / (getMaxY() - getMinY()); 093 094 int imageX = (int) (relativeX * getWidth() + getX()); 095 int imageY = (int) (relativeY * getHeight() + getY()); 096 return new ImageCoordinate(imageX, imageY); 097 } 098 099 /** Get the unit of the X-axis. Multiply getX() by this number to obtain the scaled x unit. 100 */ 101 public double getUnitX() { 102 return unitX; 103 } 104 105 public void setUnitX(double aUnitX) { 106 unitX = aUnitX; 107 } 108 109 /** Get the unit of the Y-axis. Multiply getY() by this number to obtain the scaled y unit. 110 */ 111 public double getUnitY() { 112 return unitY; 113 } 114 115 public void setUnitY(double aUnitY) { 116 unitY = aUnitY; 117 } 118 119 /** Get the minimum x value of the calibration zone. 120 * 121 * @return the minimum x value in calibration zone in double precision 122 * @see #setMinX 123 */ 124 public double getMinX() { 125 return minX; 126 } 127 128 /** Set the minimum x value of the calibration zone. 129 * 130 * @param aMinX the minimum x value in the calibration zone in double precision 131 * @see #getMinX 132 */ 133 public void setMinX(double aMinX) { 134 minX = aMinX; 135 } 136 137 /** Get the minimum y value of the calibration zone. 138 * 139 * @return the minimum intensity in the calibration zone in double precision 140 */ 141 public double getMinY() { 142 return minY; 143 } 144 145 /** Set the minimum y value of the calibration zone. 146 * 147 * @param aMinY the minimum intensity in the calibration zone in double precision 148 */ 149 public void setMinY(double aMinY) { 150 minY = aMinY; 151 } 152 153 /** Get the maximum x value of the calibration zone. 154 * 155 * @return the maximum x value in the calibration zone in double precision 156 * @see #setMaxX 157 */ 158 public double getMaxX() { 159 return maxX; 160 } 161 162 /** Set the maximum x value of the calibration zone. 163 * 164 * @param aMaxX the maximum wavelength in the calibration zone in double precision 165 */ 166 public void setMaxX(double aMaxX) { 167 maxX = aMaxX; 168 } 169 170 /** Get the maximum y value of the calibration zone. 171 * 172 * @return the maximum intensity in the calibration zone in double precision 173 */ 174 public double getMaxY() { 175 return maxY; 176 } 177 178 /** Set the maximum y value of the calibration zone. 179 * 180 * @param aMaxY the maximum intensity in the calibration zone in double precision 181 */ 182 public void setMaxY(double aMaxY) { 183 maxY = aMaxY; 184 } 185 186 } 187