/*******************************************************************************
* Copyright (c) 2008-2009 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;
}
}