package jmathlib.core.graphics.axes; import java.awt.*; import jmathlib.core.interpreter.ErrorLogger; import jmathlib.core.graphics.properties.*; import jmathlib.core.graphics.axes.coreObjects.*; /** created and holds the axes of a plot*/ public class CartesianAxesObject extends AxesObject { public CartesianAxesObject() { super(); } public void paint(Graphics _g) { ErrorLogger.debugLine("AxesObject: paint"); Graphics g = initBackBuffer(_g); Graphics2D g2d = (Graphics2D)g; //g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); //g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); //g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); //setBounds(72,72,451,697); //System.out.println("width = "+this.getSize().width+" height = "+this.getSize().height); dyFrame = this.getSize().height; dxFrame = this.getSize().width; //ErrorLogger.debugLine("AxesObject dxFrame="+dxFrame+" dyFframe="+dyFrame); //ErrorLogger.debugLine("AxesObject getX="+this.getX()+" getY="+this.getY()); //ErrorLogger.debugLine("AxesObject getLocation.x="+this.getLocation().x); // if these axes hold no data -> do nothing //if (axesElements.size() == 0) return; // size of curves int dyCurves = (int)(dyFrame*3/4); int dxCurves = (int)(dxFrame*3/4); // Origin of curves int dyOrig = (dyFrame-dyCurves)/2; int dxOrig = (dxFrame-dxCurves)/2; FontMetrics fM = g.getFontMetrics(); int sAscent = fM.getAscent(); int sDescent = fM.getDescent(); // Find range of x-axis and y-axis double xmin, xmax, ymin, ymax, dx, dy; // X axis xmin = XLimP.getArray()[0]; xmax = XLimP.getArray()[1]; dx = xmax-xmin; // Y axis ymin = YLimP.getArray()[0]; ymax = YLimP.getArray()[1]; dy = ymax-ymin; // add white rectangle as background g.setColor( ((ColorProperty)getProperty("Color")).getColor() ); g.fillRect(dxOrig, dyOrig, dxCurves, dyCurves); Stroke normS = g2d.getStroke(); int yLabMinX = dxOrig; int xLabMinY = dyOrig+dxCurves; // X Grid boolean doXGrid = XGridP.isSet() && !XGridStyleP.is("none"); double[] xticks = XTickP.getArray(); String[] xticklabels = XTickLabelP.getArray(); Stroke xS = XGridStyleP.getStroke(1); g2d.setColor(XColorP.getColor()); ErrorLogger.debugLine("doXGrid xticks.length " + xticks.length); for (int i=0; i<xticks.length; i++) { int xt = dxOrig + (int)((xticks[i] - xmin) / (xmax - xmin) * dxCurves); if (xt < dxOrig || xt > (dxFrame-dxOrig)) continue; // grid line if (doXGrid) { g2d.setStroke(xS); g.drawLine(xt, dyOrig, xt, dyOrig+dyCurves); g2d.setStroke(normS); } // tick mark g.drawLine(xt, dyOrig, xt, dyOrig+5); g.drawLine(xt, dyOrig+dyCurves, xt, dyOrig+dyCurves-5); // tick text if (i < xticklabels.length) { int sXWidth = fM.stringWidth(xticklabels[i]); g.drawString( xticklabels[i], xt-sXWidth/2, dyFrame-dyOrig+5+sAscent); } } // Y Grid boolean doYGrid = YGridP.isSet() && !YGridStyleP.is("none"); double[] yticks = YTickP.getArray(); String[] yticklabels = YTickLabelP.getArray(); Stroke yS = YGridStyleP.getStroke(1); g2d.setColor(YColorP.getColor()); for (int i=0; i<yticks.length; i++) { int yt = dyFrame - dyOrig - (int)((yticks[i] - ymin) / (ymax - ymin) * dyCurves); if (yt < dyOrig || yt > (dyFrame-dyOrig)) continue; // grid line if (doYGrid) { g2d.setStroke(yS); g.drawLine(dxOrig, yt, dxOrig+dxCurves, yt); g2d.setStroke(normS); } // tick mark g.drawLine(dxOrig, yt, dxOrig+5, yt); g.drawLine(dxOrig+dxCurves, yt, dxOrig+dxCurves-5, yt); // tick text if (i < yticklabels.length) { int sYWidth = fM.stringWidth(yticklabels[i]); g.drawString( yticklabels[i], dxOrig - 5 - sYWidth, (int)(yt+(sAscent/2)) ); if (dxOrig-5-sYWidth < yLabMinX) yLabMinX = dxOrig-5-sYWidth; } } // draw borders if (BoxP.isSet()) { g.setColor(XColorP.getColor()); g.drawLine( dxOrig, dyOrig+dyCurves, dxOrig+dxCurves, dyOrig+dyCurves); g.drawLine( dxOrig, dyOrig, dxOrig+dxCurves, dyOrig); g.setColor(YColorP.getColor()); g.drawLine( dxOrig+dxCurves, dyOrig+dyCurves, dxOrig+dxCurves, dyOrig); g.drawLine( dxOrig, dyOrig, dxOrig, dyOrig+dyCurves); g.setColor(Color.black); } // Add title if (title != null) { title.setPlotArea(dxOrig+dxCurves/2, dyOrig-5, 0, 0); title.paint(g); } // Add label of x-axis if (xLabel != null) { xLabel.setPlotArea(dxOrig+dxCurves/2, dyFrame-dyOrig+5+sAscent+sDescent, 0, 0); xLabel.paint(g); } // Add label of y-axis if (yLabel != null) { yLabel.setPlotArea(yLabMinX-5, dyFrame/2, 0, 0); yLabel.paint(g); } // plot line objects Shape clip = g.getClip(); g.clipRect(dxOrig+1, dyOrig+1, dxCurves-1, dyCurves-1); for(int n = 0; n < ChildrenP.size(); n++) { ((LineObject)ChildrenP.elementAt(n)).setAxesBoundaries(xmin, xmax, ymin, ymax); ((LineObject)ChildrenP.elementAt(n)).setPlotArea(dxOrig,dyFrame-dyOrig,dxCurves,dyCurves); ((LineObject)ChildrenP.elementAt(n)).paint(g); } g.setClip(clip); flushBackBuffer(_g, g); } }