All Downloads are FREE. Search and download functionalities are using the official Maven repository.

umontreal.iro.lecuyer.charts.EmpiricalRenderer Maven / Gradle / Ivy

Go to download

SSJ is a Java library for stochastic simulation, developed under the direction of Pierre L'Ecuyer, in the Département d'Informatique et de Recherche Opérationnelle (DIRO), at the Université de Montréal. It provides facilities for generating uniform and nonuniform random variates, computing different measures related to probability distributions, performing goodness-of-fit tests, applying quasi-Monte Carlo methods, collecting (elementary) statistics, and programming discrete-event simulations with both events and processes.

The newest version!
package umontreal.iro.lecuyer.charts;

import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.awt.Shape;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.entity.EntityCollection;
import org.jfree.chart.entity.XYItemEntity;
import org.jfree.chart.labels.XYToolTipGenerator;
import org.jfree.chart.urls.XYURLGenerator;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYItemRendererState;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.plot.PlotRenderingInfo;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.CrosshairState;
import org.jfree.data.xy.XYDataset;
import org.jfree.util.PublicCloneable;
import org.jfree.util.ShapeUtilities;

/*
 * Class:        EmpiricalRenderer
 * Description:  
 * Environment:  Java
 * Software:     SSJ 
 * Copyright (C) 2001  Pierre L'Ecuyer and Université de Montréal
 * Organization: DIRO, Université de Montréal
 * @author       
 * @since

 * SSJ is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License (GPL) as published by the
 * Free Software Foundation, either version 3 of the License, or
 * any later version.

 * SSJ is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * A copy of the GNU General Public License is available at
   GPL licence site.
 */


/**
 * A renderer that draws horizontal lines between points and/or draws shapes
 * at each data point to provide an empirical style chart.  This renderer is
 * designed for use with the {XYPlot} class.
 */
