package br.com.etyllica.linear.vector; /** * * Based on js-aruco code: http://code.google.com/p/js-aruco/source/browse/trunk/src/posit2.js * */ public class Vec3D { public double[] v; private static final int X = 0; private static final int Y = 1; private static final int Z = 2; public Vec3D() { this(0,0,0); } public Vec3D(double x, double y, double z) { super(); this.v = new double[3]; v[X] = x; v[Y] = y; v[Z] = z; } public void copy(Vec3D a) { this.v[X] = a.v[X]; this.v[Y] = a.v[Y]; this.v[Z] = a.v[Z]; } public void copy(double x, double y, double z) { this.v[X] = x; this.v[Y] = y; this.v[Z] = z; } public static Vec3D add(Vec3D a, Vec3D b) { double x = a.v[X] + b.v[X]; double y = a.v[Y] + b.v[Y]; double z = a.v[Z] + b.v[Z]; Vec3D v = new Vec3D(x, y, z); return v; } public static Vec3D sub(Vec3D a, Vec3D b) { double x = a.v[X] - b.v[X]; double y = a.v[Y] - b.v[Y]; double z = a.v[Z] - b.v[Z]; Vec3D v = new Vec3D(x, y, z); return v; } public static Vec3D mult(Vec3D a, Vec3D b) { double x = a.v[X] * b.v[X]; double y = a.v[Y] * b.v[Y]; double z = a.v[Z] * b.v[Z]; Vec3D v = new Vec3D(x, y, z); return v; } public static Vec3D addScalar(Vec3D a, double b) { double x = a.v[X] + b; double y = a.v[Y] + b; double z = a.v[Z] + b; Vec3D v = new Vec3D(x, y, z); return v; } public static Vec3D multScalar(Vec3D a, double b) { double x = a.v[X] * b; double y = a.v[Y] * b; double z = a.v[Z] * b; Vec3D v = new Vec3D(x, y, z); return v; } public static double dot(Vec3D a, Vec3D b) { return a.v[X] * b.v[X] + a.v[Y] * b.v[Y] + a.v[Z] * b.v[Z]; } public static Vec3D cross(Vec3D a, Vec3D b) { return new Vec3D( a.v[Y] * b.v[Z] - a.v[Z] * b.v[Y], a.v[Z] * b.v[X] - a.v[X] * b.v[Z], a.v[X] * b.v[Y] - a.v[Y] * b.v[X]); } public static void cross(Vec3D a, Vec3D b, Vec3D c) { c.v[X] = a.v[Y] * b.v[Z] - a.v[Z] * b.v[Y]; c.v[Y] = a.v[Z] * b.v[X] - a.v[X] * b.v[Z]; c.v[Z] = a.v[X] * b.v[Y] - a.v[Y] * b.v[X]; } public double normalize() { double len = Math.sqrt(this.square()); if (len > 0.0) { v[X] /= len; v[Y] /= len; v[Z] /= len; } return len; } public double length() { return Math.sqrt(this.square()); } public static Vec3D inverse(Vec3D a) { double x = 0; double y = 0; double z = 0; if (a.v[X] != 0.0) { x = 1.0 / a.v[X]; } if (a.v[Y] != 0.0) { y = 1.0 / a.v[Y]; } if (a.v[Z] != 0.0) { z = 1.0 / a.v[Z]; } return new Vec3D(x, y, z); } public double square() { return v[X] * v[X] + v[Y] * v[Y] + v[Z] * v[Z]; } public int minIndex() { return v[X] < v[Y]? (v[X] < v[Z]? 0: 2): (v[Y] < v[Z]? 1: 2); } public void setX(double x) { v[X] = x; } public void setY(double y) { v[Y] = y; } public void setZ(double z) { v[Z] = z; } public double getX() { return v[X]; } public double getY() { return v[Y]; } public double getZ() { return v[Z]; } }