RaytracerEngine/vec3.cs

60 lines
3.1 KiB
C#
Executable File

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);
}
}
}