转自:http://www.2cto.com/kf/201311/260139.html

ector2,3,4类在DirectX中都有现成的可以调用,不过要实现其中的功能其实也不难,也都是一些简单的数学知识罢了。

本文用C++实现一个简单的Vector3类的功能,暂时有的功能是:
1 + - * /算术运算
2 向量的数量积,又叫:点乘
3 向量的向量积,又叫:叉乘
4 向量单位化(normalization)
 
[cpp] 
//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();  
};  
[cpp]  
//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.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;  
}  
 
测试主程序:
[cpp]  
#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++实现一个Vector3空间向量类(转)的更多相关文章

  1. [C++][代码库]Vector3空间向量类

    本文用C++实现一个简单的Vector3类的功能,暂时有的功能是: 1 + - * /算术运算 2 向量的数量积,又叫:点乘 3 向量的向量积,又叫:叉乘 4 向量单位化(normalization) ...

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

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

  3. Directx11教程(8) 一个新的camera类

    原文:Directx11教程(8) 一个新的camera类      本章我们将替换掉CameraClass类,实现一个稍微靠谱点的摄像机类.并通过Q,W,E,A,S,D,Z,X,C等按键实现摄像机的 ...

  4. Cygwin 是一个用于 Windows 的类 UNIX shell 环境

    cygwin的安装使用   Cygwin 是一个用于 Windows 的类 UNIX shell 环境. 它由两个组件组成:一个 UNIX API 库,它模拟 UNIX 操作系统提供的许多特性:以及 ...

  5. 第六章:3D向量类

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

  6. 精解Mat类(一):基本数据类型-固定大小的 矩阵类(Matx) 向量类(Vector)

    一.基础数据类型 1.(基础)固定大小矩阵类 matx 说明: ①    基础矩阵是我个人增加的描述,相对于Mat矩阵类(存储图像信息的大矩阵)而言. ②    固定大小矩阵类必须在编译期间就知晓其维 ...

  7. day 22 二十二、面向对象导入、名称空间、类与对象

    一.面向对象导入 1.含义: ①面向过程: 重过程:解决问题,考虑的是解决问题的流程 解决问题的思路清晰,但拓展性不强 ②面向对象: 重对象:解决问题,找到解决问题的对象 解决问题的思路可能不止一条( ...

  8. [原][数学][C++][osg]空间向量OA到转到空间向量OB、以及四元素Q1转到Q2的函数

    注意:Oa其实在OK的延长线上,上图只是为了好看才把Oa和OK分开了 算法需求如图所示: 已知空间向量OA和空间向量OB 我想算出OA向OB按某角度或者某时间移动 变成空间向量Oa的算法 先说废话:我 ...

  9. 向量类Vector

    Java.util.Vector提供了向量(Vector)类以实现类似动态数组的功能.在Java语言中.正如在一开始就提到过,是没有指针概念的,但如果能正确灵活地使用指针又确实可以大大提高程序的质量, ...

随机推荐

  1. java ee 中 Jsp 页面的定时的跳转(数字倒数)

    java ee 中 Jsp 页面的定时的跳转,实现数字倒计时跳转固定页面 1,Servlet类  RefreshServlet类实现 package org.servlet; import java. ...

  2. Python socket编程之构造IP首部和ICMP首部

    这两天在做一个实验需要自己构造IP首部,遇到诸多问题,搞了一天终于搞定. 关于socket的介绍网上一大堆,我只记录构造IP头时我遇到的问题.由于没玩过socket构造IP首部,网上找了段代码研究下, ...

  3. jQuery二维码

    现在二维码很火,因为他可以很方便的贴到任何地方,只要扫一扫就可以看到二维码的内容 ok 废话少说,上代码 这个二维码基于jquery和jquery.qrcode插件 所以使用前先引入 <scri ...

  4. winform绑定多张图片

    开发winform程序的时候经常设计到要显示多张图片的问题,其解决思路一般是先遍历文件夹中的所有图片,然后再把这些图片添加到ImageList控件中,最后再绑定显示出来.这里我们介绍两种绑定的方法: ...

  5. iOS交互h5——user-agent

    User-Agent(用户代理)字符串是Web浏览器用于声明自身型号版本并随HTTP请求发送给Web服务器的字符串,在Web服务器上可以获取到该字符串. 在公司产品中,在userAgent中增加了XX ...

  6. 撩课-Web大前端每天5道面试题-Day23

    1.为什么用Nodejs,它有哪些优缺点? 优点: 事件驱动,通过闭包很容易实现客户端的生命活期. 不用担心多线程,锁,并行计算的问题 V8引擎速度非常快 对于游戏来说,写一遍游戏逻辑代码,前端后端通 ...

  7. 《AlphaGo世纪对决》与周志华《机器学习》观后感

    这两天看了<AlphaGo世纪对决>纪录片与南大周志华老师的<机器学习>,想谈谈对人工智能的感想. 首先概述一下视频的内容吧,AlphaGo与李世石对战的过程大家都有基本的了解 ...

  8. MySQL内连接和外连接

    INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录. LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录. RIGHT JOIN(右连接): 与 LEF ...

  9. 关于pycharm 打不开某些文件夹和文件打不开的问题

    在使用pycharm的时候遇到了一个情况, 下载了一个文件,自己修改了文件夹名称后再打开文件夹里的py文件, 打不开了,pycharm没有反应, 百度了一下,没有类似的问题,觉得应该是个个例... 然 ...

  10. Linux安装配置mysql

    1.假设已经有mysql-5.5.10.tar.gz以及cmake-2.8.4.tar.gz两个源文件 (1)先安装cmake(mysql5.5以后是通过cmake来编译的) [root@ rhel5 ...