All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jadex.extension.envsupport.math.Vector3Double Maven / Gradle / Ivy

Go to download

The Jadex kernel extension envsupport allows for using 2D spaces in concert with components.

There is a newer version: 3.0.117
Show newest version
package jadex.extension.envsupport.math;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/** Implementation of a cartesian 3-vector using double components.
 */
public class Vector3Double implements IVector3, Cloneable
{
	/** Zero vector.
	 */
	public static final IVector3 ZERO = new Vector3Double(0.0);
	
	private double x_;
	private double y_;
	private double z_;

	/** Creates a new Vector2Double with the value (0,0).
	 */
	public Vector3Double()
	{
		x_ = 0;
		y_ = 0;
		z_ = 0;
	}

	/** Creates a new Vector3 with the same value as the input vector.
	 */
	public Vector3Double(IVector3 vector)
	{
		x_ = vector.getXAsDouble();
		y_ = vector.getYAsDouble();
		z_ = vector.getYAsDouble();
	}

	/** Creates a new Vector2 using the scalar to assign the
	 *  value (scalar,scalar).
	 */
	public Vector3Double(double scalar)
	{
		x_ = scalar;
		y_ = scalar;
		z_ = scalar;
	}

	/** Creates a new Vector2 with the given value.
	 */
	public Vector3Double(double x, double y, double z)
	{
		x_ = x;
		y_ = y;
		z_ = z;
	}
	
	/** Assigns this vector the values of another vector.
	 * 
	 *  @param vector the other vector
	 *  @return a reference to the called vector (NOT a copy)
	 */
	public IVector3 assign(IVector3 vector)
	{
		x_ = vector.getXAsDouble();
		y_ = vector.getYAsDouble();
		z_ = vector.getZAsDouble();
		return this;
	}
	
	public IVector3 add(double scalar)
	{
		x_ += scalar;
		y_ += scalar;
		z_ += scalar;
		return this;
	}

	public IVector3 add(IVector1 scalar)
	{
		x_ += scalar.getAsDouble();
		y_ += scalar.getAsDouble();
		z_ += scalar.getAsDouble();
		return this;
	}

	public IVector3 add(IVector3 vector)
	{
		x_ += vector.getXAsDouble();
		y_ += vector.getYAsDouble();
		z_ += vector.getZAsDouble();
		return this;
	}
	
	public IVector3 subtract(double scalar)
	{
		x_ -= scalar;
		y_ -= scalar;
		z_ -= scalar;
		return this;
	}

	public IVector3 subtract(IVector1 scalar)
	{
		x_ -= scalar.getAsDouble();
		y_ -= scalar.getAsDouble();
		z_ -= scalar.getAsDouble();
		return this;
	}

	public IVector3 subtract(IVector3 vector)
	{
		x_ -= vector.getXAsDouble();
		y_ -= vector.getYAsDouble();
		z_ -= vector.getZAsDouble();
		return this;
	}
	
	public IVector3 mod(IVector3 modulus)
	{
		double mx = modulus.getXAsDouble();
		double my = modulus.getYAsDouble();
		double mz = modulus.getZAsDouble();
		x_ = (x_ + mx) % mx;
		y_ = (y_ + my) % my;
		z_ = (z_ + mz) % mz;
		return this;
	}
	
	public IVector3 multiply(double scalar)
	{
		x_ *= scalar;
		y_ *= scalar;
		z_ *= scalar;
		return this;
	}

	public IVector3 multiply(IVector1 scalar)
	{
		x_ *= scalar.getAsDouble();
		y_ *= scalar.getAsDouble();
		z_ *= scalar.getAsDouble();
		return this;
	}

	public IVector3 multiply(IVector3 vector)
	{
		x_ *= vector.getXAsDouble();
		y_ *= vector.getYAsDouble();
		z_ *= vector.getZAsDouble();
		return this;
	}
	
	/** Performs a division on the vector.
	 *
	 *  @param vector vector
	 *  @return a reference to the called vector (NOT a copy)
	 */
	public IVector3 divide(IVector3 vector)
	{
		x_ /= vector.getXAsDouble();
		y_ /= vector.getYAsDouble();
		z_ /= vector.getZAsDouble();
		return this;
	}
	
	public IVector3 zero()
	{
		x_ = 0.0;
		y_ = 0.0;
		z_ = 0.0;
		return this;
	}

	public IVector3 negateX()
	{
		x_ = -x_;
		return this;
	}

	public IVector3 negateY()
	{
		y_ = -y_;
		return this;
	}
	
	public IVector3 negateZ()
	{
		z_ = -z_;
		return this;
	}
	

	public IVector3 negate()
	{
		x_ = -x_;
		y_ = -y_;
		z_ = -z_;
		return this;
	}
	
	public IVector3 randomX(IVector1 lower, IVector1 upper)
	{
		double l = lower.getAsDouble();
		double u = upper.getAsDouble();
		double r = Math.random();
		r *= (u - l);
		r += l;
		x_ = r;
		return this;
	}
	
	public IVector3 randomY(IVector1 lower, IVector1 upper)
	{
		double l = lower.getAsDouble();
		double u = upper.getAsDouble();
		double r = Math.random();
		r *= (u - l);
		r += l;
		y_ = r;
		return this;
	}
	
	public IVector3 randomZ(IVector1 lower, IVector1 upper)
	{
		double l = lower.getAsDouble();
		double u = upper.getAsDouble();
		double r = Math.random();
		r *= (u - l);
		r += l;
		z_ = r;
		return this;
	}
	
