umontreal.iro.lecuyer.charts.EmpiricalRenderer Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of ssj Show documentation
Show all versions of ssj Show documentation
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();
}
}