1/*---------------------------------------------------------------------------*
2  Project:  Horizon
3  File:     math_Vector2.ipp
4
5  Copyright (C)2009-2010 Nintendo Co., Ltd.  All rights reserved.
6
7  These coded instructions, statements, and computer programs contain
8  proprietary information of Nintendo of America Inc. and/or Nintendo
9  Company Ltd., and are protected by Federal copyright law.  They may
10  not be disclosed to third parties or copied or duplicated in any form,
11  in whole or in part, without the prior written consent of Nintendo.
12
13  $Revision: 17995 $
14 *---------------------------------------------------------------------------*/
15
16namespace nn {
17namespace math {
18
19/* ------------------------------------------------------------------------
20        VEC2
21   ------------------------------------------------------------------------ */
22
23/*!
24    @name    ベクトル
25    @{
26*/
27
28/*!--------------------------------------------------------------------------*
29  @brief        ベクトルがゼロベクトルかどうか判定します。
30
31  @param[in]    p    判定対象のベクトルへのポインタ。
32
33  @return       p がゼロベクトルであれば true そうでなければ false を返します。
34 *---------------------------------------------------------------------------*/
35NN_MATH_INLINE bool
36VEC2IsZero(const VEC2* p)
37{
38    return p->x == 0.f && p->y == 0.f;
39}
40
41/*!--------------------------------------------------------------------------*
42  @brief        2つのベクトルのそれぞれの成分の最大値から構成されるベクトルを作成します。
43
44  @param[out]   pOut  計算結果を受け取るバッファへのポインタ。p1, p2 と同じベクトルを指していても構いません。
45  @param[in]    p1    対象のベクトル1へのポインタ。
46  @param[in]    p2    対象のベクトル2へのポインタ。
47
48  @return       pOut を返します。
49 *---------------------------------------------------------------------------*/
50NN_MATH_INLINE VEC2*
51VEC2Maximize(VEC2* pOut, const VEC2* p1, const VEC2* p2)
52{
53    pOut->x = (p1->x > p2->x) ? p1->x : p2->x;
54    pOut->y = (p1->y > p2->y) ? p1->y : p2->y;
55
56    return pOut;
57}
58
59
60/*!--------------------------------------------------------------------------*
61  @brief        2つのベクトルのそれぞれの成分の最小値から構成されるベクトルを作成します。
62
63  @param[out]   pOut  計算結果を受け取るバッファへのポインタ。p1, p2 と同じベクトルを指していても構いません。
64  @param[in]    p1    対象のベクトル1へのポインタ。
65  @param[in]    p2    対象のベクトル2へのポインタ。
66
67  @return       pOut を返します。
68 *---------------------------------------------------------------------------*/
69NN_MATH_INLINE VEC2*
70VEC2Minimize(VEC2* pOut, const VEC2* p1, const VEC2* p2)
71{
72    pOut->x = (p1->x < p2->x) ? p1->x : p2->x;
73    pOut->y = (p1->y < p2->y) ? p1->y : p2->y;
74
75    return pOut;
76}
77
78
79/*!--------------------------------------------------------------------------*
80  @brief        ベクトルを正規化します
81
82  @param[out]   pOut  計算結果を受け取るバッファへのポインタ。p と同じベクトルを指していても構いません。
83  @param[in]    p     対象のベクトル1へのポインタ。
84
85  @return       pOut を返します。
86 *---------------------------------------------------------------------------*/
87NN_MATH_INLINE VEC2*
88VEC2Normalize(VEC2* pOut, const VEC2* p)
89{
90    (void)VEC2Scale(pOut, p, FrSqrt(p->x * p->x + p->y * p->y));
91
92    return pOut;
93}
94
95/*!--------------------------------------------------------------------------*
96  @brief        ベクトルを正規化します
97                正規化に失敗した場合は指定されたベクトルを設定します。
98
99  @param[out]   pOut  計算結果を受け取るバッファへのポインタ。p と同じベクトルを指していても構いません。
100  @param[in]    p     対象のベクトル1へのポインタ。
101  @param[in]    alt   正規化に失敗した場合に設定するベクトル
102
103  @return       pOut を返します。
104 *---------------------------------------------------------------------------*/
105NN_MATH_INLINE VEC2*
106VEC2SafeNormalize(VEC2* pOut, const VEC2* p, const VEC2& alt)
107{
108    NN_NULL_ASSERT(pOut);
109    NN_NULL_ASSERT(p);
110
111    f32 mag = (p->x * p->x) + (p->y * p->y);
112
113    if (mag == 0)
114    {
115        *pOut = alt;
116
117        return pOut;
118    }
119
120    (void)VEC2Scale(pOut, p, FrSqrt(mag));
121
122    return pOut;
123}
124
125/*!
126    @}
127*/
128
129}  // namespace math
130}  // namespace nn
131