1

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

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

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

4

4 回答 4

1

据我所知,我在学生时代的数学 - 向量方向只是其值的标志:

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

{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 示例

于 2012-10-13T12:34:53.120 回答
1

您应该为 3D 矢量类提供一些东西:

  1. 默认构造
  2. 从组件构建
  3. 访问单个组件(也可能在非笛卡尔表示中)
  4. 向量-向量加减法
  5. 标量乘法或“缩放”
  6. 向量-向量标量或点积
  7. vector-vector 向量或叉积
  8. “大小”或“长度”

第 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
于 2012-10-13T15:29:42.823 回答
0

您可以尝试使用在线找到的示例 C++ 几何矢量类,它具有创建和修改矢量以及对其执行各种操作所需的所有必要功能。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
 }
}
于 2012-10-13T12:13:58.107 回答
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;
 }
}

一旦覆盖了等号运算符,就可以编写 Vector a(1,1,1) and Vector b(2,2,2) and Vector c=a+b;

于 2012-10-13T12:39:16.197 回答