图形开发之3D向量类(C#)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace VectorDemo
{
    /// <summary>
    /// 3D向量类
    /// </summary>
    public class Vector3
    {
        public float X { get; set; }

        public float Y { get; set; }

        public float Z { get; set; }

        /// <summary>
        /// 默认构造函数,不执行任何操作
        /// </summary>
        public Vector3()
        {

        }

        /// <summary>
        /// 复制向量的构造函数
        /// </summary>
        /// <param name="a"></param>
        public Vector3(Vector3 a)
        {
            this.X = a.X;
            this.Y = a.Y;
            this.Z = a.Z;
        }

        /// <summary>
        /// 带参构造函数,用三个值完成初始化.
        /// </summary>
        /// <param name="nx"></param>
        /// <param name="ny"></param>
        /// <param name="nz"></param>
        public Vector3(float nx, float ny, float nz)
        {
            this.X = nx;
            this.Y = ny;
            this.Z = nz;
        }

        #region 运算符

        public static bool operator ==(Vector3 v1, Vector3 v2)
        {
            return v1.X == v2.X && v1.Y == v2.Y && v1.Z == v2.Z;
        }

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

        /// <summary>
        /// 重载一元“-”运算符
        /// </summary>
        /// <param name="v"></param>
        /// <returns></returns>
        public static Vector3 operator -(Vector3 v)
        {
            return new Vector3(-v.X, -v.Y, -v.Z);
        }

        /// <summary>
        /// 重载二元"+"运算符
        /// </summary>
        /// <param name="v1"></param>
        /// <param name="v2"></param>
        /// <returns></returns>
        public static Vector3 operator +(Vector3 v1, Vector3 v2)
        {
            return new Vector3(v1.X + v2.X, v1.Y + v2.Y, v1.Z + v2.Z);
        }

        /// <summary>
        /// 重载二元"-"运算符
        /// </summary>
        /// <param name="v1"></param>
        /// <param name="v2"></param>
        /// <returns></returns>
        public static Vector3 operator -(Vector3 v1, Vector3 v2)
        {
            return new Vector3(v1.X - v2.X, v1.Y - v2.Y, v1.Z - v2.Z);
        }

        /// <summary>
        /// 与标量相乘
        /// </summary>
        /// <param name="v"></param>
        /// <param name="a"></param>
        /// <returns></returns>
        public static Vector3 operator *(Vector3 v, float a)
        {
            return new Vector3(v.X * a, v.Y * a, v.Z * a);
        }

        /// <summary>
        /// 与标量相除
        /// </summary>
        /// <param name="v"></param>
        /// <param name="a"></param>
        /// <returns></returns>
        public static Vector3 operator /(Vector3 v, float a)
        {
            float oneOverA = 1.0f / a;//:这里不对除零进行检查
            return new Vector3(v.X * oneOverA, v.Y * oneOverA, v.Z * oneOverA);
        }

        // +=运算符不可显式重载,会随着+运算符的重载而隐式重载
        // -=运算符不可显式重载,会随着-运算符的重载而隐式重载
        // *=运算符不可显式重载,会随着*运算符的重载而隐式重载
        // /=运算符不可显式重载,会随着/运算符的重载而隐式重载

        /// <summary>
        /// 向量点乘,重载标准乘法运算符.
        /// </summary>
        /// <param name="v1"></param>
        /// <param name="v2"></param>
        /// <returns></returns>
        public static float operator *(Vector3 v1, Vector3 v2)
        {
            return v1.X * v2.X + v1.Y * v2.Y + v1.Z * v2.Z;
        }

        public override bool Equals(object v)
        {
            if (!(v is Vector3))
            {
                return false;
            }
            return this == (v as Vector3);
        }

        /// <summary>
        /// 向量左乘
        /// </summary>
        /// <param name="a"></param>
        /// <param name="v"></param>
        /// <returns></returns>
        public static Vector3 operator *(float a, Vector3 v)
        {
            return new Vector3(a * v.X, a * v.Y, a * v.Z);
        }
        #endregion

        /// <summary>
        /// 置为零微量
        /// </summary>
        public void Zero()
        {
            X = Y = Z = 0.0f;
        }

        /// <summary>
        /// 向量标准化
        /// </summary>
        public void Normalize()
        {
            float magSq = X * X + Y * Y + Z * Z;
            if (magSq > 0.0f)//检查除零
            {
                float oneOverMag = (float)(1.0f / Math.Sqrt(magSq));
                X *= oneOverMag;
                Y *= oneOverMag;
                Z *= oneOverMag;
            }
        }

        /// <summary>
        /// 求向量模
        /// </summary>
        /// <returns></returns>
        public float VectorMag()
        {
            return (float)(Math.Sqrt(X * X + Y * Y + Z * Z));
        }

        /// <summary>
        /// 计算两向量的叉乘
        /// </summary>
        /// <returns></returns>
        public Vector3 CorssProduct(Vector3 v)
        {
            return new Vector3(Y * v.Z - Z * v.Y,
                               Z * v.X - X * v.Z,
                               X * v.Y - Y * v.X);
        }

        /// <summary>
        /// 计算两点间的距离
        /// </summary>
        /// <param name="v"></param>
        /// <returns></returns>
        public float Distance(Vector3 v)
        {
            float dx = X - v.X;
            float dy = Y - v.Y;
            float dz = Z - v.Z;
            return (float)(Math.Sqrt(dx * dx + dy * dy + dz * dz));
        }

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

时间: 2024-08-30 08:33:54

图形开发之3D向量类(C#)的相关文章

ios开发之OC基础-类和对象

本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再将零散的知识点整理出来.这样的学习方法会带来更多的收获,同时要多做练习,按照思路,默写.改写代码.在这里,感谢欧阳坚老师,学习你的课程使我走上了ios的开发之路. 一定要明确一个要从事的方向,要不然就会感到迷茫.学习ios开发,并且从事ios开发这个行业,这就是我的选择.看到我的博客系列文章,其中大

iOS开发之 3D Touch 开发

在App 的开发中对于开发人员来说新设备以及新功能的适配无疑是一个很苦逼的事.在今年九月份iPhone 6S 以及 6S+ 出来之后,新的功能 3D Touch又是一个比较头疼的事.刚刚看到的时候以为是比较麻烦的东西 看着开发文档就头大(本撸主英语水平有限).但是看完官方文档之后感觉也不是很麻烦.所以就自己写了一个Demo 供大家吐槽和狂喷. 我感觉  3D Touch  的使用和  UITabBar  差不多还是一个比较简单的东西,几乎是拿过来就能用的东西. 一. 给桌面 Icon 添加 3D

iOS开发之3D Touch

1.简介 3DTouch是在6s之后苹果的一项技术,只能在6s及其以上机型真机运行,Xcode的模拟器是不支持的. Quick Actions(点击icon的快捷方式) Peek&Pop(应用内快速预览内容) UITouch和LivePhoto(读取压力和最大压力) 2.Quick Actions(点击icon的快捷方式) 点击app的图标,可以弹出Today小组件(如果有的话)和UIApplicationShortcutItem快捷方式--这就是Quick Actions! // // UIA

李洪强iOS开发之OC语言类的深入和分类

OC语言类的深入和分类 一.分类 (一)分类的基本知识  概念:Category  分类是OC特有的语言,依赖于类. 分类的作用:在不改变原来的类内容的基础上,为类增加一些方法. 添加一个分类: 文件结构图: 在分类中添加一个方法 Study方法的实现 测试程序: (二)分类的使用注意 (1)分类只能增加方法(包括类方法和对象方法),不能增加成员变量 (2)在分类方法的实现中可以访问原来类中的成员变量: (3)分类中可以重新实现原来类中的方法,但是会覆盖掉原来的方法,导致原来的方法无法再使用(警

Cocos2d-x游戏开发之lua编辑器 subime 搭建,集成cocos2dLuaApi和自有类

Sublime Text http://baike.baidu.com/view/10701920.htm?from_id=8130415&type=syn&fromtitle=Sublime&fr=aladdin 简介 Sublime Text 是一个代码编辑器(Sublime Text 2是收费软件,但可以无限期试用),也是HTML和散文先进的文本编辑器.Sublime Text是由程序员Jon Skinner于2008年1月份所开发出来,它最初被设计为一个具有丰富扩展功能的V

Android开发之Html类详解

在进行Android开发中经常回忽略Html类.这个类其实很简单,就是将HTML标签文本解析成普通的样式文本.下面就让我么看一下这个类的具体介绍. 类结构: java.lang.Object    ? android.text.Html 类概述: 这个类用于处理的HTML字符串并将其转换成可显示的样式文本.但并不是所有的HTML标记的支持. 公有方法: 说其简单是应为它就有四个方法: Public Methods static String escapeHtml(CharSequence tex

Android开发之MediaRecorder类详解

MediaRecorder类详解 手机一般都有麦克风和摄像头,而Android系统就可以利用这些硬件来录制音视频了. 为了增加对录制音视频的支持,Android系统提供了一个MediaRecorder的类.该类的使用也非常简单,下面让我们来了解一下这个类: 一.类结构: java.lang.Object    ? android.media.MediaRecorder 二.类概述: 用于录制音频和视频的一个类. 三.状态图: 说明: 与MediaPlayer类非常相似MediaRecorder也

《3D数学基础》实践1 向量类代码分析

理解数学,理解代码! 大家好,我是老G! 今天为大家带来<3D数学基础>系列视频. 主要讲解:游戏开发中用到的3D数学知识,包括:定义,定理,推论. 也包括他们的推导过程,以及应用举例. 本套视频完全免费,欢迎捐助,帮助我完成这套视频 支付宝帐号:[email protected]gmail.com 今天带来的是系列第11讲--实践1 向量类代码分析 本次视频,主要讲解一下如下几个库中的向量类的代码: 1.3D Math Primer for Games and Graphics Develo

ArcGIS Engine开发之旅02--ArcGIS Engine中的类库

原文 ArcGIS Engine开发之旅02--ArcGIS Engine中的类库 System类库 System类库是ArcGIS体系结构中最底层的类库.System类库包含给构成ArcGIS的其他类库提供服务的组件.System类库中定义了大量开发者可以实现的接口.AoInitializer对象就是在System类库中定义的,所有的开发者必须使用这个对象来初始化ArcGISEngine和解除ArcGIS Engine的初始化.开发者不能扩展这个类库,但可以通过实现这个类库中包含的接口来扩展A