Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit d36535c

Browse files
authored
Merge pull request #27 from ndsl7109256/shrinkSineTable
Replace sine table with 5th order approximation
2 parents 67b3719 + ef31d46 commit d36535c

File tree

4 files changed

+83
-153
lines changed

4 files changed

+83
-153
lines changed

‎include/twin.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,6 +1042,8 @@ twin_fixed_t twin_cos(twin_angle_t a);
10421042

10431043
twin_fixed_t twin_tan(twin_angle_t a);
10441044

1045+
void twin_sincos(twin_angle_t a, twin_fixed_t *sin, twin_fixed_t *cos);
1046+
10451047
/*
10461048
* widget.c
10471049
*/

‎src/matrix.c‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ twin_point_t _twin_matrix_expand(twin_matrix_t *matrix)
100100
void twin_matrix_rotate(twin_matrix_t *m, twin_angle_t a)
101101
{
102102
twin_matrix_t t;
103-
twin_fixed_t c=twin_cos(a);
104-
twin_fixed_ts=twin_sin(a);
103+
twin_fixed_t c, s;
104+
twin_sincos(a, &s, &c);
105105

106106
t.m[0][0] = c;
107107
t.m[0][1] = s;

‎src/path.c‎

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,13 @@ void twin_path_draw(twin_path_t *path, twin_fixed_t x, twin_fixed_t y)
134134
_twin_matrix_y(&path->state.matrix, x, y));
135135
}
136136

