package org.glscene.geometry;
import java.nio.ByteBuffer;
import org.glscene.util.DirectBufferable;
public final class Vector3f implements DirectBufferable {
private float fX, fY, fZ;
public static final Vector3f NullVector = new Vector3f(0, 0, 0);
public static final Vector3f XVector = new Vector3f(1, 0, 0);
public static final Vector3f YVector = new Vector3f(0, 1, 0);
public static final Vector3f ZVector = new Vector3f(0, 0, 1);
public Vector3f(float x, float y, float z) {
fX = x;
fY = y;
fZ = z;
}
public Vector3f(Vector2f xy, float z) {
fX = xy.getX();
fY = xy.getY();
fZ = z;
}
public float getX() { return fX; }
public float getY() { return fY; }
public float getZ() { return fZ; }
public Vector2f getXY() { return new Vector2f(fX, fY); }
public String toString() {
return "["+Float.toString(fX)+"; "+Float.toString(fY)+"; "+Float.toString(fZ)+"]";
}
public void putInto(ByteBuffer buffer) {
buffer.putFloat(fX);
buffer.putFloat(fY);
buffer.putFloat(fZ);
}
public static Vector3f add (Vector3f a, Vector3f b) {
return new Vector3f(a.fX+b.fX, a.fY+b.fY, a.fZ+b.fZ);
}
public static Vector3f sub (Vector3f a, Vector3f b) {
return new Vector3f(a.fX-b.fX, a.fY-b.fY, a.fZ-b.fZ);
}
public static float dot (Vector3f a, Vector3f b) {
return a.fX*b.fX+a.fY*b.fY+a.fZ*b.fZ;
}
public float length() {
return (float) Math.sqrt((double) length2());
}
public float length2() {
return fX*fX+fY*fY+fZ*fZ;
}
public Vector3f normalize() {
float len = length();
if (len>0) {
float d = 1/len;
return new Vector3f(fX*d, fY*d, fZ*d);
} else {
return NullVector;
}
}
public Vector3f adjustLength(float newLength) {
float len = length();
if (len>0) {
float d = newLength/len;
return new Vector3f(fX*d, fY*d, fZ*d);
} else {
return NullVector;
}
}
public Vector3f scale(float f) {
return new Vector3f(fX*f, fY*f, fZ*f);
}
}
|