using System; namespace RaytracerEngine { public class vec3 { protected float[] e; public vec3() { e = new float[3]; } public vec3(float e0, float e1, float e2) { e = new float[3]; e[0] = e0; e[1] = e1; e[2] = e2; } public float x { get { return e[0]; } set { e[0] = value; } } public float y { get { return e[1]; } set { e[1] = value; } } public float z { get { return e[2]; } set { e[2] = value; } } public float r { get { return e[0]; } set { e[0] = value; } } public float g { get { return e[1]; } set { e[1] = value; } } public float b { get { return e[2]; } set { e[2] = value; } } public float this[int i] { get { return e[i]; } set { e[i] = value; } } public float square_length() { return (e[0] * e[0] + e[1] * e[1] + e[2] * e[2]); } public float length() { return (float)Math.Sqrt(e[0]* e[0] + e[1]* e[1] + e[2]* e[2]); } public void normalize() { float k = 1.0f / (float)Math.Sqrt(e[0] * e[0] + e[1] * e[1] + e[2] * e[2]); e[0] *= k; e[1] *= k; e[2] *= k; } public static vec3 operator -(vec3 v) { return new vec3(-v.x, -v.y, -v.z); } public static vec3 operator +(vec3 v, vec3 o) { return new vec3(v.x + o.x, v.y + o.y, v.z + o.z); } public static vec3 operator -(vec3 v, vec3 o) { return new vec3(v.x - o.x, v.y - o.y, v.z - o.z); } public static vec3 operator *(vec3 v, vec3 o) { return new vec3(v.x * o.x, v.y * o.y, v.z * o.z); } public static vec3 operator /(vec3 v, vec3 o) { return new vec3(v.x / o.x, v.y / o.y, v.z / o.z); } public static vec3 operator *(float t, vec3 v) { return new vec3(t * v.x, t * v.y, t * v.z); } public static vec3 operator *(vec3 v, float t) { return new vec3(t * v.x, t * v.y, t * v.z); } public static vec3 operator /(vec3 v, float t) { return new vec3(v.x / t, v.y / t, v.z / t); } public static float dot(vec3 v, vec3 o) { return v.x * o.x + v.y * o.y + v.z * o.z; } public static vec3 cross(vec3 v, vec3 o) { return new vec3(v.y * o.z - v.z * o.y, -(v.x * o.z - v.z * o.x), v.x * o.y - v.y * o.x); } public static vec3 unit_vector(vec3 v) { return v / v.length(); } public static vec3 turn_x(vec3 v, float d) { float y = 0, z = 0; y = (float)(Math.Cos(d) * v.y + -Math.Sin(d) * v.z); z = (float)(Math.Sin(d) * v.y + Math.Cos(d) * v.z); return new vec3(v.x, y, z); } public static vec3 turn_y(vec3 v, float d) { float x = 0, z = 0; x = (float)(Math.Cos(d) * v.x + Math.Sin(d) * v.z); z = (float)(-Math.Sin(d) * v.x + Math.Cos(d) * v.z); return new vec3(x, v.y, z); } public static vec3 turn_z(vec3 v, float d) { float x = 0, y = 0; x = (float)(Math.Cos(d) * v.x + -Math.Sin(d) * v.y); y = (float)(Math.Sin(d) * v.x + Math.Cos(d) * v.y); return new vec3(x, y, v.z); } } }