常用的3d向量方法,根据《3d数学基础:图形与游戏开发》中第六章改写的c#版

常用的3d向量方法,根据《3d数学基础:图形与游戏开发》中第六章改写的c#版

class Vector3
    {
        public float X { get; set; }
        public float Y { get; set; }
        public float Z { get; set; }

        public Vector3() { }
        public Vector3(float x, float y, float z) { this.X = x; this.Y = y; this.Z = z; }
        public Vector3(Vector3 vec) { this.X = vec.X; this.Y = vec.Y; this.Z = vec.Z; }

        #region 运算符重载
        public static Vector3 operator +(Vector3 vec1, Vector3 vec2)
        {
            return new Vector3(vec1.X + vec2.X, vec1.Y + vec2.Y, vec1.Z + vec2.Z);
        }

        public static Vector3 operator -(Vector3 vec)
        {
            return new Vector3(-vec.X, -vec.Y, -vec.Z);
        }

        public static Vector3 operator -(Vector3 vec1, Vector3 vec2)
        {
            return new Vector3(vec1.X - vec2.X, vec1.Y - vec2.Y, vec1.Z - vec2.Z);
        }

        public static Vector3 operator *(Vector3 vec, float ratio)
        {
            return new Vector3(vec.X * ratio, vec.Y * ratio, vec.Z * ratio);
        }

        public static Vector3 operator *(float ratio, Vector3 vec)
        {
            return new Vector3(vec.X * ratio, vec.Y * ratio, vec.Z * ratio);
        }

        public static float operator *(Vector3 vec1, Vector3 vec2)
        {
            return vec1.X * vec2.X + vec1.Y * vec2.Y + vec1.Z * vec2.Z;
        }

        public static Vector3 operator /(Vector3 vec, float ratio)
        {
            if (ratio == 0)
            {
                Console.WriteLine("除数不能为0");
                return null;
            }
            else
            {
                return new Vector3(vec.X / ratio, vec.Y / ratio, vec.Z / ratio);
            }
        }

        public static bool operator ==(Vector3 vec1, Vector3 vec2)
        {
            return !(vec1 != vec2);
        }

        public static bool operator !=(Vector3 vec1, Vector3 vec2)
        {
            return vec1.X != vec2.X || vec1.Y != vec2.Y || vec1.Z != vec2.Z;
        }

        public override bool Equals(object obj)
        {
            if (obj == null)
                return false;
            else
            {
                if (obj.GetType() == GetType())
                {
                    Vector3 temp = (Vector3)obj;
                    return this.X == temp.X && this.Y == temp.Y && this.Z == temp.Z;
                }
                else
                {
                    return false;
                }
            }
        }

        public override string ToString()
        {
            return string.Format("{0},{1},{2}", this.X, this.Y, this.Z);
        }

        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
        #endregion

        public Vector3 Normalize()
        {
            float magSq = X * X + Y * Y + Z * Z;
            if (magSq > 0)
            {
                float oneOverMag = 1.0f / (float)Math.Sqrt(magSq);
                float x = X * oneOverMag;
                float y = Y * oneOverMag;
                float z = Z * oneOverMag;
                return new Vector3(x, y, z);
            }
            return new Vector3(0, 0, 0);
        }

        public float Length()
        {
            return (float)Math.Sqrt(X * X + Y * Y + Z * Z);
        }

        public static float Length(Vector3 vec)
        {
            return (float)Math.Sqrt(vec.X * vec.X + vec.Y * vec.Y + vec.Z * vec.Z);
        }

        public static Vector3 CrossProduct(Vector3 vec1, Vector3 vec2)
        {
            return new Vector3(
                vec1.Y * vec2.Z - vec1.Z * vec2.Y,
                vec1.Z * vec2.X - vec1.X * vec2.Z,
                vec1.X * vec2.Y - vec1.Y * vec2.X
                );
        }

        public static float Distance(Vector3 vec1, Vector3 vec2)
        {
            float dx = vec1.X - vec2.X;
            float dy = vec1.Y - vec2.Y;
            float dz = vec1.Z - vec2.Z;
            return (float)Math.Sqrt(dx * dx + dy * dy + dz * dz);
        }

        public static Vector3 Zero()
        {
            return new Vector3(0, 0, 0);
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值