60 lines
3.1 KiB
C#
60 lines
3.1 KiB
C#
|
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);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|