(x、y、z) と方向を持つ 3 次元の 2 つの物理ベクトルがあります。それらに対していくつかの操作を行いたいです。しかし、いくつか質問があります。
このベクトルを c++ でどのように表現すればよいですか? つまり、クラスの下に書きましたが、方向を表す方法がわかりませんか?
class vector_ { float x,y,z ; }
2 つのベクトルの加算を計算するにはどうすればよいですか?
(x、y、z) と方向を持つ 3 次元の 2 つの物理ベクトルがあります。それらに対していくつかの操作を行いたいです。しかし、いくつか質問があります。
このベクトルを c++ でどのように表現すればよいですか? つまり、クラスの下に書きましたが、方向を表す方法がわかりませんか?
class vector_ {
float x,y,z ;
}
2 つのベクトルの加算を計算するにはどうすればよいですか?
学生時代の数学を思い出すことができるのと同じくらい、ベクトルの方向はその価値のしるしにすぎません。
1Dの場合、これら2つの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の例を参照してください
3D ベクトル クラスに提供する必要があるものがいくつかあります。
項目番号6を使用すると、2つのベクトル間の角度を取得できます。これにより、質問で言及した「方向」が得られると思われます。足し算、引き算、掛け算、割り算を非メンバー演算子+, -, *
andとして提供するのが通例/
です。ただし、ベクトルの場合、少なくとも 2 つの一般的に使用される乗算演算 (項目 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
オンラインで見つけたサンプルの 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
}
}
次のような 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;
}
}
equal 演算子をオーバーライドすると、Vector a(1,1,1) and Vector b(2,2,2) and Vector c=a+b; と記述できます。