1#!/usr/bin/perl
2
3use POSIX;
4
5$handle = STDOUT;
6$size_atan = 128;
7
8print $handle <<ENDDOC;
9/*---------------------------------------------------------------------------*
10  Project:  TwlSDK - FX -
11  File:     fx_atan.c
12
13  Copyright 2003-2008 Nintendo.  All rights reserved.
14
15  These coded instructions, statements, and computer programs contain
16  proprietary information of Nintendo of America Inc. and/or Nintendo
17  Company Ltd., and are protected by Federal copyright law.  They may
18  not be disclosed to third parties or copied or duplicated in any form,
19  in whole or in part, without the prior written consent of Nintendo.
20
21 *---------------------------------------------------------------------------*/
22
23//margin of error
24
25#include <nitro/fx/fx_trig.h>
26#include <nitro/fx/fx_cp.h>
27#include <nitro/fx/fx_const.h>
28
29const fx16 FX_AtanTable_[$size_atan] = {
30ENDDOC
31
32    for ($i = 0; $i < $size_atan; ++$i) {
33        my $val = sprintf("%.0f", atan2($i / $size_atan, 1.0) * 4096);
34        if ($i == $size_atan - 1) {
35            printf $handle "    (fx16)0x%04x           // %.3f\n", $val, ($val / 4096.0);
36        } else {
37            printf $handle "    (fx16)0x%04x,          // %.3f\n", $val, ($val / 4096.0);
38        }
39    }
40
41
42    print $handle "};\n";
43    print $handle "\n";
44
45print $handle <<ENDDOC;
46fx16 FX_Atan(fx32 x)
47{
48    if (x >= 0)
49    {
50        if (x > FX32_ONE)
51        {
52            return (fx16)(6434 - FX_AtanTable_[FX_Inv(x) / (4096 / $size_atan)]);
53        }
54        else if (x < FX32_ONE)
55        {
56            return FX_AtanTable_[x / (4096 / $size_atan)];
57        }
58        else
59        {
60            return (fx16)3217;
61        }
62    }
63    else
64    {
65        if (x < -FX32_ONE)
66        {
67            return (fx16)(-6434 + FX_AtanTable_[FX_Inv(-x) / (4096 / $size_atan)]);
68        }
69        else if (x > -FX32_ONE)
70        {
71            return (fx16)-FX_AtanTable_[-x / (4096 / $size_atan)];
72        }
73        else
74        {
75            return (fx16)-3217;
76        }
77    }
78}
79
80fx16 FX_Atan2(fx32 y, fx32 x)
81{
82    fx32 a, b, c;
83    int sgn;
84
85    if (y > 0)
86    {
87        if (x > 0)
88        {
89            if (x > y)
90            {
91                a = y;
92                b = x;
93                c = 0;
94                sgn = 1;
95            }
96            else if (x < y)
97            {
98                a = x;
99                b = y;
100                c = 6434;
101                sgn = 0;
102            }
103            else
104            {
105                return (fx16)3217;
106            }
107        }
108        else if (x < 0)
109        {
110            x = -x;
111            if (x < y)
112            {
113                a = x;
114                b = y;
115                c = 6434;
116                sgn = 1;
117            }
118            else if (x > y)
119            {
120                a = y;
121                b = x;
122                c = 12868;
123                sgn = 0;
124            }
125            else
126            {
127                return (fx16)9651;
128            }
129        }
130        else
131        {
132            return (fx16)6434;
133        }
134    }
135    else if (y < 0)
136    {
137        y = -y;
138        if (x < 0)
139        {
140            x = -x;
141            if (x > y)
142            {
143                a = y;
144                b = x;
145                c = -12868;
146                sgn = 1;
147            }
148            else if (x < y)
149            {
150                a = x;
151                b = y;
152                c = -6434;
153                sgn = 0;
154            }
155            else
156            {
157                return (fx16)-9651;
158            }
159        }
160        else if (x > 0)
161        {
162            if (x < y)
163            {
164                a = x;
165                b = y;
166                c = -6434;
167                sgn = 1;
168            }
169            else if (x > y)
170            {
171                a = y;
172                b = x;
173                c = 0;
174                sgn = 0;
175            }
176            else
177            {
178                return (fx16)-3217;
179            }
180        }
181        else
182        {
183            return (fx16)-6434;
184        }
185    }
186    else // y = 0
187    {
188        if (x >= 0)
189        {
190            return 0;
191        }
192        else
193        {
194            return (fx16)12868;
195        }
196    }
197
198    if (b == 0)
199        return 0;
200    if (sgn)
201        return (fx16)(c + FX_AtanTable_[FX_Div(a, b) / (4096 / $size_atan)]);
202    else
203        return (fx16)(c - FX_AtanTable_[FX_Div(a, b) / (4096 / $size_atan)]);
204}
205ENDDOC
206