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 LogarithmicHorizontalScale extends Scale { public LogarithmicHorizontalScale(SpectrumView view) { super(view); nScalePoints = 6.0; units = new String (""); } public void draw(Graphics2D g) { g.setPaint(Color.gray); DoubleWrapper xOrigin = new DoubleWrapper(); double iter; double pos; DoubleWrapper paneStep = new DoubleWrapper(); if (getLowerVisibleBound() <= 0.0) { setLowerBound(0.01); setLowerVisibleBound(0.01); calcStep(); } iter = getLowerVisibleBound(); xOrigin.value = getView().getScaleY().getOrigin(); if (xOrigin.value < 0.0) xOrigin.value *= (-1.0); else // PRS xOrigin.value = 0.0; getView().getScaleY().real2Pane(xOrigin); g.draw(new Line2D.Double(getView().getLeftMargin(), xOrigin.value, getView().getRightMargin(), xOrigin.value)); // draw tickers pos = getView().getLeftMargin(); NumberFormat formater = NumberFormat.getNumberInstance(); formater.setMaximumFractionDigits(2); FontRenderContext context = g.getFontRenderContext(); 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) { g.draw(new Line2D.Double(pos , xOrigin.value , pos, xOrigin.value - 2)); 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)(pos - (bounds.getWidth() / 2)), (int)((xOrigin.value - 14.0) * (-1.0))); } /* else { Rectangle2D bounds = g.getFont().getStringBounds(Double.toString(iter + getOrigOffset()), context); g.drawString(formater.format(getOrigOffset()), (int)(pos - (bounds.getWidth() / 2)) + getView().getLeftMargin(), (int)((xOrigin.value - 14.0) * (-1.0))); }*/ g.scale(1.0, -1.0); pos += paneStep.value; } g.setPaint(Color.black); g.scale(1.0, -1.0); Rectangle2D bounds1 = g.getFont().getStringBounds(getLabel(), context); g.drawString(getLabel(), (int)(getView().getLeftMargin() + (((getView().getRightMargin() - getView().getLeftMargin()) / 2.0) - (bounds1.getWidth() / 2.0))), -6); g.drawString(units, (int)getView().getLeftMargin(), -6); g.scale(1.0, -1.0); } 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().getRightMargin() - getView().getLeftMargin())); 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().getLeftMargin(); } 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 "LogarithmicHorizontalScale"; } public void setUnits(String un) { units = un; } private double step; private double nScalePoints; private String units; }