001 package ui.recognizer;
002
003 import java.awt.Rectangle;
004 import java.awt.geom.Rectangle2D;
005
006 /** A class containing plot calibration information necessary for the correct mapping
007 * from image coordinates to data coordinates. Plot specific knowlegde such
008 * as tic borders and tic location and spacing are part of the state.
009 */
010 public class PlotCalibration extends Calibration {
011
012 // can be more precise than integer pixels by locating the exact center of the border (sub-pixel resolution)
013
014 /** The tic zone is a 'safe' area without tics in image units.*/
015 protected Rectangle ticZone;
016
017 /** The tic is the x, y position corresponding to a tic center on both axes and whose width and height is the spacing between tics. */
018 protected Rectangle2D.Double tic;
019
020 public PlotCalibration(Rectangle aBorder, Rectangle aTicZone,
021 double xMinimum, double xMaximum, double yMinimum, double yMaximum) {
022 super(aBorder, xMinimum, xMaximum, yMinimum, yMaximum);
023 ticZone = aTicZone;
024 }
025
026 /** Get the tic zone or a 'safe' area without tics.
027 * This zone should be contained within the border zone however no checks are made.
028 * @return a rectangle in image units
029 */
030 public Rectangle getTicZone() {
031 return ticZone;
032 }
033
034 /** Set the tic zone or a 'safe' area without tics.
035 * @param aTicZone a rectangle in image units
036 */
037 public void setTicZone(Rectangle aTicZone) {
038 ticZone = aTicZone;
039 }
040
041 /** Get the axis tics as x-y position and width/height of one tic interval.
042 * The coordinates must be double precision because it is based on an average
043 * which requires subpixel precision to correctly scale after being multiplied by an integer.
044 * The getTic() method is equivalent to getTic(0, 0) but is coded more efficiently.
045 * @return a rectangle whose x, y position corresponds to a tic center on both axes and whose width and height is the spacing between tics.
046 */
047 public Rectangle2D.Double getTic() {
048 return tic;
049 }
050
051 /** Set the first tic as an x-y position and a width/height of a tic interval.
052 * The coordinates must be double precision because it is based on an average
053 * which requires subpixel precision to correctly scale after being multiplied by an integer.
054 * @param aTic rectangle whose x, y position corresponds to a tic center on both axes and whose width and height is the spacing between tics.
055 */
056 public void setTic(Rectangle2D.Double aTic) {
057 tic = aTic;
058 }
059
060 /** Get the tic at xTicNumber and yTicNumber in integer units.
061 * @return a rectangle positioned at the chosen tic and with the tic spacing encoded as width and height.
062 */
063
064 public Rectangle getTic(int xTicNumber, int yTicNumber) {
065 double x = getTic().getX();
066 double y = getTic().getY();
067 double width = getTic().getWidth();
068 double height = getTic().getHeight();
069 return null;
070 // TODO:
071 // return (Rectangle) (new Rectangle2D.Double(x + width * (double) xTicNumber,
072 // y + height* (double) yTicNumber, width, height));
073 }
074
075
076 }
077