diff options
Diffstat (limited to 'src/javax/vecmath/GVector.java')
-rw-r--r-- | src/javax/vecmath/GVector.java | 931 |
1 files changed, 0 insertions, 931 deletions
diff --git a/src/javax/vecmath/GVector.java b/src/javax/vecmath/GVector.java deleted file mode 100644 index 9cd1412..0000000 --- a/src/javax/vecmath/GVector.java +++ /dev/null @@ -1,931 +0,0 @@ -/* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code 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 - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - * - */ - -package javax.vecmath; - - -/** - * A double precision, general, dynamically-resizable, - * one-dimensional vector class. Index numbering begins with zero. - */ - -public class GVector implements java.io.Serializable, Cloneable { - - private int length; - double[] values; - - // Compatible with 1.1 - static final long serialVersionUID = 1398850036893875112L; - - /** - * Constructs a new GVector of the specified - * length with all vector elements initialized to 0. - * @param length the number of elements in this GVector. - */ - public GVector(int length) - { - int i; - - this.length = length; - values = new double[length]; - for(i = 0; i < length; i++) values[i] = 0.0; - } - - /** - * Constructs a new GVector from the specified array elements. - * The length of this GVector is set to the length of the - * specified array. The array elements are copied into this new - * GVector. - * @param vector the values for the new GVector. - */ - public GVector(double[] vector) - { - int i; - - length = vector.length; - values = new double[vector.length]; - for(i = 0; i < length; i++) values[i] = vector[i]; - } - - /** - * Constructs a new GVector from the specified vector. - * The vector elements are copied into this new GVector. - * @param vector the source GVector for this new GVector. - */ - public GVector(GVector vector) - { - int i; - - values = new double[vector.length]; - length = vector.length; - for(i = 0; i < length; i++) values[i] = vector.values[i]; - } - - /** - * Constructs a new GVector and copies the initial values - * from the specified tuple. - * @param tuple the source for the new GVector's initial values - */ - public GVector(Tuple2f tuple) - { - values = new double[2]; - values[0] = (double)tuple.x; - values[1] = (double)tuple.y; - length = 2; - } - - /** - * Constructs a new GVector and copies the initial values - * from the specified tuple. - * @param tuple the source for the new GVector's initial values - */ - public GVector(Tuple3f tuple) - { - values = new double[3]; - values[0] = (double)tuple.x; - values[1] = (double)tuple.y; - values[2] = (double)tuple.z; - length = 3; - } - - /** - * Constructs a new GVector and copies the initial values - * from the specified tuple. - * @param tuple the source for the new GVector's initial values - */ - public GVector(Tuple3d tuple) - { - values = new double[3]; - values[0] = tuple.x; - values[1] = tuple.y; - values[2] = tuple.z; - length = 3; - } - - /** - * Constructs a new GVector and copies the initial values - * from the specified tuple. - * @param tuple the source for the new GVector's initial values - */ - public GVector(Tuple4f tuple) - { - values = new double[4]; - values[0] = (double)tuple.x; - values[1] = (double)tuple.y; - values[2] = (double)tuple.z; - values[3] = (double)tuple.w; - length = 4; - } - - /** - * Constructs a new GVector and copies the initial values - * from the specified tuple. - * @param tuple the source for the new GVector's initial values - */ - public GVector(Tuple4d tuple) - { - values = new double[4]; - values[0] = tuple.x; - values[1] = tuple.y; - values[2] = tuple.z; - values[3] = tuple.w; - length = 4; - } - - /** - * Constructs a new GVector of the specified length and - * initializes it by copying the specified number of elements from - * the specified array. The array must contain at least - * <code>length</code> elements (i.e., <code>vector.length</code> >= - * <code>length</code>. The length of this new GVector is set to - * the specified length. - * @param vector The array from which the values will be copied. - * @param length The number of values copied from the array. - */ - public GVector(double vector[], int length) { - int i; - - this.length = length; - values = new double [length]; - for(i=0;i<length;i++) { - values[i] = vector[i]; - } - } - - /** - * Returns the square root of the sum of the squares of this - * vector (its length in n-dimensional space). - * @return length of this vector - */ - - public final double norm() - { - double sq = 0.0; - int i; - - for(i=0;i<length;i++) { - sq += values[i]*values[i]; - } - - return(Math.sqrt(sq)); - - } - - /** - * Returns the sum of the squares of this - * vector (its length squared in n-dimensional space). - * @return length squared of this vector - */ - public final double normSquared() - { - double sq = 0.0; - int i; - - for(i=0;i<length;i++) { - sq += values[i]*values[i]; - } - - return(sq); - } - - /** - * Sets the value of this vector to the normalization of vector v1. - * @param v1 the un-normalized vector - */ - public final void normalize(GVector v1) - { - double sq = 0.0; - int i; - - if( length != v1.length) - throw new MismatchedSizeException(VecMathI18N.getString("GVector0")); - - for(i=0;i<length;i++) { - sq += v1.values[i]*v1.values[i]; - } - - double invMag; - invMag = 1.0/Math.sqrt(sq); - - for(i=0;i<length;i++) { - values[i] = v1.values[i]*invMag; - } - } - - - /** - * Normalizes this vector in place. - */ - public final void normalize() - { - double sq = 0.0; - int i; - - for(i=0;i<length;i++) { - sq += values[i]*values[i]; - } - - double invMag; - invMag = 1.0/Math.sqrt(sq); - - for(i=0;i<length;i++) { - values[i] = values[i]*invMag; - } - - } - - /** - * Sets the value of this vector to the scalar multiplication - * of the scale factor with the vector v1. - * @param s the scalar value - * @param v1 the source vector - */ - public final void scale(double s, GVector v1) - { - int i; - if( length != v1.length) - throw new MismatchedSizeException(VecMathI18N.getString("GVector1")); - - for(i=0;i<length;i++) { - values[i] = v1.values[i]*s; - } - } - - /** - * Scales this vector by the scale factor s. - * @param s the scalar value - */ - public final void scale(double s) - { - int i; - - for(i=0;i<length;i++) { - values[i] = values[i]*s; - } - } - - /** - * Sets the value of this vector to the scalar multiplication by s - * of vector v1 plus vector v2 (this = s*v1 + v2). - * @param s the scalar value - * @param v1 the vector to be multiplied - * @param v2 the vector to be added - */ - public final void scaleAdd(double s, GVector v1, GVector v2) - { - - int i; - - if( v2.length != v1.length ) - throw new MismatchedSizeException(VecMathI18N.getString("GVector2")); - - if( length != v1.length ) - throw new MismatchedSizeException(VecMathI18N.getString("GVector3")); - - for(i=0;i<length;i++) { - values[i] = v1.values[i]*s + v2.values[i]; - } - } - - /** - * Sets the value of this vector to sum of itself and the specified - * vector - * @param vector the second vector - */ - public final void add(GVector vector) - { - int i; - - if( length != vector.length ) - throw new MismatchedSizeException(VecMathI18N.getString("GVector4")); - - for(i = 0; i < length; i++) { - this.values[i] += vector.values[i]; - } - } - - /** - * Sets the value of this vector to the vector sum of vectors vector1 - * and vector2. - * @param vector1 the first vector - * @param vector2 the second vector - */ - public final void add(GVector vector1, GVector vector2) - { - int i; - - if( vector1.length != vector2.length ) - throw new MismatchedSizeException(VecMathI18N.getString("GVector5")); - - if( length != vector1.length ) - throw new MismatchedSizeException(VecMathI18N.getString("GVector6")); - - for(i = 0; i < length; i++) - this.values[i] = vector1.values[i] + vector2.values[i]; - } - - /** - * Sets the value of this vector to the vector difference of itself - * and vector (this = this - vector). - * @param vector the other vector - */ - public final void sub(GVector vector) - { - int i; - - if( length != vector.length ) - throw new MismatchedSizeException(VecMathI18N.getString("GVector7")); - - for(i = 0; i < length; i++) { - this.values[i] -= vector.values[i]; - } - } - - /** - * Sets the value of this vector to the vector difference - * of vectors vector1 and vector2 (this = vector1 - vector2). - * @param vector1 the first vector - * @param vector2 the second vector - */ - public final void sub(GVector vector1, GVector vector2) - { - int i,l; - - - if( vector1.length != vector2.length ) - throw new MismatchedSizeException(VecMathI18N.getString("GVector8")); - - if( length != vector1.length ) - throw new MismatchedSizeException(VecMathI18N.getString("GVector9")); - - for(i = 0; i < length; i++) - this.values[i] = vector1.values[i] - vector2.values[i]; - } - - /** - * Multiplies matrix m1 times Vector v1 and places the result - * into this vector (this = m1*v1). - * @param m1 The matrix in the multiplication - * @param v1 The vector that is multiplied - */ - public final void mul(GMatrix m1, GVector v1) { - if (m1.getNumCol() != v1.length) - throw new MismatchedSizeException(VecMathI18N.getString("GVector10")); - - if (length != m1.getNumRow()) - throw new MismatchedSizeException(VecMathI18N.getString("GVector11")); - - double v[]; - if (v1 != this) { - v = v1.values; - } else { - v = (double []) values.clone(); - } - - for(int j=length-1; j>=0; j--){ - values[j] = 0.0; - for(int i=v1.length-1;i>=0; i--){ - values[j] += m1.values[j][i] * v[i]; - } - } - } - - /** - * Multiplies the transpose of vector v1 (ie, v1 becomes a row - * vector with respect to the multiplication) times matrix m1 - * and places the result into this vector - * (this = transpose(v1)*m1). The result is technically a - * row vector, but the GVector class only knows about column - * vectors, and so the result is stored as a column vector. - * @param m1 The matrix in the multiplication - * @param v1 The vector that is temporarily transposed - */ - public final void mul(GVector v1, GMatrix m1) { - if (m1.getNumRow() != v1.length) - throw new MismatchedSizeException(VecMathI18N.getString("GVector12")); - - if (length != m1.getNumCol()) - throw new MismatchedSizeException(VecMathI18N.getString("GVector13")); - - double v[]; - if (v1 != this) { - v = v1.values; - } else { - v = (double []) values.clone(); - } - - for (int j=length-1; j>=0; j--){ - values[j] = 0.0; - for(int i=v1.length-1; i>=0; i--){ - values[j] += m1.values[i][j] * v[i]; - } - } - } - - /** - * Negates the value of this vector: this = -this. - */ - public final void negate() { - for(int i=length-1; i>=0; i--) { - this.values[i] *= -1.0; - } - } - - /** - * Sets all the values in this vector to zero. - */ - public final void zero() { - for (int i=0; i < this.length; i++) { - this.values[i] = 0.0; - } - } - - /** - * Changes the size of this vector dynamically. If the size is increased - * no data values will be lost. If the size is decreased, only those data - * values whose vector positions were eliminated will be lost. - * @param length number of desired elements in this vector - */ - public final void setSize(int length) { - double[] tmp = new double[length]; - int i,max; - - if( this.length < length) - max = this.length; - else - max = length; - - for(i=0;i<max;i++) { - tmp[i] = values[i]; - } - this.length = length; - - values = tmp; - - } - - /** - * Sets the value of this vector to the values found in the array - * parameter. The array should be at least equal in length to - * the number of elements in the vector. - * @param vector the source array - */ - public final void set(double[] vector) { - for(int i = length-1; i >=0; i--) - values[i] = vector[i]; - } - - /** - * Sets the value of this vector to the values found in vector vector. - * @param vector the source vector - */ - public final void set(GVector vector) { - int i; - - if (length < vector.length) { - length = vector.length; - values = new double[length]; - for(i = 0; i < length; i++) - values[i] = vector.values[i]; - }else { - for(i = 0; i < vector.length; i++) - values[i] = vector.values[i]; - for(i = vector.length; i < length; i++) - values[i] = 0.0; - } - } - - /** - * Sets the value of this vector to the values in tuple - * @param tuple the source for the new GVector's new values - */ - public final void set(Tuple2f tuple) - { - if (length < 2) { - length = 2; - values = new double[2]; - } - values[0] = (double)tuple.x; - values[1] = (double)tuple.y; - for(int i = 2; i < length; i++) values[i] = 0.0; - - } - - /** - * Sets the value of this vector to the values in tuple - * @param tuple the source for the new GVector's new values - */ - public final void set(Tuple3f tuple) - { - if (length < 3) { - length = 3; - values = new double[3]; - } - values[0] = (double)tuple.x; - values[1] = (double)tuple.y; - values[2] = (double)tuple.z; - for(int i = 3; i < length; i++) values[i] = 0.0; - } - - /** - * Sets the value of this vector to the values in tuple - * @param tuple the source for the new GVector's new values - */ - public final void set(Tuple3d tuple) - { - if (length < 3) { - length = 3; - values = new double[3]; - } - values[0] = tuple.x; - values[1] = tuple.y; - values[2] = tuple.z; - for(int i = 3; i < length; i++) values[i] = 0.0; - } - - /** - * Sets the value of this vector to the values in tuple - * @param tuple the source for the new GVector's new values - */ - public final void set(Tuple4f tuple) - { - if (length < 4) { - length = 4; - values = new double[4]; - } - values[0] = (double)tuple.x; - values[1] = (double)tuple.y; - values[2] = (double)tuple.z; - values[3] = (double)tuple.w; - for(int i = 4; i < length; i++) values[i] = 0.0; - } - - /** - * Sets the value of this vector to the values in tuple - * @param tuple the source for the new GVector's new values - */ - public final void set(Tuple4d tuple) - { - if (length < 4) { - length = 4; - values = new double[4]; - } - values[0] = tuple.x; - values[1] = tuple.y; - values[2] = tuple.z; - values[3] = tuple.w; - for(int i = 4; i < length; i++) values[i] = 0.0; - } - - /** - * Returns the number of elements in this vector. - * @return number of elements in this vector - */ - public final int getSize() - { - return values.length; - } - - /** - * Retrieves the value at the specified index value of this vector. - * @param index the index of the element to retrieve (zero indexed) - * @return the value at the indexed element - */ - public final double getElement(int index) - { - return values[index]; - } - - - /** - * Modifies the value at the specified index of this vector. - * @param index the index if the element to modify (zero indexed) - * @param value the new vector element value - */ - public final void setElement(int index, double value) - { - values[index] = value; - } - - /** - * Returns a string that contains the values of this GVector. - * @return the String representation - */ - @Override - public String toString() { - StringBuffer buffer = new StringBuffer(length*8); - - int i; - - for(i=0;i<length;i++) { - buffer.append(values[i]).append(" "); - } - - return buffer.toString(); - - } - - - /** - * Returns a hash code value based on the data values in this - * object. Two different GVector objects with identical data - * values (i.e., GVector.equals returns true) will return the - * same hash number. Two GVector objects with different data - * members may return the same hash value, although this is not - * likely. - * @return the integer hash code value - */ - @Override - public int hashCode() { - long bits = 1L; - - for (int i = 0; i < length; i++) { - bits = VecMathUtil.hashDoubleBits(bits, values[i]); - } - - return VecMathUtil.hashFinish(bits); - } - - - /** - * Returns true if all of the data members of GVector vector1 are - * equal to the corresponding data members in this GVector. - * @param vector1 The vector with which the comparison is made. - * @return true or false - */ - public boolean equals(GVector vector1) - { - try { - if( length != vector1.length) return false; - - for(int i = 0;i<length;i++) { - if( values[i] != vector1.values[i]) return false; - } - - return true; - } - catch (NullPointerException e2) { return false; } - - } - /** - * Returns true if the Object o1 is of type GMatrix and all of the - * data members of o1 are equal to the corresponding data members in - * this GMatrix. - * @param o1 The object with which the comparison is made. - * @return true or false - */ - @Override - public boolean equals(Object o1) - { - try { - GVector v2 = (GVector) o1; - - if( length != v2.length) return false; - - for(int i = 0;i<length;i++) { - if( values[i] != v2.values[i]) return false; - } - return true; - } - catch (ClassCastException e1) { return false; } - catch (NullPointerException e2) { return false; } - - } - - /** - * Returns true if the L-infinite distance between this vector - * and vector v1 is less than or equal to the epsilon parameter, - * otherwise returns false. The L-infinite - * distance is equal to - * MAX[abs(x1-x2), abs(y1-y2), . . . ]. - * @param v1 The vector to be compared to this vector - * @param epsilon the threshold value - */ - public boolean epsilonEquals(GVector v1, double epsilon) - { - double diff; - - if( length != v1.length) return false; - - for(int i = 0;i<length;i++) { - diff = values[i] - v1.values[i]; - if( (diff<0?-diff:diff) > epsilon) return false; - } - return true; - } - - /** - * Returns the dot product of this vector and vector v1. - * @param v1 the other vector - * @return the dot product of this and v1 - */ - public final double dot(GVector v1) - { - if( length != v1.length) - throw new MismatchedSizeException(VecMathI18N.getString("GVector14")); - - double result = 0.0; - for(int i = 0;i<length;i++) { - result += values[i] * v1.values[i]; - } - return result; - } - - - /** - * Solves for x in Ax = b, where x is this vector (nx1), A is mxn, - * b is mx1, and A = U*W*transpose(V); U,W,V must - * be precomputed and can be found by taking the singular value - * decomposition (SVD) of A using the method SVD found in the - * GMatrix class. - * @param U The U matrix produced by the GMatrix method SVD - * @param W The W matrix produced by the GMatrix method SVD - * @param V The V matrix produced by the GMatrix method SVD - * @param b The b vector in the linear equation Ax = b - */ - public final void SVDBackSolve(GMatrix U, GMatrix W, GMatrix V, GVector b) - { - if( !(U.nRow == b.getSize() && - U.nRow == U.nCol && - U.nRow == W.nRow ) ) { - throw new MismatchedSizeException(VecMathI18N.getString("GVector15")); - } - - if( !(W.nCol == values.length && - W.nCol == V.nCol && - W.nCol == V.nRow ) ) { - throw new MismatchedSizeException(VecMathI18N.getString("GVector23")); - } - - GMatrix tmp = new GMatrix( U.nRow, W.nCol); - tmp.mul( U, V); - tmp.mulTransposeRight( U, W); - tmp.invert(); - mul(tmp, b); - - } - - /** - * LU Decomposition Back Solve; this method takes the LU matrix - * and the permutation vector produced by the GMatrix method LUD - * and solves the equation (LU)*x = b by placing the solution vector - * x into this vector. This vector should be the same length or - * longer than b. - * @param LU The matrix into which the lower and upper decompostions - * have been placed - * @param b The b vector in the equation (LU)*x = b - * @param permutation The row permuations that were necessary to - * produce the LU matrix parameter - */ - public final void LUDBackSolve(GMatrix LU, GVector b, GVector permutation) - { - int size = LU.nRow*LU.nCol; - - double[] temp = new double[size]; - double[] result = new double[size]; - int[] row_perm = new int[b.getSize()]; - int i,j; - - if( LU.nRow != b.getSize() ) { - throw new MismatchedSizeException(VecMathI18N.getString("GVector16")); - } - - if( LU.nRow != permutation.getSize() ) { - throw new MismatchedSizeException(VecMathI18N.getString("GVector24")); - } - - if (LU.nRow != LU.nCol) { - throw new MismatchedSizeException(VecMathI18N.getString("GVector25")); - } - - for(i=0;i<LU.nRow;i++) { - for(j=0;j<LU.nCol;j++) { - temp[i*LU.nCol+j] = LU.values[i][j]; - } - } - - for(i=0;i<size;i++) result[i] = 0.0; - for(i=0;i<LU.nRow;i++) result[i*LU.nCol] = b.values[i]; - for(i=0;i<LU.nCol;i++) row_perm[i] = (int)permutation.values[i]; - - GMatrix.luBacksubstitution(LU.nRow, temp, row_perm, result); - - for(i=0;i<LU.nRow;i++) this.values[i] = result[i*LU.nCol]; - } - - /** - * Returns the (n-space) angle in radians between this vector and - * the vector parameter; the return value is constrained to the - * range [0,PI]. - * @param v1 The other vector - * @return The angle in radians in the range [0,PI] - */ - public final double angle(GVector v1) - { - return( Math.acos( this.dot(v1) / ( this.norm()*v1.norm() ) ) ); - } - - - /** - * @deprecated Use interpolate(GVector, GVector, double) instead - */ - public final void interpolate(GVector v1, GVector v2, float alpha) { - interpolate(v1, v2, (double)alpha); - } - - - /** - * @deprecated Use interpolate(GVector, double) instead - */ - public final void interpolate(GVector v1, float alpha) { - interpolate(v1, (double)alpha); - } - - - /** - * Linearly interpolates between vectors v1 and v2 and places the - * result into this tuple: this = (1-alpha)*v1 + alpha*v2. - * @param v1 the first vector - * @param v2 the second vector - * @param alpha the alpha interpolation parameter - */ - public final void interpolate(GVector v1, GVector v2, double alpha) - { - if( v2.length != v1.length ) - throw new MismatchedSizeException(VecMathI18N.getString("GVector20")); - - if( length != v1.length ) - throw new MismatchedSizeException(VecMathI18N.getString("GVector21")); - - for(int i=0;i<length;i++) { - values[i] = (1-alpha)*v1.values[i] + alpha*v2.values[i]; - } - } - - /** - * Linearly interpolates between this vector and vector v1 and - * places the result into this tuple: this = (1-alpha)*this + alpha*v1. - * @param v1 the first vector - * @param alpha the alpha interpolation parameter - */ - public final void interpolate(GVector v1, double alpha) - { - if( v1.length != length ) - throw new MismatchedSizeException(VecMathI18N.getString("GVector22")); - - for(int i=0;i<length;i++) { - values[i] = (1-alpha)*values[i] + alpha*v1.values[i]; - } - } - - /** - * Creates a new object of the same class as this object. - * - * @return a clone of this instance. - * @exception OutOfMemoryError if there is not enough memory. - * @see java.lang.Cloneable - * @since vecmath 1.3 - */ - @Override - public Object clone() { - GVector v1 = null; - try { - v1 = (GVector)super.clone(); - } catch (CloneNotSupportedException e) { - // this shouldn't happen, since we are Cloneable - throw new InternalError(); - } - - // Also need to clone array of values - v1.values = new double[length]; - for (int i = 0; i < length; i++) { - v1.values[i] = values[i]; - } - - return v1; - } - -} |