3

それぞれx、y、zの3つのdoubleのセットを表すVecクラスを作成しようとしています。私がやりたいのは、スカラーにベクトルを掛けて、各コンポーネントを掛けられるようにすることです。

ベクトルをスカラーで多重化すると機能するようになりましたが、逆の場合は機能しませんでした。たとえば、次のように機能します。

Vec a = Vec(1.0, 1.0, 1.0);
Vec b = a * 2.0;

しかし、スカラーにベクトルを掛けようとすると、うまくいきません。理想的には、コマンドは次のようになります。

Vec a = Vec(1.0, 1.0, 1.0);
Vec b = 2.0 * a;

これまでに行ったコードは次のとおりです。

#include "Vec.h"
#include <limits>
#include <cmath>
#include "constants.h"
#include <iostream>
#include <string>

double Vec::angle( const Vec & vec) {
    return acos((this->dot(vec))/(this->mag() * mag()));
}

double Vec::angle_d(const Vec & vec) {
    return (angle(vec) * _PI / 180.0);
}

double Vec::angle_r(const Vec & vec)    {
    return this->angle(vec);
}

Vec Vec::cross( const Vec& vec) {
    return Vec( (y * vec.z - z * vec.y),
            (z * vec.x - x * vec.z),
            (x * vec.y - y * vec.x));
}

double Vec::dot( const Vec & vec)   {
    return (x * vec.x + y * vec.y + z * vec.z);
}

double Vec::mag()   {
    return std::sqrt(x*x + y*y + z*z);
}

Vec Vec::operator=(const Vec& rhs)  {
    return Vec(rhs);
}

Vec Vec::operator*(const Vec& rhs)  {
    return Vec( x * rhs.x, y * rhs.y, z * rhs.z);
}

Vec Vec::operator*(const double rhs)    {
    return Vec(rhs * x, rhs * y, rhs * z);
}

Vec::Vec()  : 
    x(std::numeric_limits<double>::signaling_NaN()),
    y(std::numeric_limits<double>::signaling_NaN()),
    z(std::numeric_limits<double>::signaling_NaN()) {   }

Vec::Vec( double c) :
    x(c), y(c), z(c)    {}

Vec::Vec(const Vec & vec)   : 
    x(vec.x), y(vec.y), z(vec.z)    {   }

Vec::Vec(double a, double b, double c)  
    : x(a), y(b), z(c)  {   }
4

2 に答える 2

4

doubleとVecの2つの引数を取るグローバル演算子が必要です。これは、既にリストした演算子を呼び出すことで簡単に実装できます。

inline Vec operator*(double s, const Vec& v) {
    return v * s;
}
于 2012-08-02T04:26:22.940 に答える
3

新しいグローバル演算子を作成してみてください。

Vec operator*(int i, const Vec& rhs) {
    return Vec(i * rhs.x, i * rhs.y, i * rhs.z);
}
于 2012-08-02T04:22:02.787 に答える