front_processing/extern/TUIO_JAVA/src/TUIO/TuioContainer.java
author bastiena
Tue, 20 Mar 2012 18:00:55 +0100
changeset 7 8a21bec5d45f
parent 3 92f19af39024
child 9 0f44b7360c8d
permissions -rw-r--r--
Middleware : No proximity bugs anymore. The skeleton disappear if a tracked person is too close or not tracked anymore. Processing : There are no laggs anymore when an user stay too long moving his hands and drawing tons of ellipses. (TUIO Cursors are not taken by their vectors, only the last position of the cursors are caught to be drawn).

/*
 TUIO Java backend - part of the reacTIVision project
 http://reactivision.sourceforge.net/
 
 Copyright (c) 2005-2009 Martin Kaltenbrunner <mkalten@iua.upf.edu>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */
package TUIO;

import java.util.*;

/**
 * The abstract TuioContainer class defines common attributes that apply to both subclasses {@link TuioObject} and {@link TuioCursor}.
 *
 * @author Martin Kaltenbrunner
 * @version 1.4
 */ 
abstract class TuioContainer extends TuioPoint {
	
	/**
	 * The unique session ID number that is assigned to each TUIO object or cursor.
	 */ 
	protected long session_id;
	/**
	 * The X-axis velocity value.
	 */ 
	protected float x_speed;
	/**
	 * The Y-axis velocity value.
	 */ 
	protected float y_speed;
	/**
	 * The motion speed value.
	 */ 
	protected float motion_speed;	
	/**
	 * The motion acceleration value.
	 */ 
	protected float motion_accel;		
	/**
	 * A Vector of TuioPoints containing all the previous positions of the TUIO component.
	 */ 
	protected Vector<TuioPoint> path;
	/**
	 * Defines the ADDED state.
	 */ 
	public static final int TUIO_ADDED = 0;
	/**
	 * Defines the ACCELERATING state.
	 */ 
	public static final int TUIO_ACCELERATING = 1;
	/**
	 * Defines the DECELERATING state.
	 */ 
	public static final int TUIO_DECELERATING = 2;
	/**
	 * Defines the STOPPED state.
	 */ 
	public static final int TUIO_STOPPED = 3;
	/**
	 * Defines the REMOVED state.
	 */ 
	public static final int TUIO_REMOVED = 4;
	/**
	 * Reflects the current state of the TuioComponent
	 */ 
	protected int state;
	
	/**
	 * This constructor takes a TuioTime argument and assigns it along with the provided 
	 * Session ID, X and Y coordinate to the newly created TuioContainer.
	 *
	 * @param	ttime	the TuioTime to assign
	 * @param	si	the Session ID to assign
	 * @param	xp	the X coordinate to assign
	 * @param	yp	the Y coordinate to assign
	 */
	TuioContainer(TuioTime ttime, long si, float xp, float yp) {
		super(ttime,xp,yp);
		
		session_id = si;
		x_speed = 0.0f;
		y_speed = 0.0f;
		motion_speed = 0.0f;
		motion_accel = 0.0f;
		
		path = new Vector<TuioPoint>();
		path.addElement(new TuioPoint(currentTime,xpos,ypos));
		state = TUIO_ADDED;
	}
	
	/**
	 * This constructor takes a TuioTime argument and assigns it along with the provided 
	 * Session ID, X, Y and Z coordinate to the newly created TuioContainer.
	 *
	 * @param	ttime	the TuioTime to assign
	 * @param	si	the Session ID to assign
	 * @param	xp	the X coordinate to assign
	 * @param	yp	the Y coordinate to assign
	 * @param	zp	the Z coordinate to assign
	 */
	TuioContainer(TuioTime ttime, long si, float xp, float yp, float zp) {
		super(ttime,xp,yp, zp);
		
		session_id = si;
		x_speed = 0.0f;
		y_speed = 0.0f;
		motion_speed = 0.0f;
		motion_accel = 0.0f;
		
		path = new Vector<TuioPoint>();
		path.addElement(new TuioPoint(currentTime,xpos,ypos,zpos));
		state = TUIO_ADDED;
	}
	
