Vector3——简单的3D向量类

article/2025/10/18 19:00:57

参考资料:1、 [美] 邓恩(Dunn F.)著. 3D数学基础——图形设计与开发. 史银雪,陈洪,王荣静 译 清华大学出版社 p57-65
2、http://www.2cto.com/kf/201311/260139.html

编程环境 QT4.8.4 + VS2010

本文用 C++实现一个简单的Vector3类的功能,已经实现的功能有:
1、重载赋值运算符“=”
2、重载“==”和“!=”操作符
3、置为零向量
4、重载一元运算符“-”
5、重载二元预算法“+”“-”
6、标量的乘除法
7、重载自反运算符
8、向量单位化
9、向量的数量积,又叫:点乘
10、向量的向量积,又加:叉乘
11、计算两点间的距离
12、打印向量

程序清单
1、vector3.h

#ifndef VECTOR3_H
#define VECTOR3_Hclass Vector3
{
public:float x, y, z;//构造函数//默认构造函数,初始一个零向量Vector3();//复制构造函数Vector3(const Vector3 &a);//带参数的构造函数,用三个值完成初始化Vector3(float nx, float ny, float nz);//析构函数~Vector3();//标准对象操作//重载赋值运算符,并返回引用,以实现左值。Vector3& operator=(const Vector3 &a);//重载"=="操作符bool operator==(const Vector3 &a) const ;//重载"!="操作符bool operator!=(const Vector3 &a) const ;//向量运算//置为零向量void Zero();//重载一元"-"运算符Vector3 operator-()const;//重载二元"+"和"-"运算符Vector3 operator+(const Vector3 &a) const;  Vector3 operator-(const Vector3 &a) const;  //标量的乘、除法Vector3 operator*(float a) const;Vector3 operator/(float a) const;  //重载自反运算符Vector3& operator+=(const Vector3 &a);Vector3& operator-=(const Vector3 &a);Vector3& operator*=(float a);Vector3& operator/=(float a);//向量标准化void Normalize();//向量点乘,重载标准的乘法运算符float operator*(const Vector3 &a) const;//求向量模float VectorMag(const Vector3 &a);//计算两向量的叉乘Vector3 CrossProduct(const Vector3 &a,const Vector3 &b);//计算两点间的距离float Distance (const Vector3 &a,const Vector3 &b);//打印向量void Vector3::PrintVector3();};#endif // VECTOR3_H

2、vector3.cpp

#include <iostream>
#include <qmath.h>
#include "vector3.h"//默认构造函数,初始一个零向量
Vector3::Vector3(){x=0;y=0;z=0;
}
//复制构造函数
Vector3::Vector3(const Vector3 &a){x=a.x;y=a.y;z=a.z;
}
//带参数的构造函数,用三个值完成初始化
Vector3::Vector3(float nx, float ny, float nz){x=nx;y=ny;z=nz;
}
//析构函数
Vector3::~Vector3(){};//标准对象操作
//重载赋值运算符,并返回引用,以实现左值。
Vector3& Vector3::operator=(const Vector3 &a){x =a.x;y =a.y;z =a.z;return *this;
}//重载"=="操作符
bool Vector3::operator==(const Vector3 &a) const{return x==a.x && y==a.y && z==a.z;
}//重载"!="操作符
bool Vector3::operator!=(const Vector3 &a) const{return x!=a.x || y!=a.y || z!=a.z;
}//置为零向量
void Vector3::Zero(){x = y = z = 0.0f;
}
//重载一元"-"运算符
Vector3 Vector3::operator-()const
{return Vector3(-x,-y,-z);
}//重载二元"+""-"运算符
Vector3 Vector3::operator+(const Vector3 &a) const{return Vector3(x+a.x,y+a.y,z+a.z);
}
Vector3 Vector3::operator-(const Vector3 &a) const{return Vector3(x-a.x,y-a.y,z-a.z);
}//标量的乘、除法
Vector3 Vector3::operator*(float a) const{return Vector3(x*a,y*a,z*a);}
Vector3 Vector3::operator/(float a) const{float oneOverA = 1.0f /a;//注意这里不对"除零"进行处理return Vector3(x*oneOverA,y*oneOverA,z*oneOverA);
}//重载自反运算符
Vector3& Vector3::operator +=(const Vector3 &a){x+=a.x;y+=a.y;z+=a.z;return *this;
}Vector3& Vector3::operator -=(const Vector3 &a){x-=a.x;y-=a.y;z-=a.z;return *this;
}
Vector3& Vector3::operator *=(float a){x *= a;y *= a;z *= a;return *this;
}
Vector3& Vector3::operator /=(float a){float oneOverA =1.0f/a;x *= oneOverA;y *= oneOverA;z *= oneOverA;return *this;
}//向量标准化
void Vector3::Normalize(){float magSq = x*x + y*y + z*z;if (magSq >0.0f){//检查除零float oneOverMag = 1.0f / sqrt(magSq);x *= oneOverMag;y *= oneOverMag;z *= oneOverMag;}
}//向量点乘,重载标准的乘法运算符
float Vector3::operator *(const Vector3 &a) const{return x*a.x + y*a.y +z *a.z;
}
void Vector3::PrintVector3(){
    std::cout <<"("<<x<<","<<y<<","<<z<<")"<<std::endl;}
//求向量模
float Vector3::VectorMag(const Vector3 &a){return sqrt(a.x * a.x + a.y * a.y + a.z * a.z);
}/* 
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 &a,const Vector3 &b){return Vector3(a.y * b.z - a.z * b.y,a.z * b.x - a.x * b.z,a.x * b.y - a.y * b.x);  
}//计算两点间的距离
 float Vector3::Distance (const Vector3 &a,const Vector3 &b){float dx = a.x - b.x;float dy = a.y - b.y;float dz = a.z - b.z;return sqrt(dx * dx + dy * dy + dz * dz);
}

3、测试文件 main.cpp

#include <QtCore/QCoreApplication>
#include "vector3.h"
#include <iostream>
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);//测试构造函数Vector3 v1;Vector3 v2(3.0f,4.0f,5.0f);Vector3 v3(v2);//测试赋值运算符Vector3 v4 =v3;//打印v1.PrintVector3();v2.PrintVector3();v3.PrintVector3();v4.PrintVector3();//测试布尔运算 ==if (v1 ==v3){std::cout<<"v1=v3"<<std::endl;}else{std::cout<<"v1!=v3"<<std::endl;}if (v2 == v3){std::cout<<"v2=v3"<<std::endl;}else{std::cout<<"v2!=v3"<<std::endl;}//测试布尔运算 !=if (v1 !=v3){std::cout<<"v1!=v3"<<std::endl;}else{std::cout<<"v1=v3"<<std::endl;}if (v2 != v3){std::cout<<"v2!=v3"<<std::endl;}else{std::cout<<"v2=v3"<<std::endl;}//测试置为零向量v2.Zero();v1.PrintVector3();v2.PrintVector3();v3.PrintVector3();v4.PrintVector3();//测试一元"-"运算符Vector3 v5=-v3;v5.PrintVector3();//测试二元预算符Vector3 v_x(2.0f,3.0f,4.0f);Vector3 v_y(3.0f,3.0f,4.0f);Vector3 v_add = v_x+v_y;Vector3 v_sub = v_x-v_y;v_add.PrintVector3();v_sub.PrintVector3();//求模float mag = v2.VectorMag(v2);std::cout <<mag<<std::endl;//单位化v2.Normalize();v2.PrintVector3();return a.exec();
}

二、运行结果
vector3
说明:本程序是在QT4.8.4 +VS2010中实现,如果转到其他编程环境,请自行修改。

源程序下载:http://download.csdn.net/detail/gongchao1212/8675321


http://chatgpt.dhexx.cn/article/YGsTUlDE.shtml

相关文章

Unity Vector3.Dot(VectorA, VectorB)

Unity Vector3.Dot(VectorA, VectorB) Vector3.Dot(VectorA, VectorB) 等于 VectorA * VectorB。 而对于两个向量的乘积计算&#xff1a; VectorA * VectorB Ax * Bx Ay * By Az * Bz 例如&#xff1a; VectorA(1,2,3) * VectorB(4,5,6) 1*42*53*632 一般应用于判断飞行…

Unity - 优化 Vector3.ProjectOnPlane

文章目录 起因好奇绘制 Vector3.ProjectOnPlane 的参数&#xff0c;与返回结果绘制结果定位作用、优化完整脚本ProjectReferences 起因 之前偶然项目中看到过 API Vector3.ProjectOnPlane API 的使用 然在这篇文章也看到&#xff1a;Unity3d那些你不常用但确有其用的方法—Ve…

Unity —— Vector3

Vector3向量&#xff0c;在三维坐标系中带有方向和大小的数据 Vector3中一些常量&#xff1a; 1、Vector3.back&#xff08;0,0,-1&#xff09; 2、Vector3.forward&#xff08;0,0,1&#xff09; 3、Vector3.left&#xff08;-1,0,0&#xff09; 4、Vector3.right&#xff0…

Unity3D_向量(Vector3)数学基础

向量&#xff08;Vector3&#xff09; 在虚拟的游戏世界中&#xff0c;3D数学决定了游戏&#xff0c;如何计算和模拟出开发者以及玩家看到的每一帧画面。学习基础的3D数学知识可以帮主用户对游戏引擎产生更深刻的了解。 向量定义&#xff1a;既有大小又有方向的量叫做向量。在…

Vector3类详解

|| 欢迎讨论技术的可以相互加微信&#xff1a;windgs (请备注csdnxx职业) || --------------------- 作者&#xff1a;隨意的風 来源&#xff1a;CSDN 原文&#xff1a;https://blog.csdn.net/Windgs_YF/article/details/86550843 版权声明&#xff1a;本文为博主原创文章…

面试真的被问麻了......

前几天组了一个软件测试面试的群&#xff0c;没想到效果直接拉满&#xff0c;看来大家对面试这块的需求还是挺迫切的。昨天我就看到群友们发的一些面经&#xff0c;感觉非常有参考价值&#xff0c;于是我就问他还有没有。 结果他给我整理了一份非常硬核的面筋&#xff0c;打开…

实事求是,虚事求应

休谟之问&#xff0c;能否从“是”中得“应”&#xff1f;孟子回答说&#xff1a;二者不可得兼&#xff0c;舍身&#xff08;是&#xff09;取义&#xff08;应&#xff09;者也。 ​ 智能涉及人、机、环境三部分&#xff0c;其中人通过算计形成的意图、直觉、抽象等&#xff0…

管理就要“实打实”

https://www.toutiao.com/a6642491590042452483/ 2019-01-07 10:13:32 导语 如何才能使得企业的经营管理高效呢&#xff1f;这个问题没有什么捷径可走&#xff0c;唯有实打实的来落实各项工作。归纳起来就是三个方面的内容&#xff1a;说实话、办实事、讲实效。 一、 说实话…

8分钟的面试,我直呼太变态了......

干了两年外包&#xff0c;本来想出来正儿八经找个互联网公司上班&#xff0c;没想到算法死在另一家厂子。 自从加入这家外包公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到11月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资…

【不就是java设计模式吗】设计模式七大原则,用代码对比方式,化抽象为具体,实打实的教会你

&#x1f497;作者简介&#xff1a;大家好&#xff0c;我是卷心菜~~&#xff0c;第二季新星计划java领域第十名。&#x1f4dd;个人主页&#xff1a;卷心菜的CSDN博客&#x1f4d5;系列专栏&#xff1a;本文写在Java设计模式专栏&#xff1a;不就是java设计模式吗&#x1f4e7;…

Java岗:实打实掌握[Java多线程]和[并发编程]

概述 面试中&#xff0c;多线程和并发编程已经是必不可少的了&#xff0c;我经常看到此类问题&#xff0c;当时也简单了解过&#xff0c;什么继承Thread类&#xff0c;实现Runnable接口&#xff0c;这些都被说烂了&#xff0c;知道这些当然是远远不够的&#xff0c;于是这几天…

我用Java能干什么?

Java是一门面向对象编程语言&#xff0c;不仅吸收了C语言的各种优点&#xff0c;还摒弃了C里难以理解的多继承、指针等概念&#xff0c;因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表&#xff0c;极好地实现了面向对象理论&#xff0c;…

什么是JAVA?JAVA能做什么?

什么是Java&#xff1f; Java既是一种编程语言&#xff0c;又是一个平台。 Java程序语言 Java是具有以下特征的高级程序语言&#xff1a; 简单   面向对象   可分布   可解释   强壮   安全性   结构化   轻便   功能强大   多线程   动态 Java既可以被编译…

Java是什么?主要是干什么的?

随着Java技术不断发展&#xff0c;许多人都想问&#xff1a;Java是什么?主要是干什么的呀&#xff1f;现在小朗来为大家解惑。java是一种高级计算机语言&#xff0c;一种可以编写跨平台应用软件、完全面向对象的程序设计语言。那Java主要是干嘛的呀&#xff1f; 一、java可以做…

学java可以从事什么工作-java岗位有哪些?

学java可以从事的工作主要有&#xff1a;企业级应用开发、网站开发、软件开发、嵌入式领域、大数据、科学应用等。java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。 1、企业级应用开发 企业级应用开发大可以做全国联网的系统&#xff0c;小到中小企…

Java到底能做什么事情呢?

相信很多小伙伴看到标题第一个出现在脑海里的想法是赚钱,难道你们只知道java薪资高?那么你太low,Java的应用领域很广,可以说是现在最普及的,遍布各行各业,可见其优势所在。 1、大数据领域 Hadoop以及其他大数据处理技术普遍用的都是Java,当然其他语言也有用到,基于Jav…

Java编程到底能干什么,可以从事哪些岗位?

听说程序员工资很高&#xff0c;想学Java语言&#xff0c;但不知道它到底能做什么&#xff1f;” 如果你是一个Java初学者&#xff0c;你可能对Java应用在什么地方感到困惑。除了“马里奥”“贪吃蛇”等经典游戏&#xff0c;其他领域好像也找不到Java的踪迹&#xff0c;那么Jav…