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

本文用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.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 0;
}  

运算结果:

时间: 2024-11-13 09:24:35

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

空间向量类Vector3的C++实现

提要 两年前的我写下了这篇文章 - 向量类的实现.现在看来,这代码真是略显丑陋. 于是,重新写吧. 参照了一下Unity3d 的Vector3类的接口.话不多说,上代码. 编译器:gcc 4.6.3 代码清单 vector3.h #ifndef VECTOR3_H #define VECTOR3_H #include <math.h> #include <assert.h> #include <iostream> #define PI 3.14159265 using

《3D数学基础》实践1 向量类代码分析

理解数学,理解代码! 大家好,我是老G! 今天为大家带来<3D数学基础>系列视频. 主要讲解:游戏开发中用到的3D数学知识,包括:定义,定理,推论. 也包括他们的推导过程,以及应用举例. 本套视频完全免费,欢迎捐助,帮助我完成这套视频 支付宝帐号:[email protected]gmail.com 今天带来的是系列第11讲--实践1 向量类代码分析 本次视频,主要讲解一下如下几个库中的向量类的代码: 1.3D Math Primer for Games and Graphics Develo

第二十章 内存等空间管理类的实现

                   第二十章   内存等空间管理类的实现      空间.时间对我来说,或许永远是一个迷.即使我曾经深入到原子的最深处,即使人类科学家是自欺欺人,即使我了解到的最深层次的部分真理是正确的:那又能怎样?那都是过去式,在那光明与黑暗一体之地.我的灵魂受伤了:我不得不回到电脑这块充满垃圾的地方修心养性. 或许我的论述方法不好,要完全理解本章是有点难度:你要对简单的空间概念需要一定的理解,即使只是论述1D的线性平面空间中的2个基本方法:分配与释放,但也很复杂.要知道LI

红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其解决方法

最近在调试红外遥控格力空调,在论坛中学到了不少东西.参考: (1)<解决问题系列(4)--红外编码分析利器使用> (2)<315Mhz模块传输替代315Mhz遥控器> 调试环境: 软件:Arduino IDE 1.0 硬件:Arduino uno r3 问题分> 我使用的遥控器型号是YAD0F. 在使用逻辑分析仪dump出原始码之后,使用sendRaw函数来发送原始码,发现空调没有反应.原始码如下: 9004,4499,699,1609,697,511,695,511,695

Linux中使用京东代码库JDCode创建私有Git仓库

国外Git经常被墙,所以目光转向国内.目前,云存储真的是很热,有很多公司在做. 看了一下,CSDN,开源中国,淘宝,京东,Gitcafe都在搞.淘宝只支持SVN. JD号称提供1G免费空间,而且支持私有仓库,所以就去试了试.https://code.jd.com/ 配置起来也比较简单,在网页上新建一个私有项目,之后会提供给你一个项目地址. 不过,私有项目要通过ssh登陆下载. 下面讲讲ssh的配置. 整个配置过程JDCode上面写的比较详细https://code.jd.com/articles

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

Oppia is built with Google App Engine. Its backend is written in Python, and its frontend is written using AngularJS. Oppia是基于Google App Engine开发建设的.它的后台是用Python编写,前端是用AngularJS编写. The core核心 Most of Oppia's functionality is in the core/ directory, w

我的向量类

输入代码: /* *Copyright (c)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:sum123.cpp *作 者:林海云 *完成日期:2015年5月23日 *版 本 号:v2.0 * *问题描述:建立一个向量类MyVector *程序输入:输入d1,d2 *程序输出:按要求输出 */ #include<iostream> using namespace std; class MyVector { public: MyVector(in

如何构建自己的代码库

曾经有一段时间,我非常地苦恼,那就是如何提高自己的代码健壮性?难道,除了单元测试就没有别的办法了吗.这一问题困挠了我很久.直到最近才有了一丝眉目.作为整个完整的项目来说,它涉及到的不可控因素很多.而对个人来讲,困难的东西也很多,但是还是有很多办法可以提高个人开发效率的方法的.比如说,建立自己的代码库就是不错的一个办法.采用已经经过测试的方法,可以在短时间达到提高效率的方法. (1)建立自己本地的函数库代码 构建代码库是最基本的一个方法.比如说,如果对算法比较熟练,可以在本地创建一个基本的函数库代

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

http://storm.apache.org/releases/1.0.1/Structure-of-the-codebase.html Structure of the codebase 源码分成独立的三层 第一:在最开始的时候Storm就被设计成支持多种语言,Nimbus是一种Thrift的服务,Topologies是一种Thrift类型的结构.Thrift的使用使得Storm可以被任何语言使用. 第二:所有的Storm的接口都被声明为java接口,虽然内部的实现有很多的Clojure但是