137+
static void twin_path_draw_polar(twin_path_t *path, twin_angle_t deg)
138+
{
139+
twin_fixed_t s, c;
140+
twin_sincos(deg, &s, &c);
141+
twin_path_draw(path, c, s);
142+
}
143+
137144
void twin_path_rdraw(twin_path_t *path, twin_fixed_t dx, twin_fixed_t dy)
138145
{
139146
twin_spoint_t here = _twin_path_current_spoint(path);
@@ -218,14 +225,13 @@ void twin_path_arc(twin_path_t *path,
218225
twin_angle_t last = (start + extent - inc + epsilon) & ~(step - 1);
219226

220227
if (first != start)
221-
twin_path_draw(path, twin_cos(start), twin_sin(start));
228+
twin_path_draw_polar(path, start);
222229

223230
for (twin_angle_t a = first; a != last; a += inc)
224-
twin_path_draw(path, twin_cos(a), twin_sin(a));
231+
twin_path_draw_polar(path, a);
225232

226233
if (last != start + extent)
227-
twin_path_draw(path, twin_cos(start + extent),
228-
twin_sin(start + extent));
234+
twin_path_draw_polar(path, start + extent);
229235

230236
twin_path_set_matrix(path, save);
231237
}

‎src/trig.c‎

Lines changed: 69 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -6,167 +6,28 @@
66

77
#include "twin_private.h"
88

9-
#define TWIN_LOG2_SIN 10
10-
11-
/*
12-
* construction:
13-
int s = 10; for (int i = 0; i < (1 << s); i++) {
14-
if (i % 8 == 0) printf ("\n ");
15-
printf (" 0x%04x,", floor (sin(pi/2 * i / (1 << s)) * 2**16 + 0.5));
16-
}
17-
*/
18-
19-
static const uint16_t _twin_sin_table[1 << TWIN_LOG2_SIN] = {
20-
0x0000, 0x0065, 0x00c9, 0x012e, 0x0192, 0x01f7, 0x025b, 0x02c0, 0x0324,
21-
0x0389, 0x03ed, 0x0452, 0x04b6, 0x051b, 0x057f, 0x05e4, 0x0648, 0x06ad,
22-
0x0711, 0x0776, 0x07da, 0x083f, 0x08a3, 0x0908, 0x096c, 0x09d1, 0x0a35,
23-
0x0a9a, 0x0afe, 0x0b62, 0x0bc7, 0x0c2b, 0x0c90, 0x0cf4, 0x0d59, 0x0dbd,
24-
0x0e21, 0x0e86, 0x0eea, 0x0f4e, 0x0fb3, 0x1017, 0x107b, 0x10e0, 0x1144,
25-
0x11a8, 0x120d, 0x1271, 0x12d5, 0x1339, 0x139e, 0x1402, 0x1466, 0x14ca,
26-
0x152e, 0x1593, 0x15f7, 0x165b, 0x16bf, 0x1723, 0x1787, 0x17eb, 0x1850,
27-
0x18b4, 0x1918, 0x197c, 0x19e0, 0x1a44, 0x1aa8, 0x1b0c, 0x1b70, 0x1bd4,
28-
0x1c38, 0x1c9b, 0x1cff, 0x1d63, 0x1dc7, 0x1e2b, 0x1e8f, 0x1ef3, 0x1f56,
29-
0x1fba, 0x201e, 0x2082, 0x20e5, 0x2149, 0x21ad, 0x2210, 0x2274, 0x22d7,
30-
0x233b, 0x239f, 0x2402, 0x2466, 0x24c9, 0x252d, 0x2590, 0x25f4, 0x2657,
31-
0x26ba, 0x271e, 0x2781, 0x27e4, 0x2848, 0x28ab, 0x290e, 0x2971, 0x29d5,
32-
0x2a38, 0x2a9b, 0x2afe, 0x2b61, 0x2bc4, 0x2c27, 0x2c8a, 0x2ced, 0x2d50,
33-
0x2db3, 0x2e16, 0x2e79, 0x2edc, 0x2f3f, 0x2fa1, 0x3004, 0x3067, 0x30ca,
34-
0x312c, 0x318f, 0x31f1, 0x3254, 0x32b7, 0x3319, 0x337c, 0x33de, 0x3440,
35-
0x34a3, 0x3505, 0x3568, 0x35ca, 0x362c, 0x368e, 0x36f1, 0x3753, 0x37b5,
36-
0x3817, 0x3879, 0x38db, 0x393d, 0x399f, 0x3a01, 0x3a63, 0x3ac5, 0x3b27,
37-
0x3b88, 0x3bea, 0x3c4c, 0x3cae, 0x3d0f, 0x3d71, 0x3dd2, 0x3e34, 0x3e95,
38-
0x3ef7, 0x3f58, 0x3fba, 0x401b, 0x407c, 0x40de, 0x413f, 0x41a0, 0x4201,
39-
0x4262, 0x42c3, 0x4324, 0x4385, 0x43e6, 0x4447, 0x44a8, 0x4509, 0x456a,
40-
0x45cb, 0x462b, 0x468c, 0x46ec, 0x474d, 0x47ae, 0x480e, 0x486f, 0x48cf,
41-
0x492f, 0x4990, 0x49f0, 0x4a50, 0x4ab0, 0x4b10, 0x4b71, 0x4bd1, 0x4c31,
42-
0x4c90, 0x4cf0, 0x4d50, 0x4db0, 0x4e10, 0x4e70, 0x4ecf, 0x4f2f, 0x4f8e,
43-
0x4fee, 0x504d, 0x50ad, 0x510c, 0x516c, 0x51cb, 0x522a, 0x5289, 0x52e8,
44-
0x5348, 0x53a7, 0x5406, 0x5464, 0x54c3, 0x5522, 0x5581, 0x55e0, 0x563e,
45-
0x569d, 0x56fc, 0x575a, 0x57b9, 0x5817, 0x5875, 0x58d4, 0x5932, 0x5990,
46-
0x59ee, 0x5a4c, 0x5aaa, 0x5b08, 0x5b66, 0x5bc4, 0x5c22, 0x5c80, 0x5cde,
47-
0x5d3b, 0x5d99, 0x5df6, 0x5e54, 0x5eb1, 0x5f0f, 0x5f6c, 0x5fc9, 0x6026,
48-
0x6084, 0x60e1, 0x613e, 0x619b, 0x61f8, 0x6254, 0x62b1, 0x630e, 0x636b,
49-
0x63c7, 0x6424, 0x6480, 0x64dd, 0x6539, 0x6595, 0x65f2, 0x664e, 0x66aa,
50-
0x6706, 0x6762, 0x67be, 0x681a, 0x6876, 0x68d1, 0x692d, 0x6989, 0x69e4,
51-
0x6a40, 0x6a9b, 0x6af6, 0x6b52, 0x6bad, 0x6c08, 0x6c63, 0x6cbe, 0x6d19,
52-
0x6d74, 0x6dcf, 0x6e2a, 0x6e85, 0x6edf, 0x6f3a, 0x6f94, 0x6fef, 0x7049,
53-
0x70a3, 0x70fe, 0x7158, 0x71b2, 0x720c, 0x7266, 0x72c0, 0x731a, 0x7373,
54-
0x73cd, 0x7427, 0x7480, 0x74da, 0x7533, 0x758d, 0x75e6, 0x763f, 0x7698,
55-
0x76f1, 0x774a, 0x77a3, 0x77fc, 0x7855, 0x78ad, 0x7906, 0x795f, 0x79b7,
56-
0x7a10, 0x7a68, 0x7ac0, 0x7b18, 0x7b70, 0x7bc8, 0x7c20, 0x7c78, 0x7cd0,
57-
0x7d28, 0x7d7f, 0x7dd7, 0x7e2f, 0x7e86, 0x7edd, 0x7f35, 0x7f8c, 0x7fe3,
58-
0x803a, 0x8091, 0x80e8, 0x813f, 0x8195, 0x81ec, 0x8243, 0x8299, 0x82f0,
59-
0x8346, 0x839c, 0x83f2, 0x8449, 0x849f, 0x84f5, 0x854a, 0x85a0, 0x85f6,
60-
0x864c, 0x86a1, 0x86f7, 0x874c, 0x87a1, 0x87f6, 0x884c, 0x88a1, 0x88f6,
61-
0x894a, 0x899f, 0x89f4, 0x8a49, 0x8a9d, 0x8af2, 0x8b46, 0x8b9a, 0x8bef,
62-
0x8c43, 0x8c97, 0x8ceb, 0x8d3f, 0x8d93, 0x8de6, 0x8e3a, 0x8e8d, 0x8ee1,
63-
0x8f34, 0x8f88, 0x8fdb, 0x902e, 0x9081, 0x90d4, 0x9127, 0x9179, 0x91cc,
64-
0x921f, 0x9271, 0x92c4, 0x9316, 0x9368, 0x93ba, 0x940c, 0x945e, 0x94b0,
65-
0x9502, 0x9554, 0x95a5, 0x95f7, 0x9648, 0x969a, 0x96eb, 0x973c, 0x978d,
66-
0x97de, 0x982f, 0x9880, 0x98d0, 0x9921, 0x9972, 0x99c2, 0x9a12, 0x9a63,
67-
0x9ab3, 0x9b03, 0x9b53, 0x9ba3, 0x9bf2, 0x9c42, 0x9c92, 0x9ce1, 0x9d31,
68-
0x9d80, 0x9dcf, 0x9e1e, 0x9e6d, 0x9ebc, 0x9f0b, 0x9f5a, 0x9fa8, 0x9ff7,
69-
0xa045, 0xa094, 0xa0e2, 0xa130, 0xa17e, 0xa1cc, 0xa21a, 0xa268, 0xa2b5,
70-
0xa303, 0xa350, 0xa39e, 0xa3eb, 0xa438, 0xa485, 0xa4d2, 0xa51f, 0xa56c,
71-
0xa5b8, 0xa605, 0xa652, 0xa69e, 0xa6ea, 0xa736, 0xa782, 0xa7ce, 0xa81a,
72-
0xa866, 0xa8b2, 0xa8fd, 0xa949, 0xa994, 0xa9df, 0xaa2a, 0xaa76, 0xaac1,
73-
0xab0b, 0xab56, 0xaba1, 0xabeb, 0xac36, 0xac80, 0xacca, 0xad14, 0xad5e,
74-
0xada8, 0xadf2, 0xae3c, 0xae85, 0xaecf, 0xaf18, 0xaf62, 0xafab, 0xaff4,
75-
0xb03d, 0xb086, 0xb0ce, 0xb117, 0xb160, 0xb1a8, 0xb1f0, 0xb239, 0xb281,
76-
0xb2c9, 0xb311, 0xb358, 0xb3a0, 0xb3e8, 0xb42f, 0xb477, 0xb4be, 0xb505,
77-
0xb54c, 0xb593, 0xb5da, 0xb620, 0xb667, 0xb6ad, 0xb6f4, 0xb73a, 0xb780,
78-
0xb7c6, 0xb80c, 0xb852, 0xb898, 0xb8dd, 0xb923, 0xb968, 0xb9ae, 0xb9f3,
79-
0xba38, 0xba7d, 0xbac1, 0xbb06, 0xbb4b, 0xbb8f, 0xbbd4, 0xbc18, 0xbc5c,
80-
0xbca0, 0xbce4, 0xbd28, 0xbd6b, 0xbdaf, 0xbdf2, 0xbe36, 0xbe79, 0xbebc,
81-
0xbeff, 0xbf42, 0xbf85, 0xbfc7, 0xc00a, 0xc04c, 0xc08f, 0xc0d1, 0xc113,
82-
0xc155, 0xc197, 0xc1d8, 0xc21a, 0xc25c, 0xc29d, 0xc2de, 0xc31f, 0xc360,
83-
0xc3a1, 0xc3e2, 0xc423, 0xc463, 0xc4a4, 0xc4e4, 0xc524, 0xc564, 0xc5a4,
84-
0xc5e4, 0xc624, 0xc663, 0xc6a3, 0xc6e2, 0xc721, 0xc761, 0xc7a0, 0xc7de,
85-
0xc81d, 0xc85c, 0xc89a, 0xc8d9, 0xc917, 0xc955, 0xc993, 0xc9d1, 0xca0f,
86-
0xca4d, 0xca8a, 0xcac7, 0xcb05, 0xcb42, 0xcb7f, 0xcbbc, 0xcbf9, 0xcc35,
87-
0xcc72, 0xccae, 0xcceb, 0xcd27, 0xcd63, 0xcd9f, 0xcddb, 0xce17, 0xce52,
88-
0xce8e, 0xcec9, 0xcf04, 0xcf3f, 0xcf7a, 0xcfb5, 0xcff0, 0xd02a, 0xd065,
89-
0xd09f, 0xd0d9, 0xd113, 0xd14d, 0xd187, 0xd1c1, 0xd1fa, 0xd234, 0xd26d,
90-
0xd2a6, 0xd2df, 0xd318, 0xd351, 0xd38a, 0xd3c2, 0xd3fb, 0xd433, 0xd46b,
91-
0xd4a3, 0xd4db, 0xd513, 0xd54b, 0xd582, 0xd5ba, 0xd5f1, 0xd628, 0xd65f,
92-
0xd696, 0xd6cd, 0xd703, 0xd73a, 0xd770, 0xd7a6, 0xd7dc, 0xd812, 0xd848,
93-
0xd87e, 0xd8b4, 0xd8e9, 0xd91e, 0xd954, 0xd989, 0xd9be, 0xd9f2, 0xda27,
94-
0xda5c, 0xda90, 0xdac4, 0xdaf8, 0xdb2c, 0xdb60, 0xdb94, 0xdbc8, 0xdbfb,
95-
0xdc2f, 0xdc62, 0xdc95, 0xdcc8, 0xdcfb, 0xdd2d, 0xdd60, 0xdd92, 0xddc5,
96-
0xddf7, 0xde29, 0xde5b, 0xde8c, 0xdebe, 0xdef0, 0xdf21, 0xdf52, 0xdf83,
97-
0xdfb4, 0xdfe5, 0xe016, 0xe046, 0xe077, 0xe0a7, 0xe0d7, 0xe107, 0xe137,
98-
0xe167, 0xe196, 0xe1c6, 0xe1f5, 0xe224, 0xe253, 0xe282, 0xe2b1, 0xe2df,
99-
0xe30e, 0xe33c, 0xe36b, 0xe399, 0xe3c7, 0xe3f4, 0xe422, 0xe450, 0xe47d,
100-
0xe4aa, 0xe4d7, 0xe504, 0xe531, 0xe55e, 0xe58b, 0xe5b7, 0xe5e3, 0xe610,
101-
0xe63c, 0xe667, 0xe693, 0xe6bf, 0xe6ea, 0xe716, 0xe741, 0xe76c, 0xe797,
102-
0xe7c2, 0xe7ec, 0xe817, 0xe841, 0xe86b, 0xe895, 0xe8bf, 0xe8e9, 0xe913,
103-
0xe93c, 0xe966, 0xe98f, 0xe9b8, 0xe9e1, 0xea0a, 0xea32, 0xea5b, 0xea83,
104-
0xeaab, 0xead4, 0xeafc, 0xeb23, 0xeb4b, 0xeb73, 0xeb9a, 0xebc1, 0xebe8,
105-
0xec0f, 0xec36, 0xec5d, 0xec83, 0xecaa, 0xecd0, 0xecf6, 0xed1c, 0xed42,
106-
0xed68, 0xed8d, 0xedb3, 0xedd8, 0xedfd, 0xee22, 0xee47, 0xee6b, 0xee90,
107-
0xeeb4, 0xeed9, 0xeefd, 0xef21, 0xef45, 0xef68, 0xef8c, 0xefaf, 0xefd2,
108-
0xeff5, 0xf018, 0xf03b, 0xf05e, 0xf080, 0xf0a3, 0xf0c5, 0xf0e7, 0xf109,
109-
0xf12b, 0xf14c, 0xf16e, 0xf18f, 0xf1b1, 0xf1d2, 0xf1f3, 0xf213, 0xf234,
110-
0xf254, 0xf275, 0xf295, 0xf2b5, 0xf2d5, 0xf2f5, 0xf314, 0xf334, 0xf353,
111-
0xf372, 0xf391, 0xf3b0, 0xf3cf, 0xf3ed, 0xf40c, 0xf42a, 0xf448, 0xf466,
112-
0xf484, 0xf4a2, 0xf4bf, 0xf4dd, 0xf4fa, 0xf517, 0xf534, 0xf551, 0xf56e,
113-
0xf58a, 0xf5a6, 0xf5c3, 0xf5df, 0xf5fb, 0xf616, 0xf632, 0xf64e, 0xf669,
114-
0xf684, 0xf69f, 0xf6ba, 0xf6d5, 0xf6ef, 0xf70a, 0xf724, 0xf73e, 0xf758,
115-
0xf772, 0xf78c, 0xf7a5, 0xf7bf, 0xf7d8, 0xf7f1, 0xf80a, 0xf823, 0xf83b,
116-
0xf854, 0xf86c, 0xf885, 0xf89d, 0xf8b4, 0xf8cc, 0xf8e4, 0xf8fb, 0xf913,
117-
0xf92a, 0xf941, 0xf958, 0xf96e, 0xf985, 0xf99b, 0xf9b2, 0xf9c8, 0xf9de,
118-
0xf9f3, 0xfa09, 0xfa1f, 0xfa34, 0xfa49, 0xfa5e, 0xfa73, 0xfa88, 0xfa9c,
119-
0xfab1, 0xfac5, 0xfad9, 0xfaed, 0xfb01, 0xfb15, 0xfb28, 0xfb3c, 0xfb4f,
120-
0xfb62, 0xfb75, 0xfb88, 0xfb9a, 0xfbad, 0xfbbf, 0xfbd1, 0xfbe3, 0xfbf5,
121-
0xfc07, 0xfc18, 0xfc2a, 0xfc3b, 0xfc4c, 0xfc5d, 0xfc6e, 0xfc7f, 0xfc8f,
122-
0xfca0, 0xfcb0, 0xfcc0, 0xfcd0, 0xfcdf, 0xfcef, 0xfcfe, 0xfd0e, 0xfd1d,
123-
0xfd2c, 0xfd3b, 0xfd49, 0xfd58, 0xfd66, 0xfd74, 0xfd83, 0xfd90, 0xfd9e,
124-
0xfdac, 0xfdb9, 0xfdc7, 0xfdd4, 0xfde1, 0xfdee, 0xfdfa, 0xfe07, 0xfe13,
125-
0xfe1f, 0xfe2b, 0xfe37, 0xfe43, 0xfe4f, 0xfe5a, 0xfe66, 0xfe71, 0xfe7c,
126-
0xfe87, 0xfe91, 0xfe9c, 0xfea6, 0xfeb0, 0xfeba, 0xfec4, 0xfece, 0xfed8,
127-
0xfee1, 0xfeeb, 0xfef4, 0xfefd, 0xff06, 0xff0e, 0xff17, 0xff1f, 0xff28,
128-
0xff30, 0xff38, 0xff3f, 0xff47, 0xff4e, 0xff56, 0xff5d, 0xff64, 0xff6b,
129-
0xff71, 0xff78, 0xff7e, 0xff85, 0xff8b, 0xff91, 0xff96, 0xff9c, 0xffa2,
130-
0xffa7, 0xffac, 0xffb1, 0xffb6, 0xffbb, 0xffbf, 0xffc4, 0xffc8, 0xffcc,
131-
0xffd0, 0xffd4, 0xffd7, 0xffdb, 0xffde, 0xffe1, 0xffe4, 0xffe7, 0xffea,
132-
0xffec, 0xffef, 0xfff1, 0xfff3, 0xfff5, 0xfff7, 0xfff8, 0xfffa, 0xfffb,
133-
0xfffc, 0xfffd, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff,
134-
};
135-
1369
/*
13710
* angles are measured from -2048 .. 2048
13811
*/
13912

14013
twin_fixed_t twin_sin(twin_angle_t a)
14114
{
142-
twin_fixed_t sin;
143-
144-
/* limit to [0..360) */
145-
a = a & (TWIN_ANGLE_360 - 1);
146-
/* special case for 90 degrees - no room in table */
147-
if ((a & ~(TWIN_ANGLE_180)) == TWIN_ANGLE_90)
148-
sin = TWIN_FIXED_ONE;
149-
else {
150-
/* mirror second and third quadrant values across y axis */
151-
if (a & TWIN_ANGLE_90)
152-
a = TWIN_ANGLE_180 - a;
153-
sin = _twin_sin_table[a & (TWIN_ANGLE_90 - 1)];
154-
}
155-
/* mirror third and fourth quadrant values across x axis */
156-
if (a & TWIN_ANGLE_180)
157-
sin = -sin;
158-
return sin;
15+
twin_fixed_t sin_val = 0;
16+
twin_sincos(a, &sin_val, NULL);
17+
return sin_val;
15918
}
16019

16120
twin_fixed_t twin_cos(twin_angle_t a)
16221
{
163-
return twin_sin(a + TWIN_ANGLE_90);
22+
twin_fixed_t cos_val = 0;
23+
twin_sincos(a, NULL, &cos_val);
24+
return cos_val;
16425
}
16526

16627
twin_fixed_t twin_tan(twin_angle_t a)
16728
{
168-
twin_fixed_t s=twin_sin(a);
169-
twin_fixed_tc=twin_cos(a);
29+
twin_fixed_t s, c;
30+
twin_sincos(a, &s, &c);
17031

17132
if (c == 0) {
17233
if (s > 0)
@@ -178,3 +39,64 @@ twin_fixed_t twin_tan(twin_angle_t a)
17839
return 0;
17940
return ((s << 15) / c) << 1;
18041
}
42+
43+
static inline twin_fixed_t sin_poly(twin_angle_t x)
44+
{
45+
/* S(x) = x * 2^(-n) * (A1 - 2 ^ (q-p) * x * (2^-n) * x * 2^(-n) * (B1 - 2 ^
46+
* (-r) * x * 2 ^ (-n) * C1 * x)) * 2 ^ (a-q)
47+
* @n: the angle scale
48+
* @A: the amplitude
49+
* @p,q,r: the scaling factor
50+
*
51+
* A1 = 2^q * a5, B1 = 2 ^ p * b5, C1 = 2 ^ (r+p-n) * c5
52+
* where a5, b5, c5 are the coefficients for 5th-order polynomial
53+
* a5 = 4 * (3 / pi - 9 / 16)
54+
* b5 = 2 * a5 - 5 / 2
55+
* c5 = a5 - 3 / 2
56+
*/
57+
const uint64_t A = 16, n = 10, p = 32, q = 31, r = 3;
58+
const uint64_t A1 = 3370945099, B1 = 2746362156, C1 = 2339369;
59+
uint64_t y = (C1 * x) >> n;
60+
y = B1 - ((x * y) >> r);
61+
y = x * (y >> n);
62+
y = x * (y >> n);
63+
y = A1 - (y >> (p - q));
64+
y = x * (y >> n);
65+
y = (y + (1UL << (q - A - 1))) >> (q - A); // Rounding
66+
return y;
67+
}
68+
69+
void twin_sincos(twin_angle_t a, twin_fixed_t *sin, twin_fixed_t *cos)
70+
{
71+
twin_fixed_t sin_val = 0, cos_val = 0;
72+
73+
/* limit to [0..360) */
74+
a = a & (TWIN_ANGLE_360 - 1);
75+
int c = a > TWIN_ANGLE_90 && a < TWIN_ANGLE_270;
76+
/* special case for 90 degrees */
77+
if ((a & ~(TWIN_ANGLE_180)) == TWIN_ANGLE_90) {
78+
sin_val = TWIN_FIXED_ONE;
79+
cos_val = 0;
80+
} else {
81+
/* mirror second and third quadrant values across y axis */
82+
if (a & TWIN_ANGLE_90)
83+
a = TWIN_ANGLE_180 - a;
84+
twin_angle_t x = a & (TWIN_ANGLE_90 - 1);
85+
if (sin)
86+
sin_val = sin_poly(x);
87+
if (cos)
88+
cos_val = sin_poly(TWIN_ANGLE_90 - x);
89+
}
90+
if (sin) {
91+
/* mirror third and fourth quadrant values across x axis */
92+
if (a & TWIN_ANGLE_180)
93+
sin_val = -sin_val;
94+
*sin = sin_val;
95+
}
96+
if (cos) {
97+
/* mirror first and fourth quadrant values across y axis */
98+
if (c)
99+
cos_val = -cos_val;
100+
*cos = cos_val;
101+
}
102+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /