FastLED 3.9.15
Loading...
Searching...
No Matches

◆ sincos32()

FASTLED_FORCE_INLINE SinCos32 fl::sincos32 ( u32 angle)

Definition at line 88 of file sin32.h.

88 {
89 u8 angle256 = static_cast<u8>(angle >> 16);
90 u32 t = angle & 0xFFFF;
91
92 u8 quadrant = angle256 >> 6;
93 u8 pos = angle256 & 0x3F;
94
95 // Quarter-wave mapping (same for both sin and cos)
96 u8 mirror_s = quadrant & 1;
97 u8 qi = static_cast<u8>(pos + mirror_s * (64 - 2 * pos));
98 u8 qi_next = static_cast<u8>(qi + 1 - 2 * mirror_s);
99
100 // Derivative masks: sin and cos have opposite mirror states
101 i32 sdmask = -static_cast<i32>(mirror_s);
102 i32 cdmask = ~sdmask; // opposite mirror
103
104 // Sin at offset 0, cos at offset 2 — same qi, same cache line
105 i32 s_raw = sin32_interp(qi, qi_next, sdmask, t, 0);
106 i32 c_raw = sin32_interp(qi, qi_next, cdmask, t, 2);
107
108 // Sin sign: negative in quadrants 2, 3
109 i32 svmask = -static_cast<i32>((quadrant >> 1) & 1);
110 // Cos sign: negative in quadrants 1, 2 (XOR of quadrant bits)
111 i32 cvmask = -static_cast<i32>((quadrant ^ (quadrant >> 1)) & 1);
112
113 SinCos32 out;
114 out.sin_val = (i32)(((i64)s_raw ^ svmask) - svmask);
115 out.cos_val = (i32)(((i64)c_raw ^ cvmask) - cvmask);
116 return out;
117}
uint8_t pos
Definition Blur.ino:11
unsigned char u8
Definition stdint.h:131
FASTLED_FORCE_INLINE i32 sin32_interp(u8 qi, u8 qi_next, i32 dmask, u32 t, u8 offset=0) FL_NOEXCEPT
Definition sin32.h:40
fl::i64 i64
Definition s16x16x4.h:222
i32 sin_val
Definition sin32.h:25
i32 cos_val
Definition sin32.h:26

References fl::SinCos32::cos_val, FASTLED_FORCE_INLINE, FL_NOEXCEPT, pos, sin32_interp(), fl::SinCos32::sin_val, and t.

Referenced by fl::Chasing_Spirals_Q31_SIMD::draw(), render_value_fp(), fl::fixed_point_base< Derived, IntBits, FracBits >::sincos(), and fl::s16x16::sincos().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: