//
```// Copyright 2001 Ken Perlin

package render;

/**
Provides functionality to manipulate vectors.
*/

public class Vec {
//----- SIMPLE CLASS TO HANDLE BASIC VECTOR OPERATIONS -----

/**
Normalizes vector v to unit-length.
@param v a vector
*/
public static void normalize(double[] v) {
double s = norm(v);
if ( s==0 )
return;
for (int i = 0; i < v.length; i++)
v[i] /= s;
}

/**
Computes the magnitude of the vector.
@param v a vector
@return the magnitude of vector v
*/
public static double norm(double[] v) {
return Math.sqrt(dot(v, v));
}

/**
Computes the dot product of vectors a and b. Vectors a and b must be of the same length.
@param a source vector
@param b source vector
@return the result of a dot b
*/
public static double dot(double[] a, double[] b) {
double sum = 0;
for (int i = 0; i < b.length; i++)
sum += a[i] * b[i];
return sum;
}

/**
Computes the cross-product of two vectors a and b and stores the result in dst.	a, b, and dst must be 3 dimensional vectors.
@param a source vector 1
@param b source vector 2
@param dst resulting vector from a cross b
*/
public static void cross(double[] a, double[] b, double[] dst) {
dst[0] = b[1] * a[2] - b[2] * a[1];
dst[1] = b[2] * a[0] - b[0] * a[2];
dst[2] = b[0] * a[1] - b[1] * a[0];
}

/**
Copies contents of the src vector to the dst vector. Both vectors must be of the same length.
@param src original vector
@param dst copy of original vector
*/
public static void copy(double[] src, double[] dst) {
for (int i = 0; i < src.length; i++)
dst[i] = src[i];
}

/**
Populates the dst vector with values x, y, z.
@param dst vector to be populated
@param x component 0
@param y component 1
@param z component 2
*/
public static void set(double[] dst, double x, double y, double z) {
dst[0] = x;
dst[1] = y;
dst[2] = z;
}

/**
Rotates a vector about x or y or z axis
@param dst vector to be rotated
@param axis of rotation: 0=x, 1=y, 2=z