/******************************************************************************* * Copyright (c) 2008-2011 SWTChart project. All rights reserved. * * This code is distributed under the terms of the Eclipse Public License v1.0 * which is available at http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ package org.swtchart.internal.compress; import java.util.ArrayList; /** * A compressor for scatter series data */ public class CompressScatterSeries extends Compress { /** the state indicating if line is visible */ private boolean isLineVisible; /** flag indicating whether the grid is occupied */ private boolean occupied[][]; /* * @see Compress#addNecessaryPlots(ArrayList, ArrayList, ArrayList) */ @Override protected void addNecessaryPlots(ArrayList<Double> xList, ArrayList<Double> yList, ArrayList<Integer> indexList) { if (isLineVisible) { for (int i = 0; i < xSeries.length; i++) { if (!isInSameGridAsPrevious(xSeries[i], ySeries[i])) { addToList(xList, yList, indexList, xSeries[i], ySeries[i], i); } } } else { int width = (int) config.getWidthInPixel(); int height = (int) config.getHeightInPixel(); if (width <= 0 || height <= 0) { return; } // initialize flag occupied = new boolean[width][height]; for (int i = 0; i < xSeries.length; i++) { if (xSeries[i] >= xLower && xSeries[i] <= xUpper && ySeries[i] >= yLower && ySeries[i] <= yUpper && !isOccupied(xSeries[i], ySeries[i])) { addToList(xList, yList, indexList, xSeries[i], ySeries[i], i); } } } } /** * check if the grid is already occupied * * @param x * the X coordinate * @param y * the Y coordinate * @return true if the grid is already occupied */ private boolean isOccupied(double x, double y) { int xGridIndex; int yGridIndex; // calculate the X grid index if (config.isXLogScale()) { double lower = Math.log10(config.getXLowerValue()); double upper = Math.log10(config.getXUpperValue()); xGridIndex = (int) ((Math.log10(x) - lower) / (upper - lower) * config .getWidthInPixel()); } else { xGridIndex = (int) ((x - config.getXLowerValue()) / (config.getXUpperValue() - config.getXLowerValue()) * config .getWidthInPixel()); } // calculate the Y grid index if (config.isYLogScale()) { double lower = Math.log10(config.getYLowerValue()); double upper = Math.log10(config.getYUpperValue()); yGridIndex = (int) ((Math.log10(y) - lower) / (upper - lower) * config .getHeightInPixel()); } else { yGridIndex = (int) ((y - config.getYLowerValue()) / (config.getYUpperValue() - config.getYLowerValue()) * config .getHeightInPixel()); } boolean isOccupied = occupied[xGridIndex][yGridIndex]; occupied[xGridIndex][yGridIndex] = true; return isOccupied; } /** * Sets the state indicating if the line is visible. * * @param visible * the state indicating if the line is visible */ public void setLineVisible(boolean visible) { isLineVisible = visible; } }