/* * $RCSfile: GVector.java,v $ * * 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. * * $Revision: 1.7 $ * $Date: 2008/02/28 20:18:50 $ * $State: Exp $ */ package javax.vecmath; import java.lang.Math; /** * 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 * length elements (i.e., vector.length >= * length. 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=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=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 */ public String toString() { StringBuffer buffer = new StringBuffer(length*8); int i; for(i=0;i> 32)); } /** * 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 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