2012-10-13 42 views
1

我有3d(x,y,z)和方向的兩個物理矢量。我想對他們做一些操作。但我有一些問題:物理矢量表示

  • 我應該如何在C++中表示這個向量?換句話說,我寫下了課,但我不知道如何表達方向?

    class vector_ { 
         float x,y,z ; 
    } 
    
  • 如何計算兩個向量的加法? image

+1

使用它會爲你一個庫,例如[GLM](http://glm.g-truc.net/) – KillianDS

+0

這只是添加元素明智。在C++中,您可以重載'operator +' – stefan

+0

方向由'x','y'和'z'的值表示。 – juanchopanza

回答

1

還有,你應該提供一個3D矢量類的幾件事情:

  1. 默認構造
  2. 建設從零部件
  3. 訪問各個組件(可能在非笛卡爾表示太)
  4. 向量 - 向量加法和減法
  5. 標量乘或「縮放」
  6. VEC TOR-矢量標量或dot product
  7. 向量 - 向量矢量或cross product
  8. 「幅度」或「長度」

項目編號6允許你獲得兩個向量,這大概給你之間的角度「方向「你在你的問題中提到。習慣上將加法,減法,乘法和除法作爲非成員操作符+, -, */提供。但是,在矢量的情況下,至少有兩個常用的乘法運算(第6項和第7項),它們是不同的並且具有不同的返回值。所以它們通常是作爲非成員函數提供的。通常提供上述某些操作(+=,-=*=)的「增量」版本用於標量乘法。所以,你的向量類可以look6something這樣的:

namespace geom 
{ // 
class Vector3D 
{ 
public: 
    Vector3D() : x(0),y(0),z(0) {} 
    Vector3D(float x,float y, float z) : x_(x), y_(y), z_(z) {} 
    float x() { return x_; } // similarly for y() and z() 
    Vector3D& operator +=(const Vector3D& rhs) 
    { 
    x_ += rhs.x_; 
    y_ += rhs.y_; 
    z_ += rhs.z_; 
    return *this; 

    } 
    Vector3D& operator -=(const Vector3D& rhs) 
    { 
    // similar to above 
    } 
    template <typename Scalar> 
    Vector3D& operator *=(const Scalar& scalar) 
    { 
    x_ *+ scalar; 
    // similar for y_ and z_ 
    return *this; 
    } 
private: 
float x_, y_, z_: 
}; 

和你的一些非成員函數:

namespace geom 
{ 
Vector3D operator + (const Vector3D& lhs, const Vector3D& rhs) 
{ 
    return Vector3D(lhs.x() + rhs.x(), lhs.y() + rhs.y(), lhs.z() + rhs.z()); 

} 
// similarly for operator - 

template <typename Scalar> 
Vector3D operator*(const Scalar& scalar, const Vector3D& vect) 
{ 
    return Vector(scalar*vect.x(), scalar*vect.y(), scalar*vect.z()); 
} 

template <typename Scalar> 
Vector3D operator*(const Vector3D& vect, const Scalar& scalar) 
{ 
    return scalar*vect; 
} 

float dot(const Vector3D& lhs, const Vector3D& rhs) { /* implement dot product */ } 

Vector3D cross(const Vector3D& lhs, const Vector3D& rhs) { /* implement cross product */ } 
} // namespace geom 
0

您可以嘗試使用樣品C++幾何Vector類網上找到它擁有所有創建和修改矢量並對其執行各種操作所需的neccessary功能。 http://www.softsurfer.com/Archive/algorithm_0301/algorithm_0301.htm

這是在C執行幾何操作非常強大的庫++ http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Introduction/Chapter_main.html

或者你可以嘗試使用構造函數來定義矢量和寫入功能來計算的起源和它的所有角度。記住一個矢量的所有常量是正交的,所以你可以使用這3個值找到所有的屬性,如方向,大小。

class vector{ 
float x, y, z; 
public: 
vactor(float x, float y, float z){ 
    this->x = x; 
    this->y = y; 
    this->z = z; 

} 

static float angleToOrigin(vector v){ 
    // calculate angle to origin 
} 
} 
+1

C++向量和幾何向量是非常不同的東西,它不太可能會使用'std :: vector'來實現一個幾何向量(可以,但效率很低) – KillianDS

+0

哦謝謝,抱歉我發佈了錯誤的鏈接。我編輯過它。 –

1

作爲FAS作爲我可以從我學年回想起數學 - 矢量方向是其值只是符號:

對於1D情況下,這兩個一維矢量是相同的值,但相反的方向:

{11.21} {-11.21} 

對於二維矢量你有2個方向 - 這4個向量是不同的方向:

{1,2} {-1,2} {1,-2} {-1,-2} 

而對於3D矢量是有3個不同的方向,所以我會用簡單的std::array<float,3>

typedef std::array<float,3> Vector3D; 

http://en.cppreference.com/w/cpp/container/array

或者使用std ::元組http://en.cppreference.com/w/cpp/utility/tuple

typedef std::tuple<float,float,float> Vector3D; 

對於加入使用std::transformhttp://en.cppreference.com/w/cpp/algorithm/transform

inline Vector3D operator + (const Vector3D& a, const Vector3D& b) 
{ 
    Vector3D c; 
    std::transform(a.begin(), a.end(), b.begin(), c.begin(), 
       [](float a, float b){return a + b;}); 
    return c; 
} 

對於示例見ideone example

+1

3D矢量可以有許多表示形式,所以使用專門的類和清晰指示表示的方法可能會更好。 – juanchopanza

+0

@juanchopanza我不會使用額外的類,只是typedef對於運算符來說已經足夠了,但這是我個人的方法和觀點, – PiotrNycz

+0

@PiotrNycz按名稱訪問數學向量元素是一個優點,使用像'v [0]這樣的抽象構造'不幫助可讀性。 – rubenvb

0

嘗試創建一個Vector類如

class Vector 
{ 
    float x,y,z ; 
    Vector():x(0),y(0),z(0){} 
    Vector(float x_,float y_, float z_):x(x_),y(y_),z(z_){} 
    Vector(const Vector& copyfrom) 
    { 
    this->x=copyfrom.x;this->y=copyfrom.y;this->z=copyfrom.z; 
    } 
    friend Vector operator+ <> (const Vector& a,const Vector& b) 
    { 
    Vector temp; 
    temp.x=a.x+b.x;temp.y=a.y+b.y;temp.z=a.z+b.z; 
    return temp; 
} 
} 

一旦你重寫等於運營商,那麼你可以寫一個向量(1,1,1)和向量b (2,2,2)和矢量c = a + b;

+0

沒有理由的朋友,如果你有公共訪問的組件,和一個3組件構造函數。 – juanchopanza

+0

感謝您的注意,您是對的!正確的語法應該是Vector運算符+(const Vector&a,const Vector&b) – macroland