/* =========================================================== * Orson Charts : a 3D chart library for the Java(tm) platform * =========================================================== * * (C)opyright 2013-2016, by Object Refinery Limited. All rights reserved. * * http://www.object-refinery.com/orsoncharts/index.html * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * [Oracle and Java are registered trademarks of Oracle and/or its affiliates. * Other names may be trademarks of their respective owners.] * * If you do not wish to be bound by the terms of the GPL, an alternative * commercial license can be purchased. For details, please see visit the * Orson Charts home page: * * http://www.object-refinery.com/orsoncharts/index.html * */ package com.orsoncharts.renderer.xyz; import java.awt.Color; import java.io.Serializable; import com.orsoncharts.axis.Axis3D; import com.orsoncharts.data.xyz.XYZDataset; import com.orsoncharts.plot.XYZPlot; import com.orsoncharts.graphics3d.Dimension3D; import com.orsoncharts.graphics3d.Line3D; import com.orsoncharts.graphics3d.LineObject3D; import com.orsoncharts.graphics3d.World; /** * A renderer that draws 3D lines on an {@link XYZPlot} using data from an * {@link XYZDataset}. Here is a sample: * <div> * <object id="ABC" data="../../../../doc-files/XYZLineChart3DDemo1.svg" * type="image/svg+xml" width="500" height="359"></object> * </div> * (refer to {@code XYZLineChart3DDemo1.java} for the code to generate * the above chart). * <br><br> * NOTE: This class is serializable, but the serialization format is subject * to change in future releases and should not be relied upon for persisting * instances of this class. * * @since 1.5 */ @SuppressWarnings("serial") public class LineXYZRenderer extends AbstractXYZRenderer implements XYZRenderer, Serializable { /** * Creates a new default instance. */ public LineXYZRenderer() { } /** * Adds a single line representing one item from the dataset. * * @param dataset the dataset. * @param series the series index. * @param item the item index. * @param world the world used to model the 3D chart. * @param dimensions the plot dimensions in 3D. * @param xOffset the x-offset. * @param yOffset the y-offset. * @param zOffset the z-offset. */ @Override public void composeItem(XYZDataset dataset, int series, int item, World world, Dimension3D dimensions, double xOffset, double yOffset, double zOffset) { if (item == 0) { // we are connecting lines between points, so there return; // is nothing to do for item 0 } XYZPlot plot = getPlot(); Axis3D xAxis = plot.getXAxis(); Axis3D yAxis = plot.getYAxis(); Axis3D zAxis = plot.getZAxis(); double x1 = dataset.getX(series, item); double y1 = dataset.getY(series, item); double z1 = dataset.getZ(series, item); double x0 = dataset.getX(series, item - 1); double y0 = dataset.getY(series, item - 1); double z0 = dataset.getZ(series, item - 1); double wx0 = xAxis.translateToWorld(x0, dimensions.getWidth()); double wx1 = xAxis.translateToWorld(x1, dimensions.getWidth()); double wy0 = yAxis.translateToWorld(y0, dimensions.getHeight()); double wy1 = yAxis.translateToWorld(y1, dimensions.getHeight()); double wz0 = zAxis.translateToWorld(z0, dimensions.getDepth()); double wz1 = zAxis.translateToWorld(z1, dimensions.getDepth()); Line3D line = new Line3D(wx0, wy0, wz0, wx1, wy1, wz1); line = Line3D.cropLineToAxisAlignedBoundingBox(line, 0, dimensions.getWidth(), 0, dimensions.getHeight(), 0, dimensions.getDepth()); if (line != null) { Color color = getColorSource().getColor(series, item); LineObject3D line3D = new LineObject3D( (float) (line.getStart().getX() + xOffset), (float) (line.getStart().getY() + yOffset), (float) (line.getStart().getZ() + zOffset), (float) (line.getEnd().getX() + xOffset), (float) (line.getEnd().getY() + yOffset), (float) (line.getEnd().getZ() + zOffset), color); world.add(line3D); } } /** * Tests this renderer for equality with an arbitrary object. * * @param obj the object ({@code null} permitted). * * @return A boolean. */ @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof LineXYZRenderer)) { return false; } LineXYZRenderer that = (LineXYZRenderer) obj; return super.equals(obj); } }