/** * * The MIT License * * Copyright (c) 2011 the original author or authors. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package com.googlecode.charts4j; import java.util.Set; import com.googlecode.charts4j.collect.ImmutableList; import com.googlecode.charts4j.collect.Lists; import com.googlecode.charts4j.collect.Sets; import com.googlecode.charts4j.parameters.ChartType; /** * XY Line chart constructed with the {@link GCharts} static factory class. * * @author Julien Chastang (julien.c.chastang at gmail dot com) * * @see XYLine * @see GCharts */ public class XYLineChart extends AbstractLineChart { /** List of lines to be ploted this chart. **/ private final ImmutableList<Plot> xylines; /** * Create a XY line chart. * * @param xylines * xy lines to be rendered by this chart * @see XYLine */ XYLineChart(final ImmutableList<? extends Plot> xylines) { super(xylines); this.xylines = Lists.copyOf(xylines); } /** * {@inheritDoc} */ @Override protected void prepareData() { super.prepareData(); for (Plot xyl : xylines) { final PlotImpl xyline = (PlotImpl) xyl; final PlotImpl xy = removeDuplicatePoints(xyline); parameterManager.addData(xy.getXData()); parameterManager.addData(xy.getYData()); } parameterManager.setChartTypeParameter(ChartType.XY_LINE_CHART); } /** * Method that purges duplicate points. * * @param xyline * plot that will be purged of duplicate lines. * @return plot purged of duplicates */ private PlotImpl removeDuplicatePoints(final PlotImpl xyline) { final double[] xData = xyline.getXData().getData(); final double[] yData = xyline.getYData().getData(); if (xData.length != yData.length) { return xyline; } // Removing duplicates. Can assume xData and yData are the same length. final Set<XYPoint> set = Sets.newLinkedHashSet(); for (int i = 0; i < xData.length; i++) { set.add(new XYPoint(xData[i], yData[i])); } final double[] x = new double[set.size()]; final double[] y = new double[set.size()]; int i = 0; for (XYPoint point : set) { x[i] = point.x; y[i] = point.y; i++; } return new PlotImpl(Data.newData(x), Data.newData(y)); } /** * XY point. * * @author Julien Chastang (julien.c.chastang at gmail dot com) */ private static final class XYPoint { /** X. **/ private final double x; /** Y. **/ private final double y; /** * Construct an XY point. * * @param x x * @param y y */ private XYPoint(final double x, final double y) { super(); this.x = x; this.y = y; } /** * {@inheritDoc} */ @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (!(obj instanceof XYPoint)) { return false; } final XYPoint objA = (XYPoint) obj; return (this.x == objA.x) && (this.y == objA.y); } /** * * {@inheritDoc} */ @Override public int hashCode() { int hash = 1; hash = hash * 31 + Double.valueOf(x).hashCode(); hash = hash * 31 + Double.valueOf(y).hashCode(); return hash; } } }