Idea:- Generate Three Phase to give an RGB value to get rainbow fades A lot of Rainbow fades use HUE and a Hue2RGB() function. Could I use N Darwoods's Three Phase method? yes - but you need to clip. This is based on a Wireless World article by N Darwood in November 1982. Itterate these each time slice:- A=A+n*(B-C) B=B+n*(C-A) C=C+n*(A-B) If A, B, C map to R, G, B If these clip, and go greater than 100% and the colours are pleasing. The SVG rgb(r%,b%,g%) function clips the values to 0% to 100%.
// Sine waves using sin() and cos() period += increment rad= 2*PI*period Y=mag*sin(rad) or Y=mag*cos(rad)// Sine waves using complex numbers // and accumulator. A=A*M rad = 2.0 * Math.PI * 0.2 mag = 1.0 M.re=mag*Math.sin( rad ) M.im=mag*Math.cos( rad ) at= mr*ar-mi*ai ai= mr*ai+mi*ar ar=at
// Sine waves using differential equations Itterate these each time slice:- x=x+y*n y=y-x*n This is the solution to d^2 V/dt^2 = -nV dV/dt = j n V Numerically solve re_next = re_now + gradient * step length re_next=re_now+im_now*n im_next=im_now-re_next*n This is a combination of the forward and backward integration and are stable however the forward Euler integration explodes re_next=re_now+im_now*n im_next=im_now-re_now*n however the backward Euler integration explodes re_next=re_now+im_next*n im_next=im_now-re_next*n
Idea:- Generate Three Phase to give an RGB value This is based on a Wireless World article by N Darwood in November 1982. Itterate these each time slice:- A=A+n*(B-C) B=B+n*(C-A) C=C+n*(A-B) If A, B, C are three axis 120 degree relative to each other. A=cos( 2*pi*t/T ); B=cos( 2*pi*t/T + 2*pi/3 ); C=cos( 2*pi*t/T + 2*pi/6); Using complex numbers:- B= M*A C= M*M*A A= M*M*M*A M.re = cos(2*pi/3 ) M.im = sin(2*pi/3 ) Why is this stable? Assume it is a solution of a differential equation? forward Euler uses the gradient at now backward Euler uses the gradient at now+1 They each have an error which must cancel. Assume A1 is the next itteration of A0, B1 is B0 + update These must be executed in the order below without A1=A0+n*(B0-C0) // forward Euler A1 is based on now values of B and C B1=B0+n*(C0-A1) // Forward and backward Euler integration, based on old and new C1=C0+n*(A1-B1) // backward Euler C1 is based on new A and B