物理矢量表示

时间:2012-10-13 12:10:39

标签: c++ data-structures

我有三个带有(x,y,z)和方向的物理向量。我想对它们做一些操作。但我有一些问题:

  • 我应该如何用c ++表示这个向量?换句话说,我写了下面的课,但我不知道如何在其中表示方向?

     class vector_ {
          float x,y,z ;
     }
    
  • 如何计算两个向量的加法? image

4 个答案:

答案 0 :(得分:1)

我可以回想起我学年时的数学 - 向量方向只是其价值观的标志:

对于1D情况,这两个1D向量具有相同的值但方向相反:

{11.21}  {-11.21} 

对于2D矢量,您有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 :: tuple http://en.cppreference.com/w/cpp/utility/tuple

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

添加使用std::transform http://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 :(得分:1)

您应该为3D矢量类提供一些内容:

  1. 默认构造
  2. 从组件构建
  3. 访问各个组件(也可能是非笛卡尔表示)
  4. 矢量矢量加法和减法
  5. 标量乘法或“缩放”<​​/ li>
  6. vector-vector Scalar或dot product
  7. vector-vector Vector或cross product
  8. “幅度”或“长度”
  9. 项目编号6允许您获取两个向量之间的角度,这可能会为您提供您在问题中提到的“方向”。习惯上提供加法,减法,乘法和除法作为非成员运算符+, -, */。然而,在向量的情况下,存在至少两个常用的乘法运算(项目6和7),它们是不同的并且具有不同的返回值。因此它们通常作为非成员函数提供。通常也会为上面的某些操作提供“增量”版本(+=-=*=进行标量乘法。所以,你的矢量类可能看起来像这样:

    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
    

答案 2 :(得分:0)

您可以尝试使用在线找到的示例C ++ Geometric Vector类,它具有创建和修改向量以及对它们执行各种操作所需的所有必要功能。 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
 }
}

答案 3 :(得分: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;
 }
}

一旦你覆盖了等于运算符,那么你可以写向量a(1,1,1)和向量b(2,2,2)和向量c = a + b;