/* $Revision$ $Author$ $Date$
*
* Copyright (C) 1997-2007 Stephan Michels <stephan@vern.chem.tu-berlin.de>
*
* Contact: cdk-devel@lists.sourceforge.net
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
* All we ask is that proper credit is given for our work, which includes
* - but is not limited to - adding the above copyright notice to the beginning
* of your source code files, and to any copyright notice that you may distribute
* with programs based on this work.
*
* 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
* */
package org.openscience.cdk.math;
import javax.vecmath.Tuple3d;
/**
* This class handles vectors.
*
* @cdk.module qm
*/
public class Vector
{
/** Null vector in 3 dimensional space */
public final static Vector NULLVECTOR = new Vector(new double[] {0d,0d,0d});
/** Unary vector in 3 dimensional space */
public final static Vector EX = new Vector(new double[] {1d,0d,0d});
/** Unary vector in 3 dimensional space */
public final static Vector EY = new Vector(new double[] {0d,1d,0d});
/** Unary vector in 3 dimensional space */
public final static Vector EZ = new Vector(new double[] {0d,0d,1d});
// Attention! Variables are unprotected
/** The content of this vector */
public double[] vector;
/** The size of this vector */
public int size;
/**
* Constructs a Vector with "size" elements
*/
public Vector(int size)
{
vector = new double[size];
this.size = size;
}
/**
* Constructs a vector with the content of a array
*/
public Vector(double[] array)
{
vector = array;
size = array.length;
}
/**
* Constructs a Vector with a Tuple3d, Vector3d or Point3d
*/
public Vector(Tuple3d t)
{
vector = new double[3];
size = 3;
vector[0] = t.x; vector[1] = t.y; vector[2] = t.z;
}
/**
* Returns the size of this vector
*/
public int getSize()
{
return size;
}
/**
* Addition from two vectors
*/
public Vector add(Vector b)
{
if ((b==null) ||
(size!=b.size))
return null;
int i;
Vector result = new Vector(size);
for(i=0; i<size; i++)
result.vector[i] = vector[i]+b.vector[i];
return result;
}
/**
* Subtraktion from two vectors
*/
public Vector sub(Vector b)
{
if ((b==null) ||
(size!=b.size))
return null;
int i;
Vector result = new Vector(size);
for(i=0; i<size; i++)
result.vector[i] = vector[i]-b.vector[i];
return result;
}
/**
* Multiplikation from a vectors with an double
*/
public Vector mul(double b)
{
Vector result = new Vector(size);
int i;
for(i=0; i<size; i++)
result.vector[i] = vector[i]*b;
return result;
}
/**
* Multiplikation from two vectors
*/
public double dot(Vector b)
{
if ((b==null) ||
(size!=b.size))
return Double.NaN;
double result = 0;
int i;
for(i=0; i<size; i++)
result += vector[i]*b.vector[i];
return result;
}
/**
* Cross product, only well definited in R^3
*/
public Vector cross(Vector b)
{
if ((b==null) ||
(size!=3) || (b.size!=3))
return null;
Vector result = new Vector(3);
result.vector[0] = vector[1]*b.vector[2]-vector[2]*b.vector[1];
result.vector[1] = vector[2]*b.vector[0]-vector[0]*b.vector[2];
result.vector[2] = vector[0]*b.vector[1]-vector[1]*b.vector[0];
return result;
}
/**
* Return the length from this vector
*/
public double length()
{
double value = 0;
for(int i=0; i<size; i++)
value += vector[i]*vector[i];
return Math.sqrt(value);
}
/**
* Normalize this vector
*/
public Vector normalize()
{
Vector result = new Vector(size);
double length = length();
for(int i=0; i<size; i++)
result.vector[i] = vector[i]/length;
return result;
}
/**
* Negates this vector
*/
public Vector negate()
{
Vector result = new Vector(size);
for(int i=0; i<size; i++)
result.vector[i] = -vector[i];
return result;
}
/**
* Copy a vector
*/
public Vector duplicate()
{
Vector result = new Vector(size);
int i;
for(i=0; i<size; i++)
result.vector[i] = vector[i];
return result;
}
/**
* Return a vector as a string
*/
public String toString()
{
int i;
StringBuffer str = new StringBuffer();
str.append("[ ");
for(i=0; i<(size-1); i++)
str.append(vector[i]+" ");
str.append(vector[size-1]+" ]");
return str.toString();
}
}