`
jgsj
  • 浏览: 956856 次
文章分类
社区版块
存档分类
最新评论

C++实现一个Vector3空间向量类

 
阅读更多

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++实现的三维向量计算案例

    使用C++开发的一个三维空间向量的实现,支持基础的加、减、叉乘、点乘运算可以计算模长、向量夹角等,已经满足笔者的需求。 理论基础:https://go.lucoder.com/fwlink/?linkid=8

    纯c语言向量vector实现vector_master

    纯c语言的向量vector实现,实现c++中vector的一些基本的特性和操作,适用于一些只支持c语言的平台上使用vector数据结构,包含测试用例以及函数的使用范例

    自己向量类Vector

    自己向量类Vector: reserve resize size capacity operator [] push_back

    继承和派生向量类模板和字符串类

    给定一个头文件Vec.h,其中有抽象类模板VECROR设计。还有插入运算符重载、抽取运算符重载的普通c++函数...1、将类模板VECTOR作为基类,通过公共继承派生一个新的类模板Vector(向量类)和一个新的自定义字符串了String。

    c++ 实验课作业,Vector 缓存所有数据

    c++ 实验课作业,Vector 缓存所有数据。 好东西采用Vector 缓存所有数据。采用虚函数的方式保存缓存数据到文件。 西南科技大学

    vector3:SIMD 3D 向量 C++ 实现

    这是一个使用指令实现数学 3D 向量类的简单 C++ 库。 它基于。 例子 测试.cpp # include # include " vector3.h " int main () { Vector3 a ( 1 , 1 , 1 ); Vector3 b ( 2 , 0 , - 1 ); std::cout &lt;&lt; " a...

    用vector(向量)实现动态开辟二维三维数组c++语言及MPI

    此文件比较详细的介绍了用C++怎么动态的开辟二维三维数组。

    C++实现的神经网络

    C++没有内置的向量,矩阵库,可以自己先轮几个Vector, Matrix类以及各种数学运算操作,最好搞成链式操作。 不要用index form来推导和实现BP算法,个人比较喜欢matrix form, 公式会非常紧凑,实现起来也不太容易出错 ...

    C++类的定义实验,可以运行

    定义一个CPU类 包含了频率、等级、电压 的定义

    c++ vector(向量)使用方法详解(顺序访问vector的多种方式)

    vector是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器,本文介绍一下使用方法

    c++ vector(向量)使用方法详解.docx

    c++ vector(向量)使用方法详解.docx

    C++ Vector类

    自己写的一个类,定义了线性代数中关于向量(组)的一些操作。

    C++ string类、vector类 常用函数

    //声明一个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++中的向量

    C++中的向量真乃神器也,什么?你还不知道,赶快来看吧

    test_vector_c++vector_vector_vectorc++_

    创建vector数组,C++数组向量介绍,工程实现文件

    C++ vector的用法小结

    容器向量也是一个类模板。 标准库vector类型使用需要的头文件:#include &lt;vector&gt;。vector 是一个类模板。不是一种数据类型,vector是一种数据类型。Vector的存储空间是连续的,list不是连续存储的。 一、 定义和初始...

    C++中的vector类

    详细介绍vector的使用方法,并给出 使用的范例,对于初步了解迭代器的使用,有很大的帮助

    向量的基本用法vector

    int main() { ifstream in("aaa.txt");... vector&lt;int&gt; s; for(int a;in&gt;&gt;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;

    C++ vector操作实现

    vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。 特别注意: 使用vector需要注意以下几点: 1、如果你要表示的向量长度较长(需要为向量内部保存很多数),...

    向量在同一个块中用多个线程执行

    向量在同一个块中用多个线程执行。本实验是启动一个线程块,这个线程块中启动的线程个数为10个。

Global site tag (gtag.js) - Google Analytics