Minimal Barnsley's Fern (lolwikipedia) in html and javascript:
<html><script>n=u=v=0
function i(){t=document.body.lastChild.getContext('2d')
t.fillStyle='green'
r=Math.random()*99
x=u,y=v
u=x*.85+y/25,v=y*.85-x/25+1.6
if(r<14)u=y/3-x/7,v=x/4+y/4+.4
if(r<7)u=x/5-y/4,v+=1.3
if(r<1)u=0,v=y/6
t.fillRect(50*u+140,525-50*v,1,1)
if(n<2e5)if(n++%99)i()
else setTimeout(i,1)}onload=i</script><canvas height=550></html>
Works on modern browsers (well, ok, works on Firefox and probably Chrome). It's also 348 bytes. Can anyone do better?
Name:
F r o z e n V o i d !!mJCwdV5J0Xy2A212011-12-06 8:23
>NP-complete problems
Fractal compression already exists, just its lossy. I think if IFS(non-determinstic) algorithm can be replaced by deterministic algorithm, this would simplify the problem into optimizations like preacaching/parameter reductions/simplified formulas/etc, which would make anything which uses IFS algorithms much more efficient(and compression would be deterministic too)
>>124
Hes hot. I wouldnt mind having my as pounded by her.
Name:
F r o z e n V o i d !!mJCwdV5J0Xy2A212011-12-06 13:22
Unoptimized 678ms but now the fractal serves as its own PRNG(i.e. there is no external randomness or PRNG calls anymore)
<html><head><style>html,body{width:100%;height:100%;margin:0px;}
</style></head><body><canvas id='frozenfern'><script>
const w=window.innerWidth
const h =window.innerHeight
const M=w>h?w:h
var canv=document.getElementById('frozenfern');
var context=canv.getContext("2d");
canv.width=w ;
canv.height=h ;
var DEBUG=1;
function d(x){if(!DEBUG)return;if(typeof(x)==Array){document.body.innerHTML+=(x.join(","))}else{document.body.innerHTML+=(x.toString())}}
var green=0xff00ff00
var blue=0xffff0000
var red=0xff0000ff
//const iterations=100
const RW=30000//Random walk range
var iter100=100//00//Fill Quality(optimal ~4k)
const H=h//525;
const L=w/2;//140
const mult=50;//
const xyred=0.85
const a25=1/25;
const a4=1/4;
const a3=1/3;
const a5=1/5;
const a7=1/7;
const a6=1/6
const a20=1/20
const zoom=2.8//14//1.6
const Hzoom=0.4
const Wzoom=1.3
const WHzoom=Wzoom+Hzoom
var starttime=Date.now();
function addtm(str){document.title+=Date.now()-starttime+str;starttime=Date.now()}
var rands=Uint32Array(5);
var x3 =rands[0]= 123456789, y3 = rands[1]= 362436069, z3 =rands[2]= 521288629, w3 =rands[3]= 88675123,t3=rands[4];
var n=u=v=r=m=c=x=y=0;
var j=[]
//Stem 1/100
function stem(){
x=u;y=v;u=0;v=y*a6;
arrn[wtable[(mult*v)|0]]=green;}
//LeafSet
function leafD(){
u=x*xyred+y*a25;v=y*xyred-x*a25+zoom;
arrn[((mult*u)|0)+wtable[(mult*v)|0]]=green;}
function leafW(){
u=x*a5-y*a4,v=(x+y)*a4+WHzoom;
arrn[((mult*u)|0)+wtable[(mult*v)|0]]=blue;}
function leafH(){
u=y*a3-x*a7,v=(x+y)*a4+Hzoom;
arrn[((mult*u)|0)+wtable[(mult*v)|0]]=red;}
//Leaf
function leaf(){;var t;stem()
for(t=0;t<RW;t++){
x=u;y=v;//r=r63();
r=(((u*v)*0xff)&63);
(r&1)|(r&3)?leafD():r&7?leafW():leafH();
};
}
//Main
var arrn=Uint32Array(w*h)
var co={width:w,height:h,data:Uint8ClampedArray(arrn.buffer)}
while(iter100--){
/* inlined version 3ms faster:
;stem();var t;
for(t=0;t<RW;t++){
x=u;y=v;r=r63();
((r&1)|(r&3))?(u=x*xyred+y*a25,v=y*xyred-x*a25+zoom):((r&7)?(u=x*a5-y*a4,v=(x+y)*a4+WHzoom):(u=y*a3-x*a7,v=(x+y)*a4+Hzoom));
arrn[L+( ((mult*u))|0 )+(H-(mult*v)|0)*w]=green;}
*/
leaf();};//47ms
context.putImageData(co,0,0);//42ms
document.title+=Date.now()-starttime+" ms"
</script></body></html>
Name:
F r o z e n V o i d !!mJCwdV5J0Xy2A212011-12-06 13:55
*should be r=(((v+u*v)*0xff)&63); to avoid u=0
Name:
F r o z e n V o i d !!mJCwdV5J0Xy2A212011-12-06 13:56
this version also messes up the stem, but doesn't detract quality.
Name:
Anonymous2011-12-06 13:57
USE CODE TAG, CODE FAG
Name:
F r o z e n V o i d !!mJCwdV5J0Xy2A212011-12-06 14:09
//Stem 1/100
function stem(){
x=u;y=v;u=0;v=y*a6;
arrn[wtable[(mult*v)|0]]=green;}
//LeafSet
function leafD(){
u=x*xyred+y*a25;v=y*xyred-x*a25+zoom;
arrn[((mult*u)|0)+wtable[(mult*v)|0]]=green;}
function leafW(){
u=x*a5-y*a4,v=(x+y)*a4+WHzoom;
arrn[((mult*u)|0)+wtable[(mult*v)|0]]=blue;}
function leafH(){
u=y*a3-x*a7,v=(x+y)*a4+Hzoom;
arrn[((mult*u)|0)+wtable[(mult*v)|0]]=red;}
//Leaf
function leaf(){;var t;stem()
for(t=0;t<RW;t++){
x=u;y=v;//r=r63();
r=(((v+u*v)*0xff)&63);
if(r==0)stem();
(r&1)|(r&3)?leafD():(r&7?leafW():(leafH()));
};
}
//Main
var arrn=Uint32Array(w*h)
var co={width:w,height:h,data:Uint8ClampedArray(arrn.buffer)}
while(iter100--){
/* inlined version 3ms faster:
;stem();var t;
for(t=0;t<RW;t++){
x=u;y=v;r=r63();
((r&1)|(r&3))?(u=x*xyred+y*a25,v=y*xyred-x*a25+zoom):((r&7)?(u=x*a5-y*a4,v=(x+y)*a4+WHzoom):(u=y*a3-x*a7,v=(x+y)*a4+Hzoom));
arrn[L+( ((mult*u))|0 )+(H-(mult*v)|0)*w]=green;}
*/
leaf();};//47ms
context.putImageData(co,0,0);//42ms
document.title+=Date.now()-starttime+" ms"
</script></body></html>
Name:
F r o z e n V o i d !!mJCwdV5J0Xy2A212011-12-07 3:26
91ms randomizer reduced to union float:int
<html><head><style>html,body{width:100%;height:100%;margin:0px;}
</style></head><body><canvas id='frozenfern'><script>
const w=window.innerWidth
const h =window.innerHeight
const M=w>h?w:h
var canv=document.getElementById('frozenfern');
var context=canv.getContext("2d");
canv.width=w ;
canv.height=h ;
var DEBUG=1;
function d(x){if(!DEBUG)return;if(typeof(x)==Array){document.body.innerHTML+=(x.join(","))}else{document.body.innerHTML+=(x.toString())}}
const green=0xff00ff00
const blue=0xffff0000
const red=0xff0000ff
const purple=0xffff00ff
const yellow=0xff00ffff
var quality=200000
const H=h//525;
const L=w/2;//140
const mult=50;//
const xyred=0.85
const a25=1/25;
const a4=1/4;
const a3=1/3;
const a5=1/5;
const a7=1/7;
const a6=1/6
const a20=1/20
const zoom=2.8//14//1.6
const Hzoom=0.4
const Wzoom=1.3
const WHzoom=Wzoom+Hzoom
var starttime=Date.now();
function addtm(str){document.title+=Date.now()-starttime+str;starttime=Date.now()}
var x=y=0;
var farr=Float64Array(4)
var vars=Uint32Array(farr.buffer)
var wtable=Uint32Array(w);
for(var i=0;i<w;i++)wtable[i]=((H-i)*w)+L;
//Main
var color=green;
var arrn=Uint32Array(w*h)
var co={width:w,height:h,data:Uint8ClampedArray(arrn.buffer)}
while(quality--){
//u=farr[1],v=farr[0]
x=farr[1],y=farr[0];
(vars[1]&3)?(color=yellow,farr[1]=x*xyred+y*a25,farr[0]=y*xyred-x*a25+zoom):((vars[1]&7)?(color=red,farr[1]=x*a5-y*a4,farr[0]=(x+y)*a4+WHzoom):(color=blue,farr[1]=y*a3-x*a7,farr[0]=(x+y)*a4+Hzoom));
if((vars[0]&0xff)==0)farr[1]=0,farr[0]=y*a6,color=green;
arrn[ ( ((mult*farr[1]))|0)+wtable[(mult*farr[0])|0]]=color};
context.putImageData(co,0,0);//42ms
document.title+=Date.now()-starttime+" ms"
</script></body></html>
Name:
Anonymous2011-12-07 10:02
To the OP: Because most browsers clamp the minimum setTimeout/setInterval delay value to 10ms, even if you use a lower value, the upper bound is 100 timer-based function calls per second, which directly translates to a maximum of 100 pixels per second. If you were to fill multiple pixels in one call of i(), you could increase runtime speed.