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 );
}