AxisVector.cpp

#include "AxisVector.h"


#include "Matrix.h"


using namespace Robotics;
using namespace System;
using namespace System::Diagnostics;


/// 成分から生成する [ Constructor ]
AxisVector::AxisVector( double x, double y, double z ) :
    Vector( DefaultDimension )
{
    this[ 1 ] = x;
    this[ 2 ] = y;
    this[ 3 ] = z;

    Debug::Assert( IsUnitVector( Precision ), "単位ベクトルである" );
}

/// ベクトルから生成する(次元数を確認するために、オーバーライドしている) [ Constructor ]
AxisVector::AxisVector( Vector^ vector ) :
    Vector( vector )
{
    Debug::Assert( Dimension == DefaultDimension, "既定の次元である" );
    Debug::Assert( IsUnitVector( Precision ), "単位ベクトルである" );
}

/// XMLから生成する [ Constructor ]
AxisVector::AxisVector( System::Xml::XmlElement^ element ) :
    Vector( DefaultDimension )
{
    Debug::Assert( element != nullptr, "有効な要素である" );


    // 属性から設定する
    this[ 1 ] = Double::Parse( element->GetAttribute( "x" ) );
    this[ 2 ] = Double::Parse( element->GetAttribute( "y" ) );
    this[ 3 ] = Double::Parse( element->GetAttribute( "z" ) );

    Debug::Assert( IsUnitVector( Precision ), "単位ベクトルである" );
}


/// 生成する
AxisVector^ AxisVector::Create( System::Xml::XmlElement^ element )
{
    Xml::XmlElement^ node = element[ "axisVector" ];

    if( node == nullptr )
    {
        // 要素が存在しないならば、ヌルを返す
        return nullptr;
    }


    // 生成して返す
    return gcnew AxisVector( node );
}


/// 逆ベクトルを返す [ Operator Overloading ]
AxisVector^ AxisVector::operator-()
{
    return gcnew AxisVector( -1.0 * this );

    /// @note 表記が難解になるため、基本クラスをオーバーライドしていない
}

/// 積 * (軸ベクトルを回転させる) [ Operator Overloading ]
AxisVector^ AxisVector::operator*( Matrix^ rotationMatrix, AxisVector^ axisVector )
{
    // ベクトルにキャストする
    Vector^ vector = safe_cast< Vector^ >( axisVector );

    // ... 行列とベクトルの積として求める
    AxisVector^ result = gcnew AxisVector( rotationMatrix * vector );
    return result;
}


/// インスタンスの説明を文字列で返す
String^ AxisVector::ToString()
{
    return String::Format( "{0:0.000} {1:0.000} {2:0.000}", X, Y, Z );
}