void fill_gradient( CRGB* leds, uint16_t numLeds, const CHSV& c1, const CHSV& c2, const CHSV& c3, TGradientDirectionCode directionCode ) { uint16_t half = (numLeds / 2); uint16_t last = numLeds - 1; fill_gradient( leds, 0, c1, half, c2, directionCode); fill_gradient( leds, half, c2, last, c3, directionCode); }
void fill_gradient( CRGB* leds, uint16_t numLeds, const CHSV& c1, const CHSV& c2, const CHSV& c3, const CHSV& c4, TGradientDirectionCode directionCode ) { uint16_t onethird = (numLeds / 3); uint16_t twothirds = ((numLeds * 2) / 3); uint16_t last = numLeds - 1; fill_gradient( leds, 0, c1, onethird, c2, directionCode); fill_gradient( leds, onethird, c2, twothirds, c3, directionCode); fill_gradient( leds, twothirds, c3, last, c4, directionCode); }
void fill_gradient( const CHSV& c1, const CHSV& c2, const CHSV& c3, const CHSV& c4) { fill_gradient( FastLED[0].leds(), FastLED[0].size(), c1, c2, c3, c4); }
void fill_gradient( CRGB* leds, uint16_t numLeds, const CHSV& c1, const CHSV& c2, TGradientDirectionCode directionCode ) { uint16_t last = numLeds - 1; fill_gradient( leds, 0, c1, last, c2, directionCode); }
// Modèle Numérique d'Élévation Horn Schunck (cas affine) void mnehs_affine(float *out_h, float *init_h, int ow, int oh, float *a, int wa, int ha, float *b, int wb, int hb, double PA[8], double PB[8], float alpha2, int niter) { // allocate temporary images float *h = xmalloc(ow * oh * sizeof*h); // h-increment float *Q = xmalloc(ow * oh * sizeof*Q); // Q float *amb = xmalloc(ow * oh * sizeof*amb); // A-B (warped) float *ga = xmalloc(2 * wa * ha * sizeof*ga); // grad(A) float *gb = xmalloc(2 * wb * hb * sizeof*gb); // grad(B) // gradient of A and B fill_gradient(ga, a, wa, ha); fill_gradient(gb, b, wb, hb); // fill images q and amb (a minus b) for (int j = 0; j < oh; j++) for (int i = 0; i < ow; i++) { float h0 = getsample_nan(init_h, ow, oh, 1, i, j, 0); double ijh[3] = {i, j, h0}, paijh[3], pbijh[3]; apply_projection(paijh, PA, ijh); apply_projection(pbijh, PB, ijh); float va, vb, vga[2], vgb[2]; bicubic_interpolation_nans(&va, a, wa, ha, 1, paijh[0], paijh[1]); bicubic_interpolation_nans(&vb, b, wb, hb, 1, pbijh[0], pbijh[1]); bicubic_interpolation(vga, ga, wa, ha, 2, paijh[0], paijh[1]); bicubic_interpolation(vgb, gb, wb, hb, 2, pbijh[0], pbijh[1]); float gapa = vga[0] * PA[2] + vga[1] * PA[6]; float gbpb = vgb[0] * PB[2] + vgb[1] * PB[6]; Q [j*ow+i] = gapa - gbpb; amb[j*ow+i] = va - vb; } nusavec("Q_%d.tiff", global_scale, Q, ow, oh, 1); nusavec("amb_%d.tiff", global_scale, amb, ow, oh, 1); // initialize h for (int i = 0; i < ow * oh; i++) h[i] = 0; // run the iterations (without warps) for (int iter = 0; iter < niter; iter++) { for (int j = 0; j < oh; j++) for (int i = 0; i < ow; i++) { int ij = j * ow + i; if (!isfinite(amb[ij])) continue; float ax = laplacian_at(h, ow, oh, i, j); ax -= Q[ij] * (Q[ij] * h[ij] + amb[ij]) / alpha2; h[ij] += TAU() * ax; } } nusavec("h_%d.tiff", global_scale, h, ow, oh, 1); // update result for (int i = 0; i < ow * oh; i++) out_h[i] = init_h[i] + h[i]; // cleanup and exit free(h); free(Q); free(amb); free(ga); free(gb); }