projet-rendu/algebra/Vector3.java
2022-04-14 22:42:57 +02:00

125 lines
3 KiB
Java

/**
* @author: cdehais
*/
package algebra;
import java.lang.Math;
public class Vector3 extends Vector {
public Vector3(double x, double y, double z) {
super();
try {
allocValues(3);
} catch (java.lang.InstantiationException e) {
/* unreached */
}
this.values[0] = x;
this.values[1] = y;
this.values[2] = z;
}
public Vector3() {
this(0.0, 0.0, 0.0);
}
public Vector3(String name) {
this(0.0, 0.0, 0.0);
this.setName(name);
}
/**
* Creates a new named 3D vector with coordinates (x, y, z).
*/
public Vector3(String name, double x, double y, double z) {
super();
try {
allocValues(4);
} catch (java.lang.InstantiationException e) {
/* unreached */
}
this.values[0] = x;
this.values[1] = y;
this.values[2] = z;
}
/**
* Copy constructor from a Vector of size 3 or 4.
* For a vector of size 4, divide the 3 first coordinates by the fourth.
*/
public Vector3(Vector v) throws InstantiationException {
this();
if ((v.size != 3) && (v.size != 4)) {
throw new InstantiationException("Can only build 3D vector from vector of size 3 or 4");
}
if (v.size == 3) {
set(v.get(0), v.get(1), v.get(2));
} else {
double w = v.get(3);
set(v.get(0) / w, v.get(1) / w, v.get(2) / w);
}
}
/**
* Makes the x, y, and z coordinates of the Vector3 cartesian, by dividing them
* by
* the homogeneous coordinate w.
*/
public void makeCartesian() throws java.lang.ArithmeticException {
this.values[0] /= this.values[3];
this.values[1] /= this.values[3];
this.values[2] /= this.values[3];
this.values[3] = 1.0;
}
public void set(double x, double y, double z) {
this.values[0] = x;
this.values[1] = y;
this.values[2] = z;
}
/**
* Computes the cross product between the Vector3 and the given vector.
*/
public Vector3 cross(Vector3 v) {
double rx = this.getY() * v.getZ() - this.getZ() * v.getY();
double ry = this.getZ() * v.getX() - this.getX() * v.getZ();
double rz = this.getX() * v.getY() - this.getY() * v.getX();
return new Vector3(rx, ry, rz);
}
public double dot(Vector3 v) {
return (values[0] * v.values[0] + values[1] * v.values[1] + values[2] * v.values[2]);
}
public double norm() {
double r = (values[0] * values[0] + values[1] * values[1] + values[2] * values[2]);
return Math.sqrt(r);
}
/**
* Gets the x coordinates of the Vector3
*/
public double getX() {
return this.values[0];
}
/**
* Gets the w coordinates of the Vector3
*/
public double getY() {
return this.values[1];
}
/**
* Gets the w coordinates of the Vector3
*/
public double getZ() {
return this.values[2];
}
}