	public IVector3 normalize()
	{
		double length = Math.sqrt((x_ * x_) + (y_ * y_) + (z_ * z_));
		if (length != 0.0)
		{
			x_ /= length;
			y_ /= length;
			z_ /= length;
		}
		return this;
	}
	


	public IVector1 getLength()
	{
		return new Vector1Double(Math.sqrt((x_ * x_) + (y_ * y_)+ (z_ * z_)));
	}

	public IVector2 getDirection()
	{
		// todo:
		throw new UnsupportedOperationException();
		//return new Vector1Double(Math.atan2(y_, x_));
	}

	public IVector1 getDistance(IVector3 vector)
	{
		double dx = x_ - vector.getXAsDouble();
		double dy = y_ - vector.getYAsDouble();
		double dz = z_ - vector.getZAsDouble();
		return new Vector1Double(Math.sqrt((dx * dx) + (dy * dy) + (dz * dz)));
	}

	public IVector1 getX()
	{
		return new Vector1Double(x_);
	}

	public IVector1 getY()
	{
		return new Vector1Double(y_);
	}
	
	public IVector1 getZ()
	{
		return new Vector1Double(z_);
	}
	
	public void setX(IVector1 x)
	{
		this.x_	= x.getAsDouble(); 
	}

	public void setY(IVector1 y)
	{
		this.y_	= y.getAsDouble(); 
	}

	public void setZ(IVector1 z)
	{
		this.z_	= z.getAsDouble(); 
	}
	
	/** Returns the x-component of the vector as integer.
	 *
	 *  @return x-component as integer
	 */
	public int getXAsInteger()
	{
		return (int) x_;
	}

	/** Returns the component of the vector as integer.
	 *
	 *  @return y-component as float
	 */
	public int getYAsInteger()
	{
		return (int) y_;
	}
	
	/** Returns the component of the vector as integer.
	 *
	 *  @return y-component as float
	 */
	public int getZAsInteger()
	{
		return (int) z_;
	}
	
	/** Returns the x-component of the vector as long.
	 *
	 *  @return x-component as long
	 */
	public long getXAsLong()
	{
		return (long) x_;
	}

	/** Returns the component of the vector as float.
	 *
	 *  @return y-component as float
	 */
	public long getYAsLong()
	{
		return (long) y_;
	}
	
	/** Returns the component of the vector as float.
	 *
	 *  @return y-component as float
	 */
	public long getZAsLong()
	{
		return (long) z_;
	}
	
	public float getXAsFloat()
	{
		return (float) x_;
	}

	public float getYAsFloat()
	{
		return (float) y_;
	}
	
	public float getZAsFloat()
	{
		return (float) z_;
	}


	public double getXAsDouble()
	{
		return x_;
	}

	public double getYAsDouble()
	{
		return y_;
	}
	
	public double getZAsDouble()
	{
		return z_;
	}

	public BigDecimal getXAsBigDecimal()
	{
		return new BigDecimal(x_);
	}

	public BigDecimal getYAsBigDecimal()
	{
		return new BigDecimal(y_);
	}
	
	public BigDecimal getZAsBigDecimal()
	{
		return new BigDecimal(z_);
	}

	public IVector3 copy()
	{
		return new Vector3Double(x_, y_, z_);
	}

	public Object clone() throws CloneNotSupportedException
	{
		return copy();
	}

	public boolean equals(Object obj)
	{
		if (obj instanceof IVector3)
		{
			return equals((IVector3) obj);
		}

		return false;
	}

	public boolean equals(IVector3 vector)
	{
		// Perform null check, to respect equals(Object) contract
		return (Double.doubleToLongBits(x_) == Double.doubleToLongBits(vector.getXAsDouble())) &&
			   (Double.doubleToLongBits(y_) == Double.doubleToLongBits(vector.getYAsDouble())) &&
			   (Double.doubleToLongBits(z_) == Double.doubleToLongBits(vector.getZAsDouble()));
	}
	
	/** 
	 *  Compute the hash code.
	 *  @return The hash code.
	 */
	public int hashCode()
	{
		return (int)x_*31 + (int)y_*15 + (int)z_;
	}
	
	public String toString()
	{
		StringBuffer buffer = new StringBuffer();
		DecimalFormat format = new DecimalFormat("####.####");
		if ((x_ < 1000) || (x_ > 0.001))
		{
			buffer.append(format.format(x_));
		}
		else
		{
			buffer.append(Double.toString(x_));
		}
		buffer.append(",");
		if ((y_ < 10000) || (y_ > 0.001))
		{
			buffer.append(format.format(y_));
		}
		else
		{
			buffer.append(Double.toString(y_));
		}
		buffer.append(",");
		if ((z_ < 10000) || (z_ > 0.001))
		{
			buffer.append(format.format(z_));
		}
		else
		{
			buffer.append(Double.toString(z_));
		}
		return buffer.toString();
	}

	/**
	 *  Get a vector for three doubles.
	 *  @param x The first value.
	 *  @param y The second value.
	*  @param z The second value
	 *  @return The vector (null if at least one of args is null).
	 */
	public static IVector3 getVector3(Double x, Double y, Double z)
	{
		IVector3 ret = null;
		if(x!=null && y!=null && z!=null)
			ret = x.doubleValue()==0 && y.doubleValue()==0 && z.doubleValue()==0? ZERO: new Vector3Double(x.doubleValue(), y.doubleValue(), z.doubleValue());
		else if (x!=null || y !=null|| z !=null)
			ret = new Vector3Double(x == null? 0.0:x.doubleValue(), y == null? 0.0:y.doubleValue(),z == null? 0.0:z.doubleValue());
		return ret;
	}
}





© 2015 - 2024 Weber Informatics LLC | Privacy Policy