FastLED 3.9.15
Loading...
Searching...
No Matches
sample.cpp.hpp
Go to the documentation of this file.
1#include "fl/gfx/sample.h"
2
3#include "fl/math/math.h"
4#include "fl/math/xymap.h"
5#include "crgb.h"
6
7namespace fl {
8
9CRGB sample(const CRGB *grid, const XYMap &xyMap, float x, float y,
10 SampleMode mode) {
11 if (mode == SampleMode::SAMPLE_BILINEAR) {
12 return sampleBilinear(grid, xyMap, x, y);
13 }
14 return sampleNearest(grid, xyMap, x, y);
15}
16
17CRGB sampleBilinear(const CRGB *grid, const XYMap &xyMap, float x, float y) {
18 int x0 = static_cast<int>(x);
19 int y0 = static_cast<int>(y);
20 int x1 = min(x0 + 1, static_cast<int>(xyMap.getWidth()) - 1);
21 int y1 = min(y0 + 1, static_cast<int>(xyMap.getHeight()) - 1);
22
23 // Clamp x0 and y0 to valid range
24 x0 = max(0, min(x0, static_cast<int>(xyMap.getWidth()) - 1));
25 y0 = max(0, min(y0, static_cast<int>(xyMap.getHeight()) - 1));
26
27 float fx = x - x0;
28 float fy = y - y0;
29
30 // Get four neighboring pixels
31 CRGB c00 = grid[xyMap.mapToIndex(x0, y0)];
32 CRGB c10 = grid[xyMap.mapToIndex(x1, y0)];
33 CRGB c01 = grid[xyMap.mapToIndex(x0, y1)];
34 CRGB c11 = grid[xyMap.mapToIndex(x1, y1)];
35
36 // Interpolate
37 CRGB c0 = CRGB::blend(c00, c10, static_cast<u8>(fx * 255));
38 CRGB c1 = CRGB::blend(c01, c11, static_cast<u8>(fx * 255));
39 return CRGB::blend(c0, c1, static_cast<u8>(fy * 255));
40}
41
42CRGB sampleNearest(const CRGB *grid, const XYMap &xyMap, float x, float y) {
43 int xi = static_cast<int>(x + 0.5f); // Round to nearest
44 int yi = static_cast<int>(y + 0.5f);
45 xi = max(0, min(xi, static_cast<int>(xyMap.getWidth()) - 1));
46 yi = max(0, min(yi, static_cast<int>(xyMap.getHeight()) - 1));
47 return grid[xyMap.mapToIndex(xi, yi)];
48}
49
50} // namespace fl
fl::XYMap xyMap
Defines the 8-bit red, green, and blue (RGB) pixel type in the fl namespace.
FL_DISABLE_WARNING_PUSH U constexpr common_type_t< T, U > min(T a, U b) FL_NOEXCEPT
Definition math.h:71
unsigned char u8
Definition stdint.h:131
CRGB sampleNearest(const CRGB *grid, const XYMap &xyMap, float x, float y)
Nearest-neighbor sample from a 2D CRGB grid.
constexpr common_type_t< T, U > max(T a, U b) FL_NOEXCEPT
Definition math.h:75
CRGB sample(const CRGB *grid, const XYMap &xyMap, float x, float y, SampleMode mode)
Sample a pixel from a 2D CRGB grid at floating-point coordinates.
Definition sample.cpp.hpp:9
SampleMode
Interpolation mode for sampling a 2D grid.
Definition sample.h:13
@ SAMPLE_BILINEAR
Bilinear interpolation (smooth)
Definition sample.h:15
CRGB sampleBilinear(const CRGB *grid, const XYMap &xyMap, float x, float y)
Bilinear interpolation sample from a 2D CRGB grid.
Base definition for an LED controller.
Definition crgb.hpp:179
2D grid sampling with bilinear and nearest-neighbor interpolation
static CRGB blend(const CRGB &p1, const CRGB &p2, fract8 amountOfP2) FL_NOEXCEPT
Definition crgb.cpp.hpp:54
Representation of an 8-bit RGB pixel (Red, Green, Blue)
Definition crgb.h:38