1. ホーム
  2. C++

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