/**
* Copyright (c) 2003-2009, Xith3D Project Group all rights reserved.
*
* Portions based on the Java3D interface, Copyright by Sun Microsystems.
* Many thanks to the developers of Java3D and Sun Microsystems for their
* innovation and design.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of the 'Xith3D Project Group' nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) A
* RISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE
*/
package org.xith3d.utility.general;
import java.util.ArrayList;
/**
* Implements a sparse matrix interface optimized for data that is likely to be
* clustered in 2dimensional space, where most of the empty space is surrounding
* a cluster of elements.
*
*
* :Id: SparseClusteredMatrix.java,v 1.5 2003/02/24 00:13:51 wurp Exp $
*
* :Log: SparseClusteredMatrix.java,v $
* Revision 1.5 2003/02/24 00:13:51 wurp
* Formatted all java code for cvs (strictSunConvention.xml)
*
* Revision 1.4 2001/06/20 04:05:42 wurp
* added log4j.
*
* Revision 1.3 2001/01/28 07:52:20 wurp
* Removed <dollar> from Id and Log in log comments.
* Added several new commands to AdminApp
* Unfortunately, several other changes that I have lost track of. Try diffing this
* version with the previous one.
*
* Revision 1.2 2000/12/16 22:07:33 wurp
* Added Id and Log to almost all of the files that didn't have it. It's
* possible that the script screwed something up. I did a commit and an update
* right before I ran the script, so if a file is screwed up you should be able
* to fix it by just going to the version before this one.
*
* @author David Yazel
*/
public class SparseClusteredMatrix< T > implements SparseMatrixInterface< T >
{
private SparseVector< SparseVector< T >> v; // vector of sparse vectors
public SparseClusteredMatrix()
{
v = new SparseVector< SparseVector< T >>();
}
/**
* Inserts an object into the matrix at the coordinates specified.
*/
public void insertAt( int x, int z, T obj )
{
SparseVector< T > col = v.elementAt( x );
if ( col == null )
{
col = new SparseVector< T >();
v.insertAt( x, col );
}
col.insertAt( z, obj );
}
/**
* Remove the object at the specified location. If there is no object there
* then nothing happens.
*/
public void removeAt( int x, int z )
{
SparseVector< T > col = v.elementAt( x );
if ( col == null )
{
return;
}
col.removeAt( z );
}
/**
* @return the object at the location specicied. If no object is there then
* null is returned;
*/
public T elementAt( int x, int z )
{
SparseVector< T > col = v.elementAt( x );
if ( col == null )
{
return null;
}
return ( col.elementAt( z ) );
}
/**
* Fills two ArrayLists, one with elements within certain bounds, the other with the ones
* that are within the bounds.
*/
public void elementsWithin( ArrayList< T > within, ArrayList< T > without, int x1, int z1, int x2, int z2 )
{
within = new ArrayList< T >();
without = new ArrayList< T >();
// first step is to sort the columns
ArrayList< SparseVector< T >> colWithin = new ArrayList< SparseVector< T >>();
ArrayList< SparseVector< T >> colWithout = new ArrayList< SparseVector< T >>();
v.sortElements( colWithin, colWithout, x1, x2 );
// now step through all the "within" columns and union their objects
for ( int i = 0; i < colWithin.size(); i++ )
colWithin.get( i ).sortElements( within, without, z1, z2 );
// now step through all the "without" columns and union their objects
for ( int i = 0; i < colWithout.size(); i++ )
colWithout.get( i ).sortElements( within, without, z1, z2 );
}
}