/*---------------------------------------------------------------------------* Project: Horizon File: math_Vector2.ipp Copyright (C)2009-2010 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Revision: 17995 $ *---------------------------------------------------------------------------*/ namespace nn { namespace math { /* ------------------------------------------------------------------------ VEC2 ------------------------------------------------------------------------ */ /*! @name ベクトル @{ */ /*!--------------------------------------------------------------------------* @brief ベクトルがゼロベクトルかどうか判定します。 @param[in] p 判定対象のベクトルへのポインタ。 @return p がゼロベクトルであれば true そうでなければ false を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE bool VEC2IsZero(const VEC2* p) { return p->x == 0.f && p->y == 0.f; } /*!--------------------------------------------------------------------------* @brief 2つのベクトルのそれぞれの成分の最大値から構成されるベクトルを作成します。 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p1, p2 と同じベクトルを指していても構いません。 @param[in] p1 対象のベクトル1へのポインタ。 @param[in] p2 対象のベクトル2へのポインタ。 @return pOut を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE VEC2* VEC2Maximize(VEC2* pOut, const VEC2* p1, const VEC2* p2) { pOut->x = (p1->x > p2->x) ? p1->x : p2->x; pOut->y = (p1->y > p2->y) ? p1->y : p2->y; return pOut; } /*!--------------------------------------------------------------------------* @brief 2つのベクトルのそれぞれの成分の最小値から構成されるベクトルを作成します。 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p1, p2 と同じベクトルを指していても構いません。 @param[in] p1 対象のベクトル1へのポインタ。 @param[in] p2 対象のベクトル2へのポインタ。 @return pOut を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE VEC2* VEC2Minimize(VEC2* pOut, const VEC2* p1, const VEC2* p2) { pOut->x = (p1->x < p2->x) ? p1->x : p2->x; pOut->y = (p1->y < p2->y) ? p1->y : p2->y; return pOut; } /*!--------------------------------------------------------------------------* @brief ベクトルを正規化します @param[out] pOut 計算結果を受け取るバッファへのポインタ。p と同じベクトルを指していても構いません。 @param[in] p 対象のベクトル1へのポインタ。 @return pOut を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE VEC2* VEC2Normalize(VEC2* pOut, const VEC2* p) { (void)VEC2Scale(pOut, p, FrSqrt(p->x * p->x + p->y * p->y)); return pOut; } /*!--------------------------------------------------------------------------* @brief ベクトルを正規化します 正規化に失敗した場合は指定されたベクトルを設定します。 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p と同じベクトルを指していても構いません。 @param[in] p 対象のベクトル1へのポインタ。 @param[in] alt 正規化に失敗した場合に設定するベクトル @return pOut を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE VEC2* VEC2SafeNormalize(VEC2* pOut, const VEC2* p, const VEC2& alt) { NN_NULL_ASSERT(pOut); NN_NULL_ASSERT(p); f32 mag = (p->x * p->x) + (p->y * p->y); if (mag == 0) { *pOut = alt; return pOut; } (void)VEC2Scale(pOut, p, FrSqrt(mag)); return pOut; } /*! @} */ } // namespace math } // namespace nn