c#封装三维向量,另外也看了下别人的C++封装

一、 c#实现
/*
    Vector3 Definition
    Created by taotao man on 2016-4-12
    brief:封装三位向量类Vector3
    // 修改记录:
    date:
    add SetA()
    Change GetA();
*/

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

namespace ceshi
{
    public class Vector3
    {
        private float x;
        private float y;
        private float z;
        private const float E = 0.0000001f;

        public float X
        {
            set { x = value; }
            get { return x; }
        }

        public float Y
        {
            set { y = value; }
            get { return y; }
        }

        public float Z
        {
            set { z = value; }
            get { return z; }
        }

        public Vector3(float x, float y, float z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
        }

        public Vector3(Vector3 vct)
        {
            this.x = vct.x;
            this.y = vct.y;
            this.z = vct.z;
        }

        //向量加法
        public static Vector3 operator +(Vector3 a, Vector3 b)
        {
            Vector3 result = new Vector3(a.x + b.x , a.y + b.y, a.z +b.z);
            return result;
        }

        //向量减法
        public static Vector3 operator -(Vector3 a, Vector3 b)
        {
            Vector3 result = new Vector3(a.x - b.x, a.y - b.y, a.z - b.z);
            return result;
        }

        //向量除以一个数
        public static Vector3 operator /(Vector3 a, float b)
        {
            if (b != 0)
            {
                return new Vector3(a.x / b, a.y / b, a.z / b);
            }
            else
            {
                return new Vector3(0, 0, 0);
            }
        }

        // 左乘一个数
        public static Vector3 operator *(float a, Vector3 b)
        {
            return new Vector3(a * b.x, a * b.y, a * b.z);
        }

        // 右乘一个数
        public static Vector3 operator *(Vector3 a, float b)
        {
            return new Vector3(a.x * b, a.y * b, a.z * b);
        }

        // 向量的点乘
        public static float operator *(Vector3 a, Vector3 b)
        {
            return a.x * b.x + a.y * b.y + a.z * b.z;
        }

        // 判断两个向量是否相等
        public static bool operator ==(Vector3 a, Vector3 b)
        {
            if (Math.Abs(a.x - b.x) < E && Math.Abs(a.y - b.y) < E && Math.Abs(a.z - b.z) < E)
            {
                return true;
            }
            else
                return false;
        }

        // 判断两个向量不等
        public static bool operator !=(Vector3 a, Vector3 b)
        {
            return !(a == b);
        }

        public override bool Equals(object obj)
        {
            return base.Equals(obj);
        }

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

        public override string ToString()
        {
            return base.ToString();
        }

        // 向量叉积
        public static Vector3 Cross(Vector3 a, Vector3 b)
        {
            return new Vector3(a.y * b.z - a.z * b.y,
                                a.z * b.x - a.x * b.z,
                                a.x * b.y - a.y * b.x);
        }

        //向量的模
        public static float Magnitude(Vector3 a)
        {
            return (float)Math.Sqrt(a.x * a.x + a.y * a.y + a.z * a.z);
        }

        // 单位化向量

        public static Vector3 Normalize(Vector3 a)
        {
            float magnitude = Magnitude(a);
            return new Vector3(a.x / magnitude, a.y / magnitude, a.z / magnitude);
        }
    }
}

二、c++实现

转载自:3D数学基础图形与游戏开发

#include <math.h>

class Vector3
{
public:
	float x, y, z;

	// 默认构造函数
	Vector3(){}
	// 复制构造函数
	Vector3(const Vector3 &a) : x(a.x), y(a.y), z(a.z){}
	//
	// 带参数的构造函数,用三个值完成初始化
	Vector3(float nx, float ny, float nz) : x(nx), y(ny), z(nz){}
	// 标准对象操作
	// 重载运算符,并返回引用,以实现左值
	Vector3 &operator = (const Vector3 &a)
	{
		x = a.x; y = a.y; z = a.z;
		return *this;
	}
	//
	//重载“==”操作符
	bool operator == (const Vector3 &a) const
	{
		return x == a.x && y == a.y && z == a.z;
	}
	bool operator != (const Vector3 &a) const
	{
		return x != a.x || y != a.y || z != a.z;
	}

