/*******************************************************************************
* Copyright 2010 Mario Zechner (contact@badlogicgames.com)
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS"
* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
******************************************************************************/
package com.badlogic.gdx.math;
/**
* Encapsulates a 2D vector. Allows chaining methods by returning a reference to itself
* @author badlogicgames@gmail.com
*
*/
public final class Vector2 {
/** static temporary vector **/
private final static Vector2 tmp = new Vector2();
/** the x-component of this vector **/
public float x;
/** the y-component of this vector **/
public float y;
/**
* Constructs a new vector at (0,0)
*/
public Vector2 () {
}
/**
* Constructs a vector with the given components
* @param x The x-component
* @param y The y-component
*/
public Vector2 (float x, float y) {
this.x = x;
this.y = y;
}
/**
* Constructs a vector from the given vector
* @param v The vector
*/
public Vector2 (Vector2 v) {
set(v);
}
/**
* @return a copy of this vector
*/
public Vector2 cpy () {
return new Vector2(this);
}
/**
* @return The euclidian length
*/
public float len () {
return (float)Math.sqrt(x * x + y * y);
}
/**
* @return The squared euclidian length
*/
public float len2 () {
return x * x + y * y;
}
/**
* Sets this vector from the given vector
* @param v The vector
* @return This vector for chaining
*/
public Vector2 set (Vector2 v) {
x = v.x;
y = v.y;
return this;
}
/**
* Sets the components of this vector
* @param x The x-component
* @param y The y-component
* @return This vector for chaining
*/
public Vector2 set (float x, float y) {
this.x = x;
this.y = y;
return this;
}
/**
* Substracts the given vector from this vector.
* @param v The vector
* @return This vector for chaining
*/
public Vector2 sub (Vector2 v) {
x -= v.x;
y -= v.y;
return this;
}
/**
* Normalizes this vector
* @return This vector for chaining
*/
public Vector2 nor () {
float len = len();
if (len != 0) {
x /= len;
y /= len;
}
return this;
}
/**
* Adds the given vector to this vector
* @param v The vector
* @return This vector for chaining
*/
public Vector2 add (Vector2 v) {
x += v.x;
y += v.y;
return this;
}
/**
* Adds the given components to this vector
* @param x The x-component
* @param y The y-component
* @return This vector for chaining
*/
public Vector2 add (float x, float y) {
this.x += x;
this.y += y;
return this;
}
/**
* @param v The other vector
* @return The dot product between this and the other vector
*/
public float dot (Vector2 v) {
return x * v.x + y * v.y;
}
/**
* Multiplies this vector by a scalar
* @param scalar The scalar
* @return This vector for chaining
*/
public Vector2 mul (float scalar) {
x *= scalar;
y *= scalar;
return this;
}
/**
* @param v The other vector
* @return the distance between this and the other vector
*/
public float dst (Vector2 v) {
float x_d = v.x - x;
float y_d = v.y - y;
return (float)Math.sqrt(x_d * x_d + y_d * y_d);
}
/**
* @param x The x-component of the other vector
* @param y The y-component of the other vector
* @return the distance between this and the other vector
*/
public float dst (float x, float y) {
float x_d = x - this.x;
float y_d = y - this.y;
return (float)Math.sqrt(x_d * x_d + y_d * y_d);
}
/**
* @param v The other vector
* @return the squared distance between this and the other vector
*/
public float dst2 (Vector2 v) {
float x_d = v.x - x;
float y_d = v.y - y;
return x_d * x_d + y_d * y_d;
}
public String toString () {
return "[" + x + ":" + y + "]";
}
/**
* Substracts the other vector from this vector.
* @param x The x-component of the other vector
* @param y The y-component of the other vector
* @return This vector for chaining
*/
public Vector2 sub (float x, float y) {
this.x -= x;
this.y -= y;
return this;
}
/**
* @return a temporary copy of this vector. Use with care as this is backed by a single static Vector2 instance. v1.tmp().add(
* v2.tmp() ) will not work!
*/
public Vector2 tmp () {
return tmp.set(this);
}
/**
* @param v the other vector
* @return The cross product between this and the other vector
*/
public float cross(final Vector2 v) {
return this.x * v.y - v.x * this.y;
}
/**
* @return The manhattan length
*/
public float lenManhattan() {
return Math.abs(this.x) + Math.abs(this.y);
}
}