package min3d.vos;
/**
* Simple VO holding x,y, and z values. Plus helper math functions.
* Care should be taken to avoid creating Number3d instances unnecessarily.
* Its use is not required for the construction of vertices.
*/
public class Number3d
{
public float x;
public float y;
public float z;
private static Number3d _temp = new Number3d();
public Number3d()
{
x = 0;
y = 0;
z = 0;
}
public Number3d(float $x, float $y, float $z)
{
x = $x;
y = $y;
z = $z;
}
//
public void setAll(float $x, float $y, float $z)
{
x = $x;
y = $y;
z = $z;
}
public void setAllFrom(Number3d $n)
{
x = $n.x;
y = $n.y;
z = $n.z;
}
public void normalize()
{
float mod = (float) Math.sqrt( this.x*this.x + this.y*this.y + this.z*this.z );
if( mod != 0 && mod != 1)
{
mod = 1 / mod;
this.x *= mod;
this.y *= mod;
this.z *= mod;
}
}
public void add(Number3d n)
{
this.x += n.x;
this.y += n.y;
this.z += n.z;
}
public void subtract(Number3d n)
{
this.x -= n.x;
this.y -= n.y;
this.z -= n.z;
}
public void multiply(Float f)
{
this.x *= f;
this.y *= f;
this.z *= f;
}
public float length()
{
return (float) Math.sqrt( this.x*this.x + this.y*this.y + this.z*this.z );
}
public Number3d clone()
{
return new Number3d(x,y,z);
}
public void rotateX(float angle)
{
float cosRY = (float) Math.cos(angle);
float sinRY = (float) Math.sin(angle);
_temp.setAll(this.x, this.y, this.z);
this.y = (_temp.y*cosRY)-(_temp.z*sinRY);
this.z = (_temp.y*sinRY)+(_temp.z*cosRY);
}
public void rotateY(float angle)
{
float cosRY = (float) Math.cos(angle);
float sinRY = (float) Math.sin(angle);
_temp.setAll(this.x, this.y, this.z);
this.x = (_temp.x*cosRY)+(_temp.z*sinRY);
this.z = (_temp.x*-sinRY)+(_temp.z*cosRY);
}
public void rotateZ(float angle)
{
float cosRY = (float) Math.cos(angle);
float sinRY = (float) Math.sin(angle);
_temp.setAll(this.x, this.y, this.z);
this.x = (_temp.x*cosRY)-(_temp.y*sinRY);
this.y = (_temp.x*sinRY)+(_temp.y*cosRY);
}
@Override
public String toString()
{
return x + "," + y + "," + z;
}
//
public static Number3d add(Number3d a, Number3d b)
{
return new Number3d(a.x + b.x, a.y + b.y, a.z + b.z);
}
public static Number3d subtract(Number3d a, Number3d b)
{
return new Number3d(a.x - b.x, a.y - b.y, a.z - b.z);
}
public static Number3d multiply(Number3d a, Number3d b)
{
return new Number3d(a.x * b.x, a.y * b.y, a.z * b.z);
}
public static Number3d cross(Number3d v, Number3d w)
{
return new Number3d((w.y * v.z) - (w.z * v.y), (w.z * v.x) - (w.x * v.z), (w.x * v.y) - (w.y * v.x));
}
public static float dot(Number3d v, Number3d w)
{
return ( v.x * w.x + v.y * w.y + w.z * v.z );
}
// * Math functions thanks to Papervision3D AS3 library
// http://code.google.com/p/papervision3d/
}