PositionVector.h

#pragma once


#include "Vector.h" // < BaseClass >


namespace Robotics
{
    /// 位置ベクトル (3次元)
    [ System::ComponentModel::TypeConverter( System::ComponentModel::ExpandableObjectConverter::typeid ) ]  // 拡張可能なオブジェクト
    public ref class PositionVector : public Vector
    {
    // Construction --------------------------------------------------------
    public:
        PositionVector();
        PositionVector( double x, double y, double z );
        PositionVector( System::Decimal x, System::Decimal y, System::Decimal z );

        explicit PositionVector( Vector^ vector );
        explicit PositionVector( System::Xml::XmlElement^ element );


    // Operation -----------------------------------------------------------
    public:
        bool IsInOrigin() { return IsZeroVector(); }

        virtual System::String^ ToString() override;
        System::Xml::XmlElement^ ToXml( System::Xml::XmlDocument^ document );


    // Event ---------------------------------------------------------------
    public:
        event System::EventHandler^ ValueChanged;    ///< 値の変更イベント


    // Overload ------------------------------------------------------------
    public:
        static PositionVector^ operator+( PositionVector^ left, PositionVector^ right );
        static PositionVector^ operator+( PositionVector^ positionVector, Vector^ vector );
        static PositionVector^ operator+( Vector^ vector, PositionVector^ positionVector );

        static PositionVector^ operator-( PositionVector^ left, PositionVector^ right );
        static PositionVector^ operator-( PositionVector^ positionVector, Vector^ vector );

        static PositionVector^ operator*( PositionVector^ positionVector, double scalar );
        static PositionVector^ operator*( double scalar, PositionVector^ positionVector );

        static PositionVector^ operator*( Matrix^ rotationMatrix, PositionVector^ positionVector );

        static PositionVector^ operator/( PositionVector^ positionVector, double scalar );


    // Attribute ===========================================================
    private:

    // static
        literal int DefaultDimension = 3;      ///< 既定の次元数


    // Property ------------------------------------------------------------
    public:
        /// X方向の位置
        property double X
        {
            double get()
            {
                return this[ 1 ];
            }
            void set( double value );
        }

        /// Y方向の位置
        property double Y
        {
            double get()
            {
                return this[ 2 ];
            }
            void set( double value );
        }

        /// Z方向の位置
        property double Z
        {
            double get()
            {
                return this[ 3 ];
            }
            void set( double value );
        }
    };
}