using System; using System.Collections.Generic; using System.Text; namespace Tso2MqoGui { public partial struct Point2 : IComparable { public float x, y; public Point2(float x, float y) { this.x = x; this.y = y; } public float X { get { return x; } set { x= value; } } public float Y { get { return y; } set { y= value; } } public override string ToString() { return X+","+Y; } public static Point2 Parse(string[] t, int begin) { return new Point2( float.Parse(t[begin+0]), float.Parse(t[begin+1])); } public int CompareTo(Point2 obj) { int cmp; cmp = x.CompareTo(obj.x); if (cmp != 0) return cmp; cmp = y.CompareTo(obj.y); return cmp; } public override int GetHashCode() { return x.GetHashCode() ^ y.GetHashCode(); } public bool Equals(Point2 p) { return (x == p.x) && (y == p.y); } } public partial struct Point3 : IComparable { public float x, y, z; public Point3(float x, float y, float z) { this.x = x; this.y = y; this.z = z; } public float X { get { return x; } set { x= value; } } public float Y { get { return y; } set { y= value; } } public float Z { get { return z; } set { z= value; } } public static Point3 operator+(Point3 a, Point3 b) { return new Point3(a.x+b.x, a.y+b.y, a.z+b.z); } public static Point3 operator-(Point3 a, Point3 b) { return new Point3(a.x-b.x, a.y-b.y, a.z-b.z); } public override string ToString() { return X+","+Y+","+Z; } public static Point3 Cross(Point3 p, Point3 q) { return new Point3( p.y*q.z - p.z*q.y, p.z*q.x - p.x*q.z, p.x*q.y - p.y*q.x); } public static Point3 Normalize(Point3 p) { float d = p.x*p.x + p.y*p.y + p.z*p.z; if(d < 0.00001f) return p; d = (float)(1 / (Math.Sqrt(d))); return new Point3(p.x*d, p.y*d, p.z*d); } public static Point3 Parse(string[] t, int begin) { return new Point3( float.Parse(t[begin+0]), float.Parse(t[begin+1]), float.Parse(t[begin+2])); } public int CompareTo(Point3 obj) { int cmp; cmp = x.CompareTo(obj.x); if (cmp != 0) return cmp; cmp = y.CompareTo(obj.y); if (cmp != 0) return cmp; cmp = z.CompareTo(obj.z); return cmp; } public override int GetHashCode() { return x.GetHashCode() ^ y.GetHashCode() ^ z.GetHashCode(); } public bool Equals(Point3 p) { return (x == p.x) && (y == p.y) && (z == p.z); } } public partial struct Point4 : IComparable { public float x, y, z, w; public Point4(float x, float y, float z, float w) { this.x = x; this.y = y; this.z = z; this.w = w; } public float X { get { return x; } set { x= value; } } public float Y { get { return y; } set { y= value; } } public float Z { get { return z; } set { z= value; } } public float W { get { return w; } set { w= value; } } public override string ToString() { return X+","+Y+","+Z+","+W; } public int CompareTo(Point4 obj) { int cmp; cmp = x.CompareTo(obj.x); if (cmp != 0) return cmp; cmp = y.CompareTo(obj.y); if (cmp != 0) return cmp; cmp = z.CompareTo(obj.z); if (cmp != 0) return cmp; cmp = w.CompareTo(obj.w); return cmp; } public override int GetHashCode() { return x.GetHashCode() ^ y.GetHashCode() ^ z.GetHashCode() ^ w.GetHashCode(); } public bool Equals(Point4 p) { return (x == p.x) && (y == p.y) && (z == p.z) && (w == p.w); } } public partial struct Color3 { public float r, g, b; public Color3(float r, float g, float b) { this.r = r; this.g = g; this.b = b; } public float R { get { return r; } set { r= value; } } public float G { get { return g; } set { g= value; } } public float B { get { return b; } set { b= value; } } public override string ToString() { return R+","+G+","+B; } public static Color3 Parse(string[] t, int begin) { return new Color3( float.Parse(t[begin+0]), float.Parse(t[begin+1]), float.Parse(t[begin+2])); } } }