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