# www.contextfreeart.org/gallery/view.php?id=4262 # # Added as of 19.11.2021 # # Originally created by flembobs. Uploaded on November 7th, 2021. # CF::Impure = 1 CF::Background = [b -0.7 sat 0.3 h 240] CF::Time = [time 0 1] CF::Size = [s 1.2 1.2]

startshape HEART(7) [y 0.1]

//Curves used to draw the heart h0=(0,0),(0,0.4),(0.5,0.4),(0.5,0) h1=(0.5,0),(0.5,-0.25),(0.1,-0.25),(0,-0.5) h2=(0,-0.5),(-0.1,-0.25),(-0.5,-0.25),(-0.5,0) h3=(-0.5,0),(-0.5,0.4),(0,0.4),(0,0)

sine(t,freq,phase) = sin( (freq*360*t) + (360*phase))

vector8 L(i)=select(i,h0,h1,h2,h3)

vector2 lerp2(vector2 p0, vector2 p1, t)=

p0*(1-t) + t*p1

//Point t on curve p0,p1,p2,p3 using bernstein polynomial form vector2 cubicPoint(vector2 p0, vector2 p1, vector2 p2,

vector2 p3, t)=
p0*(-t^3+3*t^2-3*t+1) + p1*(3*t^3-6*t^2+3*t) +
p2*(-3*t^3+3*t^2) + p3*t^3

segment(n,i)=bitright(bitand(2^(n-1),i),n-1)

//split curve p0,p1,p2,p3 into n sections and return curve s0,s1,s2 at index i

vector8 cubicSplit(vector2 p0, vector2 p1, vector2 p2,

vector2 p3, n, i)=
if(n==0, (p0,p1,p2,p3),
  let(
    seg=segment(n,i);
    st=seg*0.5;
    s0=cubicPoint(p0,p1,p2,p3,st);
    s3=cubicPoint(p0,p1,p2,p3,st+0.5);

    L1=(lerp2(p0,p1,0.5),lerp2(p1,p2,0.5),lerp2(p2,p3,0.5));
    L2=(lerp2(L1[0,2],L1[2,2],0.5),lerp2(L1[2,2],L1[4,2],0.5));

    s1=select(seg,L1[0,2],L2[2,2]);
    s2=select(seg,L2[0,2],L1[4,2]);
    cubicSplit(s0,s1,s2,s3,n-1,i)
  )
)

shape HEART(n) {

transform [b 1 sat 1]
loop i=4 []
loop j=(2^n) []
{
  t=(i*2^n+j)/(4*2^n)
  Q=L(i)
  q=cubicSplit(Q[0,2],Q[2,2],Q[4,2],Q[6,2],n,j)

  transform [h (360*(t+ftime()))]
  {
    w=0.06
      + 0.02*sine(ftime(),2,t)
      + 0.01*sine(t,2,0)
    C(q[0,2],q[2,2],q[4,2],q[6,2],w)[]

    transform [a -0.95 blend CF::Screen]
    transform [a (-0.005+0.005*sine(ftime(),2,0))]
    transform [a (0.001*sine(ftime(),4,0))]
    loop k=5 [ a -0.575 ]
      C(q[0,2],q[2,2],q[4,2],q[6,2],w+0.01*(2^k+1))[]
  }
}

}

path C(vector2 p0,vector2 p1,vector2 p2,vector2 p3, w) {

MOVETO(p0)
CURVETO(p3,p1,p2)
STROKE(w,CF::RoundCap)[]

}