	//向量运算
	// 置为零向量
	void zero()
	{
		x = y = z =0.0f;
	}
	// 重载一元“-”运算符
	Vector3 operator -()const
	{
		return Vector3(-x, -y , -z);
	}
	//重载二元“+”和“-”运算符
	Vector3 operator +(const Vector3 &a) const
	{
		return Vector3(x + a.x, y + a.y, z + a.z);
	}
	Vector3 operator -(const Vector3 &a) const
	{
		return Vector3(x - a.x, y - a.y, z - a.z);
	}
	// 与标量的乘除法
	Vector3 operator * (float a) const
	{
		return Vector3(x * a, y * a, z * a);
	}
	Vector3 operator / (float a) const
	{
		float oneOverA = 1.0f / a;
		return Vector3(x * oneOverA, y * oneOverA, z * oneOverA);
	}
	// 重载自反运算符
	Vector3 &operator += (const Vector3 &a)
	{
		x += a.x; y += a.y; z += a.z;
		return *this;
	}
	Vector3 &operator -= (const Vector3 &a)
	{
		x -= a.x; y -= a.y; z -= a.z;
		return *this;
	}
	Vector3 &operator *= (float a)
	{
		x *= a; y *= a; z *= a;
		return * this;
	}
	Vector3 &operator /= (float a)
	{
		float oneOverA = 1.0f / a;
		x *= oneOverA; y *= oneOverA; z *= oneOverA;
		return *this;
	}
	// 向量标准化
	void normalize()
	{
		float magSq = x * x + y * y + z * z;
		if(magSq > 0.0f)
		{
			float oneOverMag = 1.0f / sqrt(magSq);
			x *= oneOverMag;
			y *= oneOverMag;
			z *= oneOverMag;
		}
	}
	// 向量点乘,重载标准的乘法运算符
	float operator *(const Vector3 &a) const
	{
		return x * a.x + y * a.y + z * a.z;
	}
};

// 非成员函数
// 求向量模
inline float vectorMag(const Vector3 &a)
{
	return sqrt(a.x * a.x + a.y * a.y + a.z * a.z);
}
//计算两个向量的叉乘
inline Vector3 crossProduct(const Vector3 &a, const Vector3 &b)
{
	return Vector3
		(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);
}
//
//实现标量左乘
inline Vector3 operator *(float k, const Vector3 &v)
{
	return Vector3(k * v.x, k * v.y, k * v.z);
}
// 计算两点间的距离
inline float distance(const Vector3 &a, const Vector3 &b)
{
	float dx = a.x - b.x;
	float dy = a.y - b.y;
	float dz = a.x - b.z;
	return sqrt(dx * dx + dy * dy + dz * dz);
}
//提供一个全局零向量
extern const Vector3 kZeroVector;
时间: 2024-10-08 10:29:19

c#封装三维向量,另外也看了下别人的C++封装的相关文章

C++链接库的使用,二维向量,三维向量,Ubuntu下C++测试向量库

1.#include<iostream> using namespace std; int main() { cout<<"Hello Woeld"<<endl; return 0; } 2.vector.cxx #include<iostream> int main() {int k; char x; cout<<"请输入向量的维度:"<<endl; cin>>k; vector

golang 三维向量相关操作

package vector import ( "math" "fmt" )// 三维向量:(x,y,z) type Vector3 struct { X float64 `json:"x"` Y float64 `json:"y"` Z float64 `json:"z"` } func (this *Vector3)Equal(v Vector3) bool { return this.X == v.X

百忙之中抽空看了下最近几个月问的比较多的问题(为了不让一些朋友继续走弯路)

ZS规则 发表于 2011-8-8 09:09:50 https://www.itsk.com/thread-141408-1-1.html windows7封装定制疑难杂症汇总(20110809): 1.WIN7 SP1 WITH IE9 封装WindowsSideBar错误解决办法: 本帖隐藏的内容 http://bbs.itiankong.com/thread-101060-1-2.html 2.近两天封装7,总结关于WIN7系统封装部署失败的解决办法: 本帖隐藏的内容 http://bb

