转自: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空间向量类
本文用C++实现一个简单的Vector3类的功能,暂时有的功能是: 1 + - * /算术运算 2 向量的数量积,又叫:点乘 3 向量的向量积,又叫:叉乘 4 向量单位化(normalization) ...
- 文本相似度算法——空间向量模型的余弦算法和TF-IDF
1.信息检索中的重要发明TF-IDF TF-IDF是一种统计方法,TF-IDF的主要思想是,如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分 ...
- Directx11教程(8) 一个新的camera类
原文:Directx11教程(8) 一个新的camera类 本章我们将替换掉CameraClass类,实现一个稍微靠谱点的摄像机类.并通过Q,W,E,A,S,D,Z,X,C等按键实现摄像机的 ...
- Cygwin 是一个用于 Windows 的类 UNIX shell 环境
cygwin的安装使用 Cygwin 是一个用于 Windows 的类 UNIX shell 环境. 它由两个组件组成:一个 UNIX API 库,它模拟 UNIX 操作系统提供的许多特性:以及 ...
- 第六章:3D向量类
第一节:类接口的设计 1.好的类在设计之前首先要回答下列问题:“这些类将包含哪些数据?”,“这个类将提供什么样的操作?”,“在哪些数据上执行操作?”. 我们已经知道我们要设计的是3D向量类,用来存储x ...
- 精解Mat类(一):基本数据类型-固定大小的 矩阵类(Matx) 向量类(Vector)
一.基础数据类型 1.(基础)固定大小矩阵类 matx 说明: ① 基础矩阵是我个人增加的描述,相对于Mat矩阵类(存储图像信息的大矩阵)而言. ② 固定大小矩阵类必须在编译期间就知晓其维 ...
- day 22 二十二、面向对象导入、名称空间、类与对象
一.面向对象导入 1.含义: ①面向过程: 重过程:解决问题,考虑的是解决问题的流程 解决问题的思路清晰,但拓展性不强 ②面向对象: 重对象:解决问题,找到解决问题的对象 解决问题的思路可能不止一条( ...
- [原][数学][C++][osg]空间向量OA到转到空间向量OB、以及四元素Q1转到Q2的函数
注意:Oa其实在OK的延长线上,上图只是为了好看才把Oa和OK分开了 算法需求如图所示: 已知空间向量OA和空间向量OB 我想算出OA向OB按某角度或者某时间移动 变成空间向量Oa的算法 先说废话:我 ...
- 向量类Vector
Java.util.Vector提供了向量(Vector)类以实现类似动态数组的功能.在Java语言中.正如在一开始就提到过,是没有指针概念的,但如果能正确灵活地使用指针又确实可以大大提高程序的质量, ...
随机推荐
- rpm使用方法
查看rpm信息:rpm -q [软件的rpm名字]rpm -q下还有很多选项,具体功能如下:rpm -qa 列出所有已安装的RPM文件rpm -qa | grep [rp ...
- rails中params[:id]与params["id"]分析
写这个帖子的缘由是因为在页面参数传到rails的controller时用params[:]和params[""]都可以取到值: [1] pry(#<BooksControll ...
- js 3行代码,最简易实现div效果悬浮
简易实现浮动效果的首要因素是:获取滚动条距离浏览器顶部的距离,下面直接贴代码: <!DOCTYPE html> <html> <head> <meta cha ...
- .Net4.5新特性:正则表达式超时介绍
“Regex” 在数据验证方面最受欢迎.考虑到您可能对“Regex”完全陌生的.请参考我介绍Regex如何运作的视频. But because of the typical parsing logic ...
- Oracle表闪回功能
1.启用表闪回首先要在表上支持行移动(在数据字典中设置标识来标识该操作可能会改变行ID,即同一条数据闪回成功后主键都一样,但行ID其实已经发生变化了) SQL> alter table base ...
- 常常忘记但是很重要的sql语句
一.基础1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份 ...
- shell与expect结合使用
在linux操作系统下,使用脚本自动化,一般由两种方案,方案一:telnet+ftp,方案二:ssh+scp+expect. 以下主要使用ssh+scp+expect为例进行说明使用方式. 第一步:安 ...
- Win10+Ubuntu双系统安装
笔者使用的是华硕FX50J装的双系统,之前使用过Dell的游闸安装过,但是没有碰到那么多问题.所以觉得有必要记录下.安装双系统之前,电脑先安装了win10(win10也崩过几次).下面开始安装双系统步 ...
- vue.js 开发环境配置
1. node.js环境(npm包管理器) 下载: https://nodejs.org/en/download/current/ 下载解压版的方便 添加path环境后运行 npm包管理器,是集成在n ...
- Codeforces Global Round1 简要题解
Codeforces Global Round 1 A 模拟即可 # include <bits/stdc++.h> using namespace std; typedef long l ...