44 float t = alpha * 2.0f *
FL_PI;
57 float t = alpha * 2.0f *
FL_PI;
64 float y = -(13.0f *
cosf(
t) - 5.0f *
cosf(2.0f *
t) -
98 float x = r *
cosf(theta);
99 float y = r *
sinf(theta);
134 float x = r *
cosf(theta);
135 float y = r *
sinf(theta);
142 const float N =
static_cast<float>(
params().c);
149 constexpr float goldenAngle =
FL_PI * (3.0f - 1.6180339887498948f);
152 float r =
sqrtf(n / N);
155 float theta = n * goldenAngle;
158 float x = r *
cosf(theta);
159 float y = r *
sinf(theta);
166 constexpr float kTwoPi = 6.283185307179586f;
167 float theta = alpha * kTwoPi;
181 float t2 = m * theta / 4.0f;
184 float r =
powf(part1 + part2, -1.0f / n1);
187 float x = r *
cosf(theta);
188 float y = r *
sinf(theta);
221 return "ArchimedeanSpiralPath";
277 const auto &points =
params().points;
280 if (points.size() < 2) {
282 return vec2f(0.0f, 0.0f);
286 if (points.size() == 2) {
287 return vec2f(points[0].
x + alpha * (points[1].
x - points[0].
x),
288 points[0].
y + alpha * (points[1].
y - points[0].
y));
293 float scaledAlpha = alpha * (points.size() - 1);
296 int segment =
static_cast<int>(scaledAlpha);
299 if (segment >=
static_cast<int>(points.size()) - 1) {
300 segment = points.size() - 2;
301 scaledAlpha =
static_cast<float>(segment) + 1.0f;
305 float t = scaledAlpha -
static_cast<float>(segment);
308 vec2f p0, p1, p2, p3;
316 p3 = (points.size() > 2) ? points[2] : points[1];
317 }
else if (segment ==
static_cast<int>(points.size()) - 2) {
319 p0 = (segment > 0) ? points[segment - 1] : points[0];
320 p1 = points[segment];
321 p2 = points[segment + 1];
322 p3 = points[segment + 1];
325 p0 = points[segment - 1];
326 p1 = points[segment];
327 p2 = points[segment + 1];
328 p3 = points[segment + 2];
346 float a = -0.5f * p0.x + 1.5f * p1.x - 1.5f * p2.x + 0.5f * p3.x;
347 float b = p0.x - 2.5f * p1.x + 2.0f * p2.x - 0.5f * p3.x;
348 float c = -0.5f * p0.x + 0.5f * p2.x;
351 float x = a * t3 + b * t2 + c *
t + d;
353 a = -0.5f * p0.y + 1.5f * p1.y - 1.5f * p2.y + 0.5f * p3.y;
354 b = p0.y - 2.5f * p1.y + 2.0f * p2.y - 0.5f * p3.y;
355 c = -0.5f * p0.y + 0.5f * p2.y;
358 float y = a * t3 + b * t2 + c *
t + d;
const string name() const FL_NO_EXCEPT override
ArchimedeanSpiralPath(u8 turns=3, float radius=1.0f) FL_NO_EXCEPT
void setTurns(u8 turns) FL_NO_EXCEPT
vec2f compute(float alpha) FL_NO_EXCEPT override
void setRadius(float radius) FL_NO_EXCEPT
void clear() FL_NO_EXCEPT
fl::size size() const FL_NO_EXCEPT
fl::shared_ptr< CatmullRomParams > mParams
CatmullRomPath(const fl::shared_ptr< CatmullRomParams > &p=fl::make_shared< CatmullRomParams >()) FL_NO_EXCEPT
const string name() const FL_NO_EXCEPT override
CatmullRomParams & params() FL_NO_EXCEPT
vec2f compute(float alpha) FL_NO_EXCEPT override
fl::size size() const FL_NO_EXCEPT
Get the number of control points.
vec2f interpolate(const vec2f &p0, const vec2f &p1, const vec2f &p2, const vec2f &p3, float t) const FL_NO_EXCEPT
void addPoint(vec2f p) FL_NO_EXCEPT
Add a point in [0,1]² to the path.
void clear() FL_NO_EXCEPT
Clear all control points.
CirclePath() FL_NO_EXCEPT
const string name() const FL_NO_EXCEPT override
vec2f compute(float alpha) FL_NO_EXCEPT override
fl::shared_ptr< GielisCurveParams > mParams
void setN1(float n1) FL_NO_EXCEPT
const string name() const FL_NO_EXCEPT override
GielisCurveParams & params() FL_NO_EXCEPT
GielisCurvePath(const fl::shared_ptr< GielisCurveParams > &p=fl::make_shared< GielisCurveParams >()) FL_NO_EXCEPT
void setB(float b) FL_NO_EXCEPT
void setN2(float n2) FL_NO_EXCEPT
void setN3(float n3) FL_NO_EXCEPT
void setA(float a) FL_NO_EXCEPT
vec2f compute(float alpha) FL_NO_EXCEPT override
void setM(float m) FL_NO_EXCEPT
vec2f compute(float alpha) FL_NO_EXCEPT override
const string name() const FL_NO_EXCEPT override
const string name() const FL_NO_EXCEPT override
void set(float x0, float y0, float x1, float y1) FL_NO_EXCEPT
fl::shared_ptr< LinePathParams > mParams
LinePathParams & params() FL_NO_EXCEPT
LinePath(const LinePathParamsPtr ¶ms=fl::make_shared< LinePathParams >()) FL_NO_EXCEPT
vec2f compute(float alpha) FL_NO_EXCEPT override
const string name() const FL_NO_EXCEPT override
PhyllotaxisPath(const fl::shared_ptr< PhyllotaxisParams > &p=fl::make_shared< PhyllotaxisParams >()) FL_NO_EXCEPT
fl::shared_ptr< PhyllotaxisParams > mParams
PhyllotaxisParams & params() FL_NO_EXCEPT
vec2f compute(float alpha) FL_NO_EXCEPT override
void set(float x, float y) FL_NO_EXCEPT
vec2f compute(float alpha) FL_NO_EXCEPT override
const string name() const FL_NO_EXCEPT override
PointPath(float x, float y) FL_NO_EXCEPT
fl::shared_ptr< RosePathParams > mParams
void setN(u8 n) FL_NO_EXCEPT
void setD(u8 d) FL_NO_EXCEPT
const string name() const FL_NO_EXCEPT override
RosePath(const fl::shared_ptr< RosePathParams > &p=fl::make_shared< RosePathParams >()) FL_NO_EXCEPT
RosePathParams & params() FL_NO_EXCEPT
vec2f compute(float alpha) FL_NO_EXCEPT override
#define FASTLED_UNUSED(x)
shared_ptr< T > make_shared(Args &&... args) FL_NO_EXCEPT
u8 u8 fract8 blur_amount FL_NO_EXCEPT
float sinf(float value) FL_NO_EXCEPT
float sqrtf(float value) FL_NO_EXCEPT
float cosf(float value) FL_NO_EXCEPT
float fabsf(float value) FL_NO_EXCEPT
float powf(float base, float exponent) FL_NO_EXCEPT
Base definition for an LED controller.