package SesameGUI; import java.awt.Graphics2D; import java.awt.*; import java.awt.geom.*; import javax.swing.*; import java.text.NumberFormat; import java.awt.font.FontRenderContext; public class LogarithmicVerticalScale extends Scale { public LogarithmicVerticalScale(SpectrumView view) { super(view); nScalePoints = 6.0; } public void draw(Graphics2D g) { g.setPaint(Color.gray); double iter; double pos; DoubleWrapper paneStep = new DoubleWrapper(); if (getLowerVisibleBound() <= 0.0) { setLowerBound(0.01); setLowerVisibleBound(0.01); calcStep(); } iter = getLowerVisibleBound(); g.draw(new Line2D.Double(getView().getLeftMargin(), getView().getBottomMargin(), getView().getLeftMargin(), getView().getTopMargin())); if (isBoxScale()) g.draw(new Line2D.Double(getView().getRightMargin(), getView().getBottomMargin(), getView().getRightMargin(), getView().getTopMargin())); // draw tickers pos = getView().getBottomMargin(); NumberFormat formater = NumberFormat.getNumberInstance(); formater.setMaximumFractionDigits(0); FontRenderContext context = g.getFontRenderContext(); int out; if (isBoxScale()) out = 2; else out = 0; double lowerLimit; double upperLimit; lowerLimit = java.lang.Math.pow (10.0 , (int) (java.lang.Math.log(getLowerVisibleBound()) / 2.302585093)); upperLimit = java.lang.Math.pow (10.0 , (int) (java.lang.Math.log(getLowerVisibleBound()) / 2.302585093) + nScalePoints); paneStep.value = getStep(); real2PaneAbsolute(paneStep); for (iter = lowerLimit ; iter <= upperLimit ; iter *= 10.0) { if (isShowGrid()) g.draw(new Line2D.Double(getView().getLeftMargin() - 2, pos, getView().getRightMargin() + out, pos)); else { g.draw(new Line2D.Double(getView().getLeftMargin() - 2, pos, getView().getLeftMargin(), pos)); if (isBoxScale()) g.draw(new Line2D.Double(getView().getRightMargin() - 2, pos, getView().getRightMargin(), pos)); } g.scale(1.0, -1.0); if (iter >= 1.0) { Rectangle2D bounds = g.getFont().getStringBounds(formater.format(iter), context); g.drawString(formater.format(iter), (int)(55 - bounds.getWidth()), (int)pos * (-1)); } else { Rectangle2D bounds = g.getFont().getStringBounds(Double.toString(iter), context); g.drawString(Double.toString(iter), (int)(55 - bounds.getWidth()), (int)pos * (-1)); } g.scale(1.0, -1.0); pos += paneStep.value; } g.setPaint(Color.black); g.rotate(4.71); g.scale(-1.0, 1.0); Rectangle2D bounds1 = g.getFont().getStringBounds(getLabel(), context); g.drawString(getLabel(), (int)(getView().getBottomMargin() + (((getView().getTopMargin() - getView().getBottomMargin()) / 2.0) - (bounds1.getWidth() / 2.0))), 12); g.scale(-1.0, 1.0); g.rotate(-4.71); } public void pane2Real(DoubleWrapper paneCoord) { DoubleWrapper paneStep = new DoubleWrapper(); paneStep.value = getStep(); real2PaneAbsolute(paneStep); double origin; origin = java.lang.Math.log(java.lang.Math.pow (10.0 , (int) (java.lang.Math.log(getLowerVisibleBound()) / 2.302585093) - 1.0)) / 2.302585093; origin += 2.0; origin *= paneStep.value; paneCoord.value += origin; paneCoord.value /= paneStep.value; paneCoord.value = java.lang.Math.pow(10.0 , paneCoord.value - 1.0); } public void real2PaneAbsolute(DoubleWrapper realCoord) { setFactor(getLength() / (getView().getTopMargin() - getView().getBottomMargin())); realCoord.value /= getFactor(); } public void real2Pane(DoubleWrapper realCoord) { if (realCoord.value != 0.0) { DoubleWrapper paneStep = new DoubleWrapper(); paneStep.value = getStep(); real2PaneAbsolute(paneStep); realCoord.value = java.lang.Math.log(realCoord.value) / 2.302585093; realCoord.value += 1.0; realCoord.value *= paneStep.value; double origin; origin = java.lang.Math.log(java.lang.Math.pow (10.0 , (int) (java.lang.Math.log(getLowerVisibleBound()) / 2.302585093) - 1.0)) / 2.302585093; origin += 2.0; origin *= paneStep.value; realCoord.value -= origin; } realCoord.value += getView().getBottomMargin(); } public double getOrigin() { double ret = 0.0; ret = java.lang.Math.pow (10.0 , (int) (java.lang.Math.log(getLowerVisibleBound()) / 2.302585093)); return ret; } public double getLength() { double lowerLimit; double upperLimit; lowerLimit = java.lang.Math.pow (10.0 , (int) (java.lang.Math.log(getLowerVisibleBound()) / 2.302585093)); upperLimit = java.lang.Math.pow (10.0 , (int) (java.lang.Math.log(getLowerVisibleBound()) / 2.302585093) + nScalePoints); return upperLimit - lowerLimit; } public void calcStep(int numberOfSteps) { nScalePoints = (double) numberOfSteps; double lowerLimit; double upperLimit; lowerLimit = java.lang.Math.pow (10.0 , (int) (java.lang.Math.log(getLowerVisibleBound()) / 2.302585093)); upperLimit = java.lang.Math.pow (10.0 , (int) (java.lang.Math.log(getLowerVisibleBound()) / 2.302585093) + nScalePoints); step = (upperLimit - lowerLimit) / numberOfSteps; } public void calcStep() { int numberOfSteps; int low; numberOfSteps = (int) (java.lang.Math.log(getUpperVisibleBound()) / 2.302585093) + 1; low = (int) (java.lang.Math.log(getLowerVisibleBound()) / 2.302585093); numberOfSteps -= low; calcStep (numberOfSteps); } public double getStep() { return step; } public void setStep(double step) { this.step = step; } public String toString() { return "LogarithmicVerticalScale"; } private double step; private double nScalePoints; }