/* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.lwjgl.vector; import org.lwjgl.Math; /** * $Id$ * * Holds a 4-tuple vector. * * @author cix_foo * @version $Revision$ */ public class Vector4f { public float x, y, z, w; /** * Constructor for Vector4f. */ public Vector4f() { super(); } /** * Constructor */ public Vector4f(Vector4f src) { set(src); } /** * Constructor */ public Vector4f(float x, float y, float z, float w) { set(x, y, z, w); } /** * Set values * @return this */ public Vector4f set(float x, float y, float z, float w) { this.x = x; this.y = y; this.z = z; this.w = w; return this; } /** * Load from another Vector4f * @param src The source vector * @return this */ public Vector4f set(Vector4f src) { x = src.x; y = src.y; z = src.z; w = src.w; return this; } /** * @return the length of the vector */ public float length() { return Math.sqrt(lengthSquared()); } /** * @return the length squared of the vector */ public float lengthSquared() { return x * x + y * y + z * z + w * w; } /** * Translate a vector * @param x The translation in x * @param y the translation in y * @return this */ public Vector4f translate(float x, float y, float z, float w) { this.x += x; this.y += y; this.z += z; this.w += w; return this; } /** * Negate a vector * @return this */ public Vector4f negate() { x = -x; y = -y; z = -z; w = -w; return this; } /** * Normalise this vector * @return this */ public Vector4f normalise() { float l = 1.0f / length(); x *= l; y *= l; z *= l; w *= l; return this; } /** * Normalise this vector and place the result in another vector. * @param dest The destination vector, or null if a new vector is to be created * @return the normalised vector */ public Vector4f normalise(Vector4f dest) { float l = length(); if (dest == null) dest = new Vector4f(x / l, y / l, z / l, w / l); else dest.set(x / l, y / l, z / l, w / l); return dest; } /** * The dot product of two vectors is calculated as * v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + v1.w * v2.w * @param left The LHS vector * @param right The RHS vector * @return left dot right */ public static float dot(Vector4f left, Vector4f right) { return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; } /** * Calculate the angle between two vectors, in degrees * @param a A vector * @param b The other vector * @return the angle between the two vectors, in degrees */ public static float angle(Vector4f a, Vector4f b) { float dls = dot(a, b) / (a.length() * b.length()); if (dls < -1f) dls = -1f; else if (dls > 1.0f) dls = 1.0f; return Math.acos(dls); } }