	/**
	 * This constructor takes the provided Session ID, X and Y coordinate 
	 * and assigs these values to the newly created TuioContainer.
	 *
	 * @param	si	the Session ID to assign
	 * @param	xp	the X coordinate to assign
	 * @param	yp	the Y coordinate to assign
	 */
	TuioContainer(long si, float xp, float yp) {
		super(xp,yp);
		
		session_id = si;
		x_speed = 0.0f;
		y_speed = 0.0f;
		motion_speed = 0.0f;
		motion_accel = 0.0f;
		
		path = new Vector<TuioPoint>();
		path.addElement(new TuioPoint(currentTime,xpos,ypos));
		state = TUIO_ADDED;
	}
	
	/**
	 * This constructor takes the provided Session ID, X, Y and Z coordinate 
	 * and assigs these values to the newly created TuioContainer.
	 *
	 * @param	si	the Session ID to assign
	 * @param	xp	the X coordinate to assign
	 * @param	yp	the Y coordinate to assign
	 * @param	zp	the Z coordinate to assign
	 */
	TuioContainer(long si, float xp, float yp, float zp) {
		super(xp,yp,zp);
		
		session_id = si;
		x_speed = 0.0f;
		y_speed = 0.0f;
		motion_speed = 0.0f;
		motion_accel = 0.0f;
		
		path = new Vector<TuioPoint>();
		path.addElement(new TuioPoint(currentTime,xpos,ypos,zpos));
		state = TUIO_ADDED;
	}
	
	/**
	 * This constructor takes the atttibutes of the provided TuioContainer 
	 * and assigs these values to the newly created TuioContainer.
	 *
	 * @param	tcon	the TuioContainer to assign
	 */
	TuioContainer(TuioContainer tcon) {
		super(tcon);
		
		session_id = tcon.getSessionID();
		x_speed = 0.0f;
		y_speed = 0.0f;
		motion_speed = 0.0f;
		motion_accel = 0.0f;
		
		path = new Vector<TuioPoint>();
		path.addElement(new TuioPoint(currentTime,xpos,ypos,zpos));
		state = TUIO_ADDED;
	}
	
	/**
	 * Takes a TuioTime argument and assigns it along with the provided 
	 * X and Y coordinate to the private TuioContainer attributes.
	 * The speed and accleration values are calculated accordingly.
	 *
	 * @param	ttime	the TuioTime to assign
	 * @param	xp	the X coordinate to assign
	 * @param	yp	the Y coordinate to assign
	 */
	public void update(TuioTime ttime, float xp, float yp) {
		TuioPoint lastPoint = path.lastElement();
		super.update(ttime,xp,yp);
		
		TuioTime diffTime = currentTime.subtract(lastPoint.getTuioTime());
		float dt = diffTime.getTotalMilliseconds()/1000.0f;
		float dx = this.xpos - lastPoint.getX();
		float dy = this.ypos - lastPoint.getY();
		float dist = (float)Math.sqrt(dx*dx+dy*dy);
		float last_motion_speed = this.motion_speed;
		
		this.x_speed = dx/dt;
		this.y_speed = dy/dt;
		this.motion_speed = dist/dt;
		this.motion_accel = (motion_speed - last_motion_speed)/dt;
		
		path.addElement(new TuioPoint(currentTime,xpos,ypos));
		if (motion_accel>0) state = TUIO_ACCELERATING;
		else if (motion_accel<0) state = TUIO_DECELERATING;
		else state = TUIO_STOPPED;
	}
	
