Vector3 - シンプルな 3D ベクトルクラス
2022-02-22 05:45:17
参考文献 1. [US] ダン F. ダン著. 3D数学の基礎-グラフィックスの設計と開発. Yinxue Shi, Hong Chen, Rongjing Wang, Tsinghua University Press p57-65
2.
http://www.2cto.com/kf/201311/260139.html
プログラミング環境 QT4.8.4 + VS2010
この記事では、C++でシンプルなVector3クラスの機能を実装しており、以下のようになります。
1. 代入演算子 "=" をオーバーロードしています。
2. 2. "=="と"! =演算子
3. ゼロベクトルに設定
4. 単項演算子 "-" をオーバーロードする。
5. バイナリーバジェット "+" "-" をオーバーロードする。
6、スカラー量の乗算と除算
7. 自己逆行列演算子のオーバーロード
8、ベクトル単位化
9、ベクトルの量的積、別名:ドットプロダクト
10. ベクトルのベクトル積、別名:フォーク積
11、2点間の距離を計算する
12、ベクトルを印刷する
プログラム一覧
1. ベクター3.h
#ifndef VECTOR3_H
#define VECTOR3_H
class Vector3
{
public:
float x, y, z;
//Constructor
//default constructor, initially a zero vector
Vector3();
//copy constructor
Vector3(const Vector3 &a);
//constructor with parameters, initialize with three values
Vector3(float nx, float ny, float nz);
//destructor
~Vector3();
//standard object manipulation
//overload the assignment operator and return a reference for left values.
Vector3& operator=(const Vector3 &a);
//overload "==" operator
bool operator==(const Vector3 &a) const ;
//overload "=! =" operator
bool operator!=(const Vector3 &a) const ;
//vector operation
//set to zero vector
void Zero();
//overload the unary "-" operator
Vector3 operator-() const;
//overloads the binary "+" and "-" operators
Vector3 operator+(const Vector3 &a) const;
Vector3 operator-(const Vector3 &a) const;
// Multiplication and division of scalars
Vector3 operator*(float a) const;
Vector3 operator/(float a) const;
//overload the self-inverse operator
Vector3& operator+=(const Vector3 &a);
Vector3& operator-=(const Vector3 &a);
Vector3& operator*=(float a);
Vector3& operator/=(float a);
//vector normalization
void Normalize();
//vector dot product, overload the standard multiplication operator
float operator*(const Vector3 &a) const;
//Seek vector modulo
float VectorMag(const Vector3 &a);
//compute the fork product of two vectors
Vector3 CrossProduct(const Vector3 &a,const Vector3 &b);
// Calculate the distance between two points
float Distance (const Vector3 &a,const Vector3 &b);
//Print the vector
void Vector3::PrintVector3();
};
#endif // VECTOR3_H
2. ベクター3.cpp
#include <iostream>
#include <qmath.h>
#include "vector3.h"
//default constructor, initialize a zero vector
Vector3::Vector3(){
x=0;
y=0;
z=0;
}
// copy constructor
Vector3::Vector3(const Vector3 &a){
x=a.x;
y=a.y;
z=a.z;
}
// constructor with parameters, initialization done with three values
Vector3::Vector3(float nx, float ny, float nz){
x=nx;
y=ny;
z=nz;
}
// destructor
Vector3::~Vector3(){};
//standard object manipulation
//overload the assignment operator and return a reference for left values.
Vector3& Vector3::operator=(const Vector3 &a){
x =a.x;
y =a.y;
z =a.z;
return *this;
}
//overload the "==" operator
bool Vector3::operator==(const Vector3 &a) const{
return x==a.x && y==a.y && z==a.z;
}
//overload ""! =" operator
bool Vector3::operator!=(const Vector3 &a) const{
return x!=a.x || y!=a.y || z!=a.z;
}
// set to a zero vector
void Vector3::Zero(){
x = y = z = 0.0f;
}
//overload the monadic "-" operator
Vector3 Vector3::operator-()const
{
return Vector3(-x,-y,-z);
}
//overload the binary "+" and "-" operators
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);
}
// Multiplication and division of scalars
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;//Note that "divide by zero" is not handled here
return Vector3(x*oneOverA,y*oneOverA,z*oneOverA);
}
// Overload the self-inverse operator
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;
}
//Vector normalization
void Vector3::Normalize(){
float magSq = x*x + y*y + z*z;
if (magSq >0.0f){//check divide by zero
float oneOverMag = 1.0f / sqrt(magSq);
x *= oneOverMag;
y *= oneOverMag;
z *= oneOverMag;
}
}
// vector dot product, overloading the standard multiplication operator
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;
}
// find the vector modulus
float Vector3::VectorMag(const Vector3 &a){
return sqrt(a.x * a.x + a.y * a.y + a.z * a.z);
}
/*
The Cross Product cross product formula
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
*/
// Calculate the fork product of two vectors
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
);
}
// Calculate the distance between two points
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
#include "vector3.h"
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//test constructor
Vector3 v1;
Vector3 v2(3.0f,4.0f,5.0f);
Vector3 v3(v2);
//test assignment operator
Vector3 v4 =v3;
//print
v1.PrintVector3();
v2.PrintVector3();
v3.PrintVector3();
v4.PrintVector3();
//test boolean ==
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;
}
//test boolean ! =
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;
}
//test set to zero vector
v2.Zero();
v1.PrintVector3();
v2.PrintVector3();
v3.PrintVector3();
v4.PrintVector3();
// test the monadic "-" operator
Vector3 v5=-v3;
v5.PrintVector3();
//test the binary budget operator
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();
//modulize
float mag = v2.VectorMag(v2);
std::cout <<mag<<std::endl;
//Unitize
v2.Normalize();
v2.PrintVector3();
return a.exec();
}
II. 実行結果
注意:このプログラムはQT4.8.4 +VS2010で実装されていますので、他のプログラミング環境に移行される場合はご自身で修正してください。
ソースプログラムのダウンロード http://download.csdn.net/detail/gongchao1212/8675321
関連
-
c++ プログラミング プロンプトの関数定義はここでは許可されません。
-
c++ std::move Principle の実装と使用法のまとめ
-
vs2015 はソースファイル stdio.h を見つけることができない 解決策
-
void* から char* への無効な変換」および「文字列定数から 'char*' への非推奨の変換」を解決 "
-
C++ max() 関数エラー: 'max' の呼び出しに一致する関数がない
-
エラー: コンストラクタ、デストラクタ、または '.' トークンの前に型変換が必要です。
-
不完全なクラス型へのポインタが許可されていないのですが、どのようなエラーですか?
-
抽象クラス型 "my class "のオブジェクトは使用できません 解決方法
-
エラー: "" から非スカラー型 "" への変換
-
ベクター使用時、ベクター添え字が範囲外、その他類似のエラーが発生する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
の 0x091f11c7 での未処理例外について。0xC0000005: アクセス違反の読み取り位置 0x0ab0f
-
C++コンパイルエラー:||error: ld returned 1 exit status|.
-
C++のostreamの詳細な使用方法
-
error: 'vector' does not name a type
-
VCのグローバル変数が*.objで既に定義されている場合の問題点
-
gccコンパイルエラーの一覧
-
C++テンプレートテンプレート使用法まとめ
-
ランタイムエラー: 'std::logic_error' のインスタンスを投げた後に terminate が呼び出されました。
-
std::allocator<char>::~allocator()' への未定義の参照
-
C++ inet_pton, inet_ntop 関数