0731------Linux网络编程----------论封装的乐趣(select、poll、epoll 服务器模型的封装)

0.春阳语录,代码嵌套三层以上就是一坨垃圾.因此良好的编程风格从封装开始. 1.封装select服务器模型 1.1 如何封装?将select需要的数据结构都封装成结构体,通过参数在函数之间传递,将固定的操作封装成相应的函数. 1.2 封装后的程序: 1.2.1 封装的头文件 select_t.h #ifndef __SELECT_T_H__ #define __SELECT_T_H__ #include <sys/select.h> #include <sys/types.h> #

做移动端视频通话软件,大致看了下现有的开源软件(转)

转自:链接 要做一个移动端视频通话软件,大致看了下现有的开源软件 一) sipdroid1)架构sip协议栈使用JAVA实现,音频Codec使用skype的silk(Silk编解码是Skype向第三方开发人员和硬件制造商提供免版税认证(RF)的Silk宽带音频编码器)实现.NAT传输支持stun server.2)优缺点:NAT方面只支持STUN,无ICE框架,如需要完全实现P2P视频通话需要实现符合ICE标准的客户端,音频方面没看到AEC等技术,视频方面还不是太完善,目前只看到调用的是系统自带

一辈子看不上别人,从来没看清过自己

这个世界上,最了解你优点的人可能是朋友,但最谙熟你缺点的人却是敌人. 你可能有无数个对手,但只会有一个置你于死地的敌人. 也就是说,这个人比你还了解你的软肋.最危险的敌人,坏就坏在这里,他未必外在强大,但一定心思诡秘.他盯着你,钻研你,单等你的七寸露出来,只轻轻一击,你就败了. 多少人,强势到可以呼风唤雨,却在人性的一个弱点中溃不成军. 这些人的通病是,容易看清楚别人,不容易看清楚自己.在别人的问题上可以斟酌到锱铢必较,而在自己的问题上却可以粗略到走马观花.一颗自私的心,自然会豢养出一双自私的眼

今天看了下八几年的感人电影

今天看了下八几年的感人电影-----<妈妈再爱我一次>.<搭错车>.令我深受感动,我本来是本着一种麻木不仁,铁石心肠的态度来看的,没想到自己竟然落泪了!我感动得不是演员的表演,也不是剧情.而是从主人公小强.阿美身上我看到了自己的身影.尤其是黄秋霞跟小强额头挨着额头嬉戏时的情景,让我想起了母亲.记得自己小时候母亲也经常碰我额头.可能这是一种母爱的体现吧!不过我的母亲不像小强的母亲那么伟大,我母亲是再平凡不过的农村妇女.我可以离开冷漠.不善言表的父亲.但我绝对离不开母亲,离不开慈祥的母

重新看了下网易的aritestIDE编辑器

昨重新看了下网易的aritestIDE编辑器,有了新的想法,几年前因为爱好原因,写了个基于opencv的梦幻西游手游辅助工具,实现了全自动刷日常任务,变相完成练级到了60多级,后来发现升级好慢,还有因为中途游戏弹提示,版本升级特征库需要更新等原因,废弃了项目. 今天重新看了这个编辑器实现自动测试的操作,发现他的思路解决了我大部分的困扰. 1.我的操作是基于ssh.需要设备越狱植入远程控制端:实时上传设备画面+接收指令,这方式很低效 而实际是,iOS可以不用越狱实现设备控制,airtest是基于f

三维引擎设计-多线程渲染(平台API基础和封装大致框架)

第一部分: Linux线程API基础 一:线程创建与结束 (1)pthread_t //线程的标识符类型 (2)pthread_create //用来创建一个线程, 参数线程标识符, 线程属性, 线程运行函数地址 (3)pthread_join //用来等待一个线程的结束, 参数被等待线程标识符,用户自定义指针 (4)pthread_exit //线程非正常结束,参数线程返回代码 二:修改线程属性 (1)pthread_attr_t //线程属性结构类型 (2)pthread_attr_init