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;
c#封装三维向量,另外也看了下别人的C++封装的更多相关文章
- golang 三维向量相关操作
package vector import ( "math" "fmt" )// 三维向量:(x,y,z) type Vector3 struct { X fl ...
- 看了下opengl相关的资料,踩了一个坑,记录一下
2019/03/10 下午看了下关于opengl的资料,然后把敲了下代码,然后程序报错了.代码如下: #include <glad/glad.h> #include <GLFW/gl ...
- Vue 可输入可下拉组件的封装
由于业务需要,需要一个可输入也可下拉的组件,看了iview没有现成的组件用,就自己封装了个小组件~~ 组件input-select.vue代码: <template> <div cl ...
- 真机下, 如何在File Explorer里看data下的数据?
首先手机得Root , 你如果想单个单个的看, root explorer可以设置Permission Other下的两个权限点上就ok了. 如果想看到所有的, 即子目录也可以看到, 只需要adb r ...
- mui的上拉加载更多 下拉刷新 自己封装的demo
----------------------------------------------- 这是一个非常呆萌的程序妹子,深夜码的丑代码------------------------------- ...
- 硬盘上的一些算法小题目||and今天看了下林锐的书以及gdb调试 及一些变成算法小题目
gdb调试:观察点,断点,事件捕捉点.step 进入函数,next 跳过函数,until 跳出循环,finish 结束函数 林锐:书后试题 & c++的对象模型图 看了二叉树的非递归遍历, 链 ...
- Android 下的 SQLite 操作封装 —— DatabaseUtil
看到别人写的代码不错,对自己目前的开发很有用,所以转载一下,希望也能帮助到其他人: 1.DatabaseUtil.java(封装的类) package com.dbexample; import an ...
- 【JavaScript框架封装】实现一个类似于JQuery的CSS样式框架的封装
// CSS 样式框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法)[只要是需要使用到this获取到的元素集合这个变量的时候, ...
- uni-app 环境配置,uni.request封装,接口配置,全局配置,接口调用的封装
1.环境配置 (可参考uni-官网的环境配置) common文件夹下新建config.js let url_config = "" if(process.env.NODE_ENV ...
随机推荐
- 深度学习方法(十一):卷积神经网络结构变化——Google Inception V1-V4,Xception(depthwise convolution)
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.机器学习技术感兴趣的同学加入. 上一篇讲了深度学习方法(十) ...
- vue 条件渲染与列表渲染
本文是对官方文档的整理 因为 v-if 是一个指令,所以必须将它添加到一个元素上.但是如果想切换多个元素呢?此时可以把一个 <template> 元素当做不可见的包裹元素,并在上面使用 v ...
- git rebase 过程中遇到冲突该怎么解决?
在执行git rebase 过程中经常遇到问题,此时有点慌,一般如何解决呢? 1.先将本地的冲突手动解决 2.执行下面命令 git add . git rebase --contine //继续re ...
- oracle 12C wmsys.wm_concat()函数
http://blog.itpub.net/31392094/viewspace-2149577/
- Hadoop案例(二)压缩解压缩
压缩/解压缩案例 一. 对数据流的压缩和解压缩 CompressionCodec有两个方法可以用于轻松地压缩或解压缩数据.要想对正在被写入一个输出流的数据进行压缩,我们可以使用createOutput ...
- C++后台研发面试总结
前言: 从中秋到国庆这几天面试了几家公司,有大公司也有小公司,连续几天面试没有系统的整理整理,正好有时间系统的整理一下,好多考点牛客的大佬们都分享过了,虽然每个人的方向不相同,不过多看一些总能找到一些 ...
- 《java虚拟机》----虚拟机字节码执行引擎
No1: 物理机的执行引擎是直接建立在处理器.硬件.指令集合操作系统层面上的,而虚拟机的执行引擎则是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格 ...
- Servlet技术——Servlet基础
Servlet是运行在Web服务器端的Java应用程序,它使用Java语言编写,具有Java语言的优点.与Java程序的区别是,Servlet对象主要封装了对HTTP请求的处理,并且它的运行需要Ser ...
- cdoj1092-韩爷的梦 (字符串hash)【hash】
http://acm.uestc.edu.cn/#/problem/show/1092 韩爷的梦 Time Limit: 200/100MS (Java/Others) Memory Limi ...
- java基础小测试
1.JDK,JRE,JVM三者的区别 jdk:java 开发工具包 jre:运行环境 jvm:虚拟机 2.javac的作用 ,反编译工具的作用 javac:将java文件编译成class文件 反编译: ...