/*
Copyright 2006 by Sean Luke and George Mason University
Licensed under the Academic Free License version 3.0
See the file "LICENSE" for more information
*/
package sim.portrayal3d.network;
import sim.field.*;
import sim.field.grid.*;
import sim.field.continuous.*;
import sim.field.network.*;
import sim.util.*;
/** A wrapper used by NetworkPortrayal3D to hold a Network and EITHER a Continuous3D OR a SparseGrid3D.
The Continuous3D/SparseGrid3D specifies the spatial location of the nodes; the Network specifies the
edges connecting those nodes. */
public class SpatialNetwork3D
{
public SparseField field;
public SparseField field2;
public Network network;
public SpatialNetwork3D( final Continuous3D field, final Network network )
{
this.field = field;
if (field == null)
throw new RuntimeException("Null Continuous3D.");
this.network = network;
if (network == null)
throw new RuntimeException("Null Network.");
}
public SpatialNetwork3D( final SparseGrid3D grid, final Network network )
{
this.field = grid;
if (field == null)
throw new RuntimeException("Null SparseGrid3D.");
this.network = network;
if (network == null)
throw new RuntimeException("Null Network.");
}
public void setAuxillaryField( final Continuous3D f)
{
field2 = f;
if (field2 != null && field instanceof SparseGrid3D)
throw new RuntimeException("The auxillary field of a SpatialNetwork3D should be the same type as the primary field.");
}
public void setAuxillaryField( final SparseGrid3D f)
{
field2 = f;
if (field2 != null && field instanceof Continuous3D)
throw new RuntimeException("The auxillary field of a SpatialNetwork3D should be the same type as the primary field.");
}
public Double3D getObjectLocation(Object node)
{
Double3D loc = null;
if (field instanceof Continuous3D) loc = ((Continuous3D)field).getObjectLocation(node);
else loc = ((SparseGrid3D)field).getObjectLocationAsDouble3D(node);
if (loc == null && field2 != null)
{
if (field2 instanceof Continuous3D) loc = ((Continuous3D)field2).getObjectLocation(node);
else loc = ((SparseGrid3D)field2).getObjectLocationAsDouble3D(node);
}
return loc;
}
public double getWidth()
{
if (field instanceof Continuous3D) return ((Continuous3D)field).getWidth();
else return ((SparseGrid3D)field).getWidth();
}
public double getHeight()
{
if (field instanceof Continuous3D) return ((Continuous3D)field).getHeight();
else return ((SparseGrid3D)field).getHeight();
}
public double getLength()
{
if (field instanceof Continuous3D) return ((Continuous3D)field).getLength();
else return ((SparseGrid3D)field).getLength();
}
}