本文用C++实现一个简单的Vector3类的功能,暂时有的功能是:
1 + - * /算术运算
2 向量的数量积,又叫:点乘
3 向量的向量积,又叫:叉乘
4 向量单位化(normalization)
 
//Vecotr3.h
#pragma once extern const double uZero; class Vector3
{
float x, y, z;
public:
Vector3():x(), y(), z(){}
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-; //复制构造函数,必须为常量引用参数,否则编译不通过
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 = ;
len = /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.x*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 ;
}
 
运算结果:

[C++][代码库]Vector3空间向量类的更多相关文章

  1. C++实现一个Vector3空间向量类(转)

    转自:http://www.2cto.com/kf/201311/260139.html ector2,3,4类在DirectX中都有现成的可以调用,不过要实现其中的功能其实也不难,也都是一些简单的数 ...

  2. 如何统计TFS代码库中的团队项目所占用的磁盘空间

    在一个开发团队较多的研发中心,当开发人员的代码数据积累到一定程度,TFS系统的磁盘空间的使用率会逐渐成为系统管理员关注的问题.你可能会关注代码库中每个团队项目,甚至每个目录占用的的磁盘空间.不幸的,即 ...

  3. 文本相似度算法——空间向量模型的余弦算法和TF-IDF

    1.信息检索中的重要发明TF-IDF TF-IDF是一种统计方法,TF-IDF的主要思想是,如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分 ...

  4. 第六章:3D向量类

    第一节:类接口的设计 1.好的类在设计之前首先要回答下列问题:“这些类将包含哪些数据?”,“这个类将提供什么样的操作?”,“在哪些数据上执行操作?”. 我们已经知道我们要设计的是3D向量类,用来存储x ...

  5. 2018-8-10-C#-代码占用的空间

    title author date CreateTime categories C# 代码占用的空间 lindexi 2018-08-10 19:16:52 +0800 2018-2-13 17:23 ...

  6. Overview of the Oppia codebase(Oppia代码库总览)

    Oppia is built with Google App Engine. Its backend is written in Python, and its frontend is written ...

  7. STORM_0008_Structure-of-the-codebase_Storm的代码库的结构

    http://storm.apache.org/releases/1.0.1/Structure-of-the-codebase.html Structure of the codebase 源码分成 ...

  8. 使用libzplay库封装一个音频类

    装载请说明原地址,谢谢~~      前两天我已经封装好一个duilib中使用的webkit内核的浏览器控件和一个基于vlc的用于播放视频的视频控件,这两个控件可以分别用在放酷狗播放器的乐库功能和MV ...

  9. gtest代码库浅析

    代码库工程概述 IDE:Visual Studio 2010 sln路径:gtest\msvc\gtest.sln 用IDE打开上面的sln,可以看到以下四个工程,算不上复杂.展开之后更是感觉这几个工 ...

随机推荐

  1. 基于jdk proxy的动态代理模式

    代理模式 是spring AOP机制的实现基础,有必要学习一下. 有两种,一种是目标类有接口的, 采用JDK动态代理,一种是目标类没接口的,采用CGLIB动态代理. 先看一组代码, package c ...

  2. Python:操作文件

    python操作文件库不需要安装其他module,文件操作类库是python语言自身支持的操作. 判定文件是否存在:os.path.isfile(filePath) import os import ...

  3. 我写了本破书-swift语言实战晋级

    本书是一本介绍Swift实战的实用图书,旨在帮有一定编程基础的童鞋能够快速上手Swift. 本书的结构是先讲解了Swift语言的精要,没有基础的童鞋可以学习,有基础的童鞋可以当做复习. 接着讲解如何用 ...

  4. PostgreSQL trigger (function) examples

    postgres=# \c warehouse_db You are now connected to database "warehouse_db" as user " ...

  5. HTML部分标签和代码

    1.1.1 一般标签.格式控制标签 所谓HTML就是 Hyper Text Markup Language(超无文本标记语言) <html>   开始标签 <head> 网页上 ...

  6. 使用Mysql修改密码命令更改root的密码

    使用Mysql修改密码命令更改root的密码. 进入Mysql数据库命令行方式有两种方式: 方式一:在Mysql开始菜单里包含Mysql命令行客户端,只要点击输入root的密码即可进入. 方式二:在D ...

  7. C++之路起航——标准模板库(queue)

    queue: FIFO队列:先进先出队列. 优先队列:对队列中的元素按优先级的大小输出. 定义: FIFO队列: queue<数据类性>变量名. 优先队列:priority_queue&l ...

  8. windows下 mysql忘记密码怎么办

    第一种: 1. 关闭正在运行的MySQL服务. (先查看mysql是否重命名,net start)2. 打开DOS窗口,转到mysql\bin目录. 3. 输入mysqld --skip-grant- ...

  9. html5新增全局属性

    data-* 如:data-type,data-role等 hidden  <div hidden></div> 隐藏该div spellcheck <textarea ...

  10. zw版【转发·台湾nvp系列例程】HALCON ShapeTrans(Delphi)

    zw版[转发·台湾nvp系列例程]HALCON ShapeTrans(Delphi) procedure TForm1.Button1Click(Sender: TObject);var img: H ...