package prefuse.action.animate; import java.util.logging.Logger; import prefuse.action.ItemAction; import prefuse.util.PrefuseLib; import prefuse.visual.VisualItem; /** * Animator that inerpolates an array of numerical values. * * @author <a href="http://jheer.org">jeffrey heer</a> */ public class ArrayAnimator extends ItemAction { private static final Logger s_logger = Logger.getLogger(ArrayAnimator.class.getName()); private String m_field; // the field private String m_start; // the start field private String m_end; // the end field /** * Create a new ArrayAnimator that processes the given data group * and interpolates arrays in the given data field. * @param group the data group to process * @param field the data field to interpolate. This should be an * interpolated field (have start and end instances as well as * the field name itself). */ public ArrayAnimator(String group, String field) { super(group); m_field = field; m_start = PrefuseLib.getStartField(field); m_end = PrefuseLib.getEndField(field); } /** * @see prefuse.action.ItemAction#process(prefuse.visual.VisualItem, double) */ public void process(VisualItem item, double frac) { Object o = item.get(m_field); if ( o instanceof float[] ) { float[] a = (float[])o; float[] s = (float[])item.get(m_start); float[] e = (float[])item.get(m_end); float f = (float)frac; for ( int i=0; i<a.length; ++i ) { if ( Float.isNaN(a[i]) ) break; a[i] = s[i] + f*(e[i]-s[i]); } item.setValidated(false); } else if ( o instanceof double[] ) { double[] a = (double[])o; double[] s = (double[])item.get(m_start); double[] e = (double[])item.get(m_end); for ( int i=0; i<a.length; ++i ) { if ( Double.isNaN(a[i]) ) break; a[i] = s[i] + frac*(e[i]-s[i]); } item.setValidated(false); } else { s_logger.warning("Encountered non-double/non-float array type: " + (o==null ? "null" : o.getClass().getName())); } } } // end of class ArrayAnimator