	/**
	 * Takes a TuioTime argument and assigns it along with the provided 
	 * X, Y and Z coordinate to the private TuioContainer attributes.
	 * The speed and accleration values are calculated accordingly.
	 *
	 * @param	ttime	the TuioTime to assign
	 * @param	xp	the X coordinate to assign
	 * @param	yp	the Y coordinate to assign
	 * @param	zp	the Z coordinate to assign
	 */
	public void update(TuioTime ttime, float xp, float yp, float zp) {
		TuioPoint lastPoint = path.lastElement();
		super.update(ttime,xp,yp,zp);
		
		TuioTime diffTime = currentTime.subtract(lastPoint.getTuioTime());
		float dt = diffTime.getTotalMilliseconds()/1000.0f;
		float dx = this.xpos - lastPoint.getX();
		float dy = this.ypos - lastPoint.getY();
		float dz = this.zpos - lastPoint.getZ();
		float dist = (float)Math.sqrt(dx*dx+dy*dy+dz*dz);
		float last_motion_speed = this.motion_speed;
		
		this.x_speed = dx/dt;
		this.y_speed = dy/dt;
		this.motion_speed = dist/dt;
		this.motion_accel = (motion_speed - last_motion_speed)/dt;
		
		path.addElement(new TuioPoint(currentTime,xpos,ypos,zpos));
		if (motion_accel>0) state = TUIO_ACCELERATING;
		else if (motion_accel<0) state = TUIO_DECELERATING;
		else state = TUIO_STOPPED;
	}
	
	/**
	 * This method is used to calculate the speed and acceleration values of
	 * TuioContainers with unchanged positions.
	 */
	public void stop(TuioTime ttime) {
		update(ttime,xpos,ypos,zpos);
	}
	
	/**
	 * Takes a TuioTime argument and assigns it along with the provided 
	 * X and Y coordinate, X and Y velocity and acceleration
	 * to the private TuioContainer attributes.
	 *
	 * @param	ttime	the TuioTime to assign
	 * @param	xp	the X coordinate to assign
	 * @param	yp	the Y coordinate to assign
	 * @param	xs	the X velocity to assign
	 * @param	ys	the Y velocity to assign
	 * @param	ma	the acceleration to assign
	 */
	public void update(TuioTime ttime, float xp, float yp , float xs, float ys, float ma) {
		super.update(ttime,xp,yp);
		x_speed = xs;
		y_speed = ys;
		motion_speed = (float)Math.sqrt(x_speed*x_speed+y_speed*y_speed);
		motion_accel = ma;
		path.addElement(new TuioPoint(currentTime,xpos,ypos));
		if (motion_accel>0) state = TUIO_ACCELERATING;
		else if (motion_accel<0) state = TUIO_DECELERATING;
		else state = TUIO_STOPPED;
	}
	
	/**
	 * Takes a TuioTime argument and assigns it along with the provided 
	 * X, Y and Z coordinate, X and Y velocity and acceleration
	 * to the private TuioContainer attributes.
	 *
	 * @param	ttime	the TuioTime to assign
	 * @param	xp	the X coordinate to assign
	 * @param	yp	the Y coordinate to assign
	 * @param	zp	the Z coordinate to assign
	 * @param	xs	the X velocity to assign
	 * @param	ys	the Y velocity to assign
	 * @param	ma	the acceleration to assign
	 */
	public void update(TuioTime ttime, float xp, float yp, float zp , float xs, float ys, float ma) {
		super.update(ttime,xp,yp,zp);
		x_speed = xs;
		y_speed = ys;
		motion_speed = (float)Math.sqrt(x_speed*x_speed+y_speed*y_speed);
		motion_accel = ma;
		path.addElement(new TuioPoint(currentTime,xpos,ypos,zpos));
		if (motion_accel>0) state = TUIO_ACCELERATING;
		else if (motion_accel<0) state = TUIO_DECELERATING;
		else state = TUIO_STOPPED;
	}
	
	/**
	 * Assigns the provided X and Y coordinate, X and Y velocity and acceleration
	 * to the private TuioContainer attributes. The TuioTime time stamp remains unchanged.
	 *
	 * @param	xp	the X coordinate to assign
	 * @param	yp	the Y coordinate to assign
	 * @param	xs	the X velocity to assign
	 * @param	ys	the Y velocity to assign
	 * @param	ma	the acceleration to assign
	 */
	public void update(float xp, float yp,float xs,float ys,float ma) {
		super.update(xp,yp);
		x_speed = xs;
		y_speed = ys;
		motion_speed = (float)Math.sqrt(x_speed*x_speed+y_speed*y_speed);
		motion_accel = ma;
		path.addElement(new TuioPoint(currentTime,xpos,ypos));
		if (motion_accel>0) state = TUIO_ACCELERATING;
		else if (motion_accel<0) state = TUIO_DECELERATING;
		else state = TUIO_STOPPED;
	}
	
