Vector2,3,4类在DirectX中都有现成的可以调用,不过要实现其中的功能其实也不难,也都是一些简单的数学知识罢了。
本文用C++实现一个简单的Vector3类的功能,暂时有的功能是:
1 + - * /算术运算
2 向量的数量积,又叫:点乘
3 向量的向量积,又叫:叉乘
4 向量单位化(normalization)
//Vecotr3.h
#pragma once
extern const double uZero;
class Vector3
{
float x, y, z;
public:
Vector3():x(0), y(0), z(0){}
Vector3(float x1, float y1, float z1):x(x1), y(y1), z(z1){}
Vector3(const Vector3 &v);
~Vector3();
void operator=(const Vector3 &v);
Vector3 operator+(const Vector3 &v);
Vector3 operator-(const Vector3 &v);
Vector3 operator/(const Vector3 &v);
Vector3 operator*(const Vector3 &v);
Vector3 operator+(float f);
Vector3 operator-(float f);
Vector3 operator/(float f);
Vector3 operator*(float f);
float dot(const Vector3 &v);
float length();
void normalize();
Vector3 crossProduct(const Vector3 &v);
void printVec3();
};
//Vector3.cpp
#include"Plane.h"
#include<iostream>
const double uZero = 1e-6;
//复制构造函数,必须为常量引用参数,否则编译不通过
Vector3::Vector3(const Vector3 &v):x(v.x), y(v.y), z(v.z)
{
}
Vector3::~Vector3()
{
}
void Vector3::operator=(const Vector3 &v)
{
x = v.x;
y = v.y;
z = v.z;
}
Vector3 Vector3::operator+(const Vector3 &v)
{
return Vector3(x+v.x, y+v.y, z+v.z);
}
Vector3 Vector3::operator-(const Vector3 &v)
{
return Vector3(x-v.x, y-v.y, z-v.z);
}
Vector3 Vector3::operator/(const Vector3 &v)
{
if (fabsf(v.x) <= uZero || fabsf(v.y) <= uZero || fabsf(v.z) <= uZero)
{
std::cerr<<"Over flow!\n";
return *this;
}
return Vector3(x/v.x, y/v.y, z/v.z);
}
Vector3 Vector3::operator*(const Vector3 &v)
{
return Vector3(x*v.x, y*v.y, z*v.z);
}
Vector3 Vector3::operator+(float f)
{
return Vector3(x+f, y+f, z+f);
}
Vector3 Vector3::operator-(float f)
{
return Vector3(x-f, y-f, z-f);
}
Vector3 Vector3::operator/(float f)
{
if (fabsf(f) < uZero)
{
std::cerr<<"Over flow!\n";
return *this;
}
return Vector3(x/f, y/f, z/f);
}
Vector3 Vector3::operator*(float f)
{
return Vector3(x*f, y*f, z*f);
}
float Vector3::dot(const Vector3 &v)
{
return x*v.x + y*v.y + z*v.z;
}
float Vector3::length()
{
return sqrtf(dot(*this));
}
void Vector3::normalize()
{
float len = length();
if (len < uZero) len = 1;
len = 1/len;
x *= len;
y *= len;
z *= len;
}
/*
Cross Product叉乘公式
aXb = | i, j, k |
| a.x a.y a.z|
| b.x b.y b.z| = (a.y*b.z -a.z*b.y)i + (a.z*b.x - a.x*b.z)j + (a.x*b.y - a.y*b.x)k
*/
Vector3 Vector3::crossProduct(const Vector3 &v)
{
return Vector3(y * v.z - z * v.y,
z * v.x - x * v.z,
x * v.y - y * v.x);
}
void Vector3::printVec3()
{
std::cout<<"("<<x<<", "<<y<<", "<<z<<")"<<std::endl;
}
测试主程序:
#include<iostream>
#include<vector>
#include"Vector3.h"
using namespace std;
int main()
{
Vector3 v31;
Vector3 v32(2.0f,3.0f,4.0f);
Vector3 v33(v32 - 1.0f);
cout<<"We have original Vector3s:\n";
v31.printVec3();
v32.printVec3();
v33.printVec3();
cout<<"v32 crossproduct v33 is:\n";
Vector3 v3233 = v32.crossProduct(v33);
v3233.printVec3();
cout<<"Now we normalize them:\n";
v31.normalize();
v32.normalize();
v33.normalize();
v3233.normalize();
v31.printVec3();
v32.printVec3();
v33.printVec3();
v3233.printVec3();
system("pause");
return 0;
}
运算结果:
分享到:
相关推荐
使用C++开发的一个三维空间向量的实现,支持基础的加、减、叉乘、点乘运算可以计算模长、向量夹角等,已经满足笔者的需求。 理论基础:https://go.lucoder.com/fwlink/?linkid=8
纯c语言的向量vector实现,实现c++中vector的一些基本的特性和操作,适用于一些只支持c语言的平台上使用vector数据结构,包含测试用例以及函数的使用范例
自己向量类Vector: reserve resize size capacity operator [] push_back
给定一个头文件Vec.h,其中有抽象类模板VECROR设计。还有插入运算符重载、抽取运算符重载的普通c++函数...1、将类模板VECTOR作为基类,通过公共继承派生一个新的类模板Vector(向量类)和一个新的自定义字符串了String。
c++ 实验课作业,Vector 缓存所有数据。 好东西采用Vector 缓存所有数据。采用虚函数的方式保存缓存数据到文件。 西南科技大学
这是一个使用指令实现数学 3D 向量类的简单 C++ 库。 它基于。 例子 测试.cpp # include # include " vector3.h " int main () { Vector3 a ( 1 , 1 , 1 ); Vector3 b ( 2 , 0 , - 1 ); std::cout << " a...
此文件比较详细的介绍了用C++怎么动态的开辟二维三维数组。
C++没有内置的向量,矩阵库,可以自己先轮几个Vector, Matrix类以及各种数学运算操作,最好搞成链式操作。 不要用index form来推导和实现BP算法,个人比较喜欢matrix form, 公式会非常紧凑,实现起来也不太容易出错 ...
定义一个CPU类 包含了频率、等级、电压 的定义
vector是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器,本文介绍一下使用方法
c++ vector(向量)使用方法详解.docx
自己写的一个类,定义了线性代数中关于向量(组)的一些操作。
//声明一个int型向量a vector a(10); //声明一个初始大小为10的向量 vector a(10, 1); //声明一个初始大小为10且初始值都为1的向量 vector b(a); //声明并用向量a初始化向量b vector b(a.begin(), a.begin()+3); //...
C++中的向量真乃神器也,什么?你还不知道,赶快来看吧
创建vector数组,C++数组向量介绍,工程实现文件
容器向量也是一个类模板。 标准库vector类型使用需要的头文件:#include <vector>。vector 是一个类模板。不是一种数据类型,vector是一种数据类型。Vector的存储空间是连续的,list不是连续存储的。 一、 定义和初始...
详细介绍vector的使用方法,并给出 使用的范例,对于初步了解迭代器的使用,有很大的帮助
int main() { ifstream in("aaa.txt");... vector<int> s; for(int a;in>>a;) s.push_back(a); int pair = 0; for(int i=0;i()-1;++i) for(int j=i+1;j();++j) if(s[i]==s[j]) pair++; cout; return 0;
vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。 特别注意: 使用vector需要注意以下几点: 1、如果你要表示的向量长度较长(需要为向量内部保存很多数),...
向量在同一个块中用多个线程执行。本实验是启动一个线程块,这个线程块中启动的线程个数为10个。