181 lines
3.4 KiB
Java
181 lines
3.4 KiB
Java
package org.gcube.portlets.admin.accountingmanager.client.graphics;
|
|
|
|
/**
|
|
*
|
|
* Basic Vector 2D
|
|
*
|
|
* @author giancarlo email: <a
|
|
* href="mailto:g.panichi@isti.cnr.it">g.panichi@isti.cnr.it</a>
|
|
*
|
|
*/
|
|
public class Vector2D {
|
|
|
|
public static Vector2D Vector2DNull = new Vector2D(0, 0);
|
|
|
|
protected double x;
|
|
protected double y;
|
|
|
|
public Vector2D() {
|
|
x = y = 0.0;
|
|
}
|
|
|
|
public Vector2D(double x, double y) {
|
|
this.x = x;
|
|
this.y = y;
|
|
}
|
|
|
|
public double getX() {
|
|
return x;
|
|
}
|
|
|
|
public void setX(double x) {
|
|
this.x = x;
|
|
}
|
|
|
|
public double getY() {
|
|
return y;
|
|
}
|
|
|
|
public void setY(double y) {
|
|
this.y = y;
|
|
}
|
|
|
|
// Compute magnitude of vector ....
|
|
public double length() {
|
|
return Math.sqrt(x * x + y * y);
|
|
}
|
|
|
|
// Sum of two vectors ....
|
|
public Vector2D add(Vector2D v) {
|
|
Vector2D v1 = new Vector2D(this.x + v.x, this.y + v.y);
|
|
return v1;
|
|
}
|
|
|
|
// Add scalar
|
|
public Vector2D add(double s) {
|
|
Vector2D v1 = new Vector2D(this.x + s, this.y + s);
|
|
return v1;
|
|
}
|
|
|
|
// Subtract vector v1 from v .....
|
|
public Vector2D sub(Vector2D v) {
|
|
Vector2D v1 = new Vector2D(this.x - v.x, this.y - v.y);
|
|
return v1;
|
|
}
|
|
|
|
// Subtract scalar
|
|
public Vector2D sub(double s) {
|
|
Vector2D v2 = new Vector2D(this.x - s, this.y - s);
|
|
return v2;
|
|
}
|
|
|
|
// Scale vector by a constant ...
|
|
public Vector2D scale(double scaleFactor) {
|
|
Vector2D v2 = new Vector2D(this.x * scaleFactor, this.y * scaleFactor);
|
|
return v2;
|
|
}
|
|
|
|
// Normalize a vectors length....
|
|
public Vector2D normalize() {
|
|
Vector2D v2 = new Vector2D();
|
|
|
|
double length = Math.sqrt(this.x * this.x + this.y * this.y);
|
|
if (length != 0) {
|
|
v2.x = this.x / length;
|
|
v2.y = this.y / length;
|
|
}
|
|
|
|
return v2;
|
|
}
|
|
|
|
// Dot product of two vectors .....
|
|
public double dot(Vector2D v) {
|
|
return this.x * v.x + this.y * v.y;
|
|
}
|
|
|
|
// Multiply
|
|
public Vector2D multiply(Vector2D v) {
|
|
Vector2D v1 = new Vector2D(this.x * v.getX(), this.y * v.getY());
|
|
return v1;
|
|
}
|
|
|
|
public Vector2D multiply(double s) {
|
|
Vector2D v1 = new Vector2D(this.x * s, this.y * s);
|
|
return v1;
|
|
}
|
|
|
|
// Divide
|
|
public Vector2D divide(Vector2D v) {
|
|
Vector2D v1 = new Vector2D(this.x / v.getX(), this.y / v.getY());
|
|
return v1;
|
|
}
|
|
|
|
public Vector2D divide(double s) {
|
|
if (s != 0) {
|
|
Vector2D v1 = new Vector2D(this.x / s, this.y / s);
|
|
return v1;
|
|
} else {
|
|
return Vector2DNull;
|
|
}
|
|
|
|
}
|
|
|
|
// Distance To Squared
|
|
public double distanceToSquared(Vector2D v) {
|
|
double dx = this.x - v.x, dy = this.y - v.y;
|
|
return dx * dx + dy * dy;
|
|
|
|
}
|
|
|
|
// Distance
|
|
public double distance(Vector2D v) {
|
|
return Math.sqrt(this.distanceToSquared(v));
|
|
}
|
|
|
|
// Negate
|
|
public Vector2D negate() {
|
|
Vector2D v1 = new Vector2D(-x, -y);
|
|
return v1;
|
|
}
|
|
|
|
public boolean equals(Vector2D v) {
|
|
return v.getX() == x && v.getY() == y;
|
|
}
|
|
|
|
public Vector2D copy() {
|
|
return new Vector2D(x, y);
|
|
}
|
|
|
|
// Floor
|
|
public Vector2D floor() {
|
|
Vector2D v1 = new Vector2D(Math.floor(this.x), Math.floor(this.y));
|
|
return v1;
|
|
}
|
|
|
|
// Ceil
|
|
public Vector2D ceil() {
|
|
Vector2D v1 = new Vector2D(Math.ceil(this.x), Math.ceil(this.y));
|
|
return v1;
|
|
}
|
|
|
|
// Round
|
|
public Vector2D round() {
|
|
Vector2D v1 = new Vector2D(Math.round(this.x), Math.round(this.y));
|
|
return v1;
|
|
}
|
|
|
|
// Round To Zero
|
|
public Vector2D roundToZero() {
|
|
double dx=x<0?Math.ceil( this.x ):Math.floor( this.x );
|
|
double dy=y<0?Math.ceil( this.y ):Math.floor( this.y );
|
|
Vector2D v1 = new Vector2D(dx,dy);
|
|
return v1;
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return "Vector2D [x=" + x + ", y=" + y + "]";
|
|
}
|
|
|
|
}
|