# 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)[]
}