	/**
	 * Assigns the provided X, Y and Z coordinate, X and Y velocity and acceleration
	 * to the private TuioContainer attributes. The TuioTime time stamp remains unchanged.
	 *
	 * @param	xp	the X coordinate to assign
	 * @param	yp	the Y coordinate to assign
	 * @param	zp	the Z coordinate to assign
	 * @param	xs	the X velocity to assign
	 * @param	ys	the Y velocity to assign
	 * @param	ma	the acceleration to assign
	 */
	public void update(float xp, float yp, float zp,float xs,float ys,float ma) {
		super.update(xp,yp,zp);
		x_speed = xs;
		y_speed = ys;
		motion_speed = (float)Math.sqrt(x_speed*x_speed+y_speed*y_speed);
		motion_accel = ma;
		path.addElement(new TuioPoint(currentTime,xpos,ypos,zpos));
		if (motion_accel>0) state = TUIO_ACCELERATING;
		else if (motion_accel<0) state = TUIO_DECELERATING;
		else state = TUIO_STOPPED;
	}
	
	/**
	 * Takes the atttibutes of the provided TuioContainer 
	 * and assigs these values to this TuioContainer.
	 * The TuioTime time stamp of this TuioContainer remains unchanged.
	 *
	 * @param	tcon	the TuioContainer to assign
	 */
	public void update (TuioContainer tcon) {
		super.update(tcon);
		x_speed = tcon.getXSpeed();
		y_speed = tcon.getYSpeed();
		motion_speed = tcon.getMotionSpeed();
		motion_accel = tcon.getMotionAccel();
		path.addElement(new TuioPoint(currentTime,xpos,ypos,zpos));
		if (motion_accel>0) state = TUIO_ACCELERATING;
		else if (motion_accel<0) state = TUIO_DECELERATING;
		else state = TUIO_STOPPED;
	}
	
	/**
	 * Assigns the REMOVE state to this TuioContainer and sets
	 * its TuioTime time stamp to the provided TuioTime argument.
	 *
	 * @param	ttime	the TuioTime to assign
	 */
	public void remove(TuioTime ttime) {
		currentTime = new TuioTime(ttime);
		state = TUIO_REMOVED;
	}
	
	/**
	 * Returns the Session ID of this TuioContainer.
	 * @return	the Session ID of this TuioContainer
	 */
	public long getSessionID() {
		return session_id;
	}
	
	/**
	 * Returns the X velocity of this TuioContainer.
	 * @return	the X velocity of this TuioContainer
	 */
	public float getXSpeed() {
		return x_speed;
	}
	
	/**
	 * Returns the Y velocity of this TuioContainer.
	 * @return	the Y velocity of this TuioContainer
	 */
	public float getYSpeed() {
		return y_speed;
	}
	
	/**
	 * Returns the position of this TuioContainer.
	 * @return	the position of this TuioContainer
	 */
	public TuioPoint getPosition() {
		return new TuioPoint(xpos,ypos,zpos);
	}
	
	/**
	 * Returns the path of this TuioContainer.
	 * @return	the path of this TuioContainer
	 */
	public Vector<TuioPoint> getPath() {
		return path;
	}
	
	/**
	 * Returns the motion speed of this TuioContainer.
	 * @return	the motion speed of this TuioContainer
	 */
	public float getMotionSpeed() {
		return motion_speed;
	}
	
	/**
	 * Returns the motion acceleration of this TuioContainer.
	 * @return	the motion acceleration of this TuioContainer
	 */
	public float getMotionAccel() {
		return motion_accel;
	}
	
	/**
	 * Returns the TUIO state of this TuioContainer.
	 * @return	the TUIO state of this TuioContainer
	 */
	public int getTuioState() {
		return state;
	}
	
	/**
	 * Returns true of this TuioContainer is moving.
	 * @return	true of this TuioContainer is moving
	 */
	public boolean isMoving() { 
		if ((state==TUIO_ACCELERATING) || (state==TUIO_DECELERATING)) return true;
		else return false;
	}
	
}