class Sinematrix3 : public Effect { private: double pangle = 0; double angle = 0; double sx = 0; double sy = 0; double tx = 0; double ty = 0; double cx = 0; double cy = 0; double rcx = 0; double rcy = 0; double angle2 = 0; double sx2 = 0; double sy2 = 0; double tx2 = 0; double ty2 = 0; double basecol = 0; double fx = 1.0/(LED_WIDTH/PI); double fy = 1.0/(LED_HEIGHT/PI); Matrix rotate; public: Sinematrix3() {} void loop() { pangle = addmodpi( pangle, 0.0133 + (angle/256) ); angle = cos(pangle) * PI; sx = addmodpi( sx, 0.00673 ); sy = addmodpi( sy, 0.00437 ); tx = addmodpi( tx, 0.00239 ); ty = addmodpi( ty, 0.00293 ); cx = addmodpi( cx, 0.00197 ); cy = addmodpi( cy, 0.00227 ); rcx = (LED_WIDTH/2) + (sin(cx) * LED_WIDTH); rcy = (LED_HEIGHT/2) + (sin(cy) * LED_HEIGHT); angle2 = addmodpi( angle2, 0.0029 ); sx2 = addmodpi( sx2, 0.0041); sy2 = addmodpi( sy2, 0.0031); tx2 = addmodpi( tx2, 0.0011 ); ty2 = addmodpi( ty2, 0.0023 ); basecol = addmod( basecol, 1.0, 0.007 ); rotate = { .a11 = cos(angle), .a12 = -sin(angle), .a21 = sin(angle), .a22 = cos(angle) }; Matrix zoom = { .a11 = sin(sx)/4.0 + 0.15, .a12 = 0, //atan(cos(sx2)), .a21 = 0, //atan(cos(sy2)), .a22 = cos(sy)/4.0 + 0.15 }; Vector translate = { .x1 = sin(tx) * LED_WIDTH, .x2 = sin(ty) * LED_HEIGHT }; for( int x = 0; x < LED_WIDTH; x++ ) { for( int y = 0; y < LED_HEIGHT; y++ ) { Vector c = add(multiply( multiply(rotate, zoom), { .x1 = x-rcx, .x2 = y-rcy } ), translate); //Vector c2 = add(multiply( multiply(zoom2, rotate2), { .x1 = x, .x2 = y } ), translate2); leds[XYsafe(x,y)] = CHSV((basecol+basefield(c.x1, c.x2))*255, 255, 255); //31+(sines(c2.x1-10, c2.x2-10)*224)); } } } };