public class EmpiricalRenderer extends XYLineAndShapeRenderer
         implements XYItemRenderer, Cloneable, PublicCloneable
{

   /**
    * Creates a new renderer.
    */
   public EmpiricalRenderer()
   {
      this(null, null);
   }


   /**
    * Creates a new renderer with selected tool tip and url generators.
    *
    * @param  toolTipGenerator   Tool tip generator.
    * @param  urlGenerator       Url generator.
    */
   public EmpiricalRenderer(XYToolTipGenerator toolTipGenerator, XYURLGenerator urlGenerator)
   {
      setBaseToolTipGenerator(toolTipGenerator);
      setURLGenerator(urlGenerator);
      setShapesFilled(true);
      setShapesVisible(true);
   }

   /**
    * Draws the visual representation of a single data item.
    *
    * @param g2           the graphics device.
    * @param state        the renderer state.
    * @param dataArea     the area within which the data is being drawn.
    * @param info         collects information about the drawing.
    * @param plot         the plot (can be used to obtain standard color
    *                     information etc).
    * @param domainAxis   the domain axis.
    * @param rangeAxis    the range axis.
    * @param dataset      the dataset.
    * @param series       the series index (zero-based).
    * @param item         the item index (zero-based).
    * @param crosshairState  crosshair information for the plot 
    *                        (null permitted).
    * @param pass         the pass index.
    */
   public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea,
                        PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis,
                        XYDataset dataset, int series, int item, CrosshairState crosshairState, int pass)
   {

      if (!getItemVisible(series, item))
         return ;
      PlotOrientation orientation = plot.getOrientation();
      java.awt.Paint seriesPaint = getItemPaint(series, item);
      java.awt.Stroke seriesStroke = getItemStroke(series, item);
      g2.setPaint(seriesPaint);
      g2.setStroke(seriesStroke);
      double x0 = dataset.getXValue(series, item);
      double y0 = dataset.getYValue(series, item);
      if (java.lang.Double.isNaN(y0))
         return ;
      org.jfree.ui.RectangleEdge xAxisLocation = plot.getDomainAxisEdge();
      org.jfree.ui.RectangleEdge yAxisLocation = plot.getRangeAxisEdge();
      double transX0 = domainAxis.valueToJava2D(x0, dataArea, xAxisLocation);
      double transY0 = rangeAxis.valueToJava2D(y0, dataArea, yAxisLocation);

      double x1 = 0, y1 = 0;
      if (item < dataset.getItemCount(series) - 1) {
         x1 = dataset.getXValue(series, item + 1);
         y1 = dataset.getYValue(series, item + 1);
      } else {
         x1 = dataArea.getMaxX();
         y1 = dataArea.getMaxY();
      }

      boolean useFillPaint = getUseFillPaint();
      ;
      boolean drawOutlines = getDrawOutlines();
      if (!java.lang.Double.isNaN(y0)) {
         double transX1;
         double transY1;
         if (item < dataset.getItemCount(series) - 1) {
            transX1 = domainAxis.valueToJava2D(x1, dataArea, xAxisLocation);
            transY1 = rangeAxis.valueToJava2D(y1, dataArea, yAxisLocation);
         } else {
            transX1 = x1;
            transY1 = y1;
         }
         Line2D line = state.workingLine;
         if (orientation == PlotOrientation.HORIZONTAL) {
            line.setLine(transY0, transX0, transY0, transX1);
            g2.draw(line);
         } else if (orientation == PlotOrientation.VERTICAL) {
            line.setLine(transX0, transY0, transX1, transY0);
            g2.draw(line);
         }
      }
      if (getItemShapeVisible(series, item)) {
         Shape shape = getItemShape(series, item);
         if (orientation == PlotOrientation.HORIZONTAL)
            shape = ShapeUtilities.createTranslatedShape(shape, transY0, transX0);
         else if (orientation == PlotOrientation.VERTICAL)
            shape = ShapeUtilities.createTranslatedShape(shape, transX0, transY0);
         if (shape.intersects(dataArea)) {
            if (getItemShapeFilled(series, item)) {
               if (useFillPaint)
                  g2.setPaint(getItemFillPaint(series, item));
               else
                  g2.setPaint(getItemPaint(series, item));
               g2.fill(shape);
            }
            if (drawOutlines) {
               if (getUseOutlinePaint())
                  g2.setPaint(getItemOutlinePaint(series, item));
               else
                  g2.setPaint(getItemPaint(series, item));
               g2.setStroke(getItemOutlineStroke(series, item));
               g2.draw(shape);
            }
         }
      }
      if (isItemLabelVisible(series, item)) {
         double xx = transX0;
         double yy = transY0;
         if (orientation == PlotOrientation.HORIZONTAL) {
            xx = transY0;
            yy = transX0;
         }
         drawItemLabel(g2, orientation, dataset, series, item, xx, yy, y0 < 0.0D);
      }
      int domainAxisIndex = plot.getDomainAxisIndex(domainAxis);
      int rangeAxisIndex = plot.getRangeAxisIndex(rangeAxis);
      updateCrosshairValues(crosshairState, x0, y0, domainAxisIndex, rangeAxisIndex, transX0, transY0, orientation);
      if (state.getInfo() != null) {
         EntityCollection entities = state.getEntityCollection();
         if (entities != null) {
            int r = getDefaultEntityRadius();
            java.awt.Shape shape = orientation != PlotOrientation.VERTICAL ? ((java.awt.Shape) (new java.awt.geom.Rectangle2D.Double(transY0 - (double)r, transX0 - (double)r, 2 * r, 2 * r))) : ((java.awt.Shape) (new java.awt.geom.Rectangle2D.Double(transX0 - (double)r, transY0 - (double)r, 2 * r, 2 * r)));
            if (shape != null) {
               String tip = null;
               XYToolTipGenerator generator = getToolTipGenerator(series, item);
               if (generator != null)
                  tip = generator.generateToolTip(dataset, series, item);
               String url = null;
               if (getURLGenerator() != null)
                  url = getURLGenerator().generateURL(dataset, series, item);
               XYItemEntity entity = new XYItemEntity(shape, dataset, series, item, tip, url);
               entities.add(entity);
            }
         }
      }
   }

   /**
    * Returns a clone of the renderer.
    *
    * @return A clone.
    *
    * @throws CloneNotSupportedException if the clone cannot be created.
    */
   public Object clone() throws CloneNotSupportedException
   {
      return super.clone();
   }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy