904 {
907
908
909
910 auto plotTile = [&](
const CRGB &color,
float px,
float py,
911 bool horiz) {
914 float fx = px - (float)ix;
915 float fy = py - (float)iy;
916 Tile2x2_u8 tile;
917 tile.setOrigin((u16)ix, (u16)iy);
918 if (horiz) {
919 tile.at(0, 0) = (
u8)((1.0f - fy) * 255.0f);
920 tile.at(1, 0) = 0;
921 tile.at(0, 1) = (
u8)(fy * 255.0f);
922 tile.at(1, 1) = 0;
923 } else {
924 tile.at(0, 0) = (
u8)((1.0f - fx) * 255.0f);
925 tile.at(1, 0) = (
u8)(fx * 255.0f);
926 tile.at(0, 1) = 0;
927 tile.at(1, 1) = 0;
928 }
930 };
931
932
933 constexpr float amp = 0.3f;
934
935
936
937 CRGB xColor(0, 255, 255);
938 float centerY = (float)(h - 1) * 0.5f;
939 float prevPy = 0.0f;
940 for (
int x = 0;
x < w;
x++) {
942 float py = centerY - val.to_float() * amp * centerY;
943 plotTile(xColor, (
float)
x, py,
true);
945 float dy = py - prevPy;
946 int gap = (int)
fabsf(dy);
947 for (int s = 1; s < gap; s++) {
948 float t = (float)s / (
float)gap;
949 float midY = prevPy + dy *
t;
950 float midX = (float)(
x - 1) +
t;
951 plotTile(xColor, midX, midY, true);
952 }
953 }
954 prevPy = py;
955 }
956
957
958
959 CRGB yColor(255, 255, 0);
960 float centerX = (float)(w - 1) * 0.5f;
961 float prevPx = 0.0f;
962 for (
int y = 0;
y < h;
y++) {
964 float px = centerX + val.to_float() * amp * centerX;
965 plotTile(yColor, px, (
float)
y,
false);
967 float dx = px - prevPx;
968 int gap = (int)
fabsf(dx);
969 for (int s = 1; s < gap; s++) {
970 float t = (float)s / (
float)gap;
971 float midX = prevPx + dx *
t;
972 float midY = (float)(
y - 1) +
t;
973 plotTile(yColor, midX, midY, false);
974 }
975 }
976 prevPx = px;
977 }
978}
static constexpr FASTLED_FORCE_INLINE s16x16 from_raw(i32 raw) FL_NO_EXCEPT
float fabsf(float value) FL_NO_EXCEPT
float floorf(float value) FL_NO_EXCEPT