Advertisement
Guest User

Procedural snowflakes

a guest
Dec 27th, 2016
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. data:text/html,<html><head><script type="text/javascript">
  2. var meta={};
  3. meta.sides=6;
  4. meta.alpha=[0.2,0.4];
  5. meta.tris=[8,160];
  6. var outc;
  7. var ctx;
  8. var csize;
  9. var cmid;
  10. var tris=[];
  11. var ext=0;
  12. function zd(min,max) {return ((Math.random()*(max-min))+min);}
  13. function zi(min,max) {return Math.floor((Math.random()*(max+1-min))+min);}
  14. function zip(min,max,exp) {return Math.floor((Math.pow(Math.random(),exp)*(max+1-min))+min);}
  15. function rotate(v,a)
  16. {
  17.  v=[v[0]-cmid,v[1]-cmid];
  18.  var lsin=Math.sin(a);
  19.  var lcos=Math.cos(a);
  20.  return [cmid+(lcos*v[0])-(lsin*v[1]),cmid+(lsin*v[0])+(lcos*v[1])];
  21. }
  22. function color()
  23. {
  24.  return ["rgba(",zi(143,175),",",zi(175,215),",",zi(223,255),",",zd(meta.alpha[0],meta.alpha[1]),")"].join("");
  25. }
  26. function triangle()
  27. {
  28.  ctx.fillStyle=color();
  29.  if(tris.length<1)
  30.  {
  31.   if(zd(0,1)<-1)
  32.   {
  33.    var lt=[[cmid,cmid],[0,0],[0,0]];
  34.    var angle=meta.angle*(Math.pow(zd(0.1,0.9),3)+zd(0.01,0.1));
  35.    var length=zd(1,cmid);
  36.    lt[1]=rotate([cmid,cmid+length],angle);
  37.    lt[2]=rotate([cmid,cmid+length],0-angle);
  38.    ext=(length*2)/csize;
  39.    for(var i=0;i<meta.sides;i++)
  40.    {
  41.     var la=meta.angle*i;
  42.     var ltr=[rotate(lt[0],la),rotate(lt[1],la),rotate(lt[2],la)];
  43.     ctx.beginPath();
  44.     ctx.moveTo(ltr[0][0],ltr[0][1]);
  45.     ctx.lineTo(ltr[1][0],ltr[1][1]);
  46.     ctx.lineTo(ltr[2][0],ltr[2][1]);
  47.     ctx.fill();
  48.    }
  49.    tris.push(lt);
  50.   }
  51.   else
  52.   {
  53.    var lengths=[zd(cmid/3,cmid),zd(1,cmid/2)];
  54.    var vs=[[cmid,cmid+lengths[0]],rotate([cmid,cmid+lengths[1]],meta.angle/2)];
  55.    ctx.beginPath();
  56.    ctx.moveTo(vs[0][0],vs[0][1]);
  57.    for(var i=0;i<meta.sides;i++)
  58.    {
  59.     var la=meta.angle*i;
  60.     var vrs=[rotate(vs[1],la),rotate(vs[0],la+meta.angle)];
  61.     ctx.lineTo(vrs[0][0],vrs[0][1]);
  62.     ctx.lineTo(vrs[1][0],vrs[1][1]);
  63.    }
  64.    ctx.fill();
  65.    tris.push([[cmid,cmid+lengths[0]],[cmid-(lengths[1]/2),cmid-(lengths[1]/2)],[cmid+(lengths[1]/2),cmid-(lengths[1]/2)]]);
  66.   }
  67.  }
  68.  else
  69.  {
  70.   if(zd(0,1)<0.8)
  71.   {
  72.    var lt=[[cmid,cmid],[0,0],[0,0]];
  73.    var scale=cmid;
  74.    while(true)
  75.    {
  76.     var btr=tris[(tris.length<=1?0:zip(0,tris.length-1,0.3))];
  77.     var vecs=[[btr[1][0]-btr[0][0],btr[1][1]-btr[0][1]],[btr[2][0]-btr[0][0],btr[2][1]-btr[0][1]]];
  78.     var bc=[zd(0,1),zd(0,1)];
  79.     if(bc[0]+bc[1]>1)
  80.     {
  81.      bc=[1-bc[0],1-bc[1]];
  82.     }
  83.     var bv=[btr[0][0]+(vecs[0][0]*bc[0])+(vecs[1][0]*bc[1]),btr[0][1]+(vecs[0][1]*bc[0])+(vecs[1][1]*bc[1])];
  84.     var lscale=(scale*Math.pow(zd(0.2,1),2))/Math.pow(tris.length,0.3);
  85.     var dvs=[[lscale*zd(-1,1),lscale*zd(-1,1)],[lscale*zd(-1,1),lscale*zd(-1,1)]];
  86.     lt[1]=[bv[0]+dvs[0][0],bv[1]+dvs[0][1]];
  87.     lt[2]=[bv[0]+dvs[1][0],bv[1]+dvs[1][1]];
  88.     var ltds=[[lt[1][0]-cmid,lt[1][1]-cmid],[lt[2][0]-cmid,lt[2][1]-cmid]];
  89.     if(scale<1)
  90.     {
  91.      console.log(bv);
  92.      console.log(ltds);
  93.      var n=window.blahblahblah();
  94.     }
  95.     if(Math.sqrt((ltds[0][0]*ltds[0][0])+(ltds[0][1]*ltds[0][1]))>cmid)
  96.     {
  97.      scale*=0.9;
  98.      continue;
  99.     }
  100.     if(Math.sqrt((ltds[1][0]*ltds[1][0])+(ltds[1][1]*ltds[1][1]))>cmid)
  101.     {
  102.      scale*=0.9;
  103.      continue;
  104.     }
  105.     lt[0]=bv;
  106.     break;
  107.    }
  108.    var lt2=[[csize-lt[0][0],lt[0][1]],[csize-lt[1][0],lt[1][1]],[csize-lt[2][0],lt[2][1]]];
  109.    tris.push(lt);
  110.    for(var i=0;i<meta.sides;i++)
  111.    {
  112.     var la=meta.angle*i;
  113.     var ltr=[rotate(lt[0],la),rotate(lt[1],la),rotate(lt[2],la)];
  114.     ctx.beginPath();
  115.     ctx.moveTo(ltr[0][0],ltr[0][1]);
  116.     ctx.lineTo(ltr[1][0],ltr[1][1]);
  117.     ctx.lineTo(ltr[2][0],ltr[2][1]);
  118.     ctx.fill();
  119.     var ltr2=[rotate(lt2[0],la),rotate(lt2[1],la),rotate(lt2[2],la)];
  120.     ctx.beginPath();
  121.     ctx.moveTo(ltr2[0][0],ltr2[0][1]);
  122.     ctx.lineTo(ltr2[1][0],ltr2[1][1]);
  123.     ctx.lineTo(ltr2[2][0],ltr2[2][1]);
  124.     ctx.fill();
  125.    }
  126.   }
  127.   else
  128.   {
  129.    var bvext=zd(0,ext);
  130.    var lt=[[cmid,cmid+(bvext*cmid)],[0,0],[0,0]];
  131.    var angle=meta.angle*(Math.pow(zd(0.05,0.8),3)+zd(0.001,0.03));
  132.    var end=zd(0,1);
  133.    ext=Math.max(ext,end);
  134.    end*=cmid;
  135.    lt[1]=rotate([cmid,cmid+end],angle);
  136.    lt[2]=rotate([cmid,cmid+end],0-angle);
  137.    for(var i=0;i<meta.sides;i++)
  138.    {
  139.     var la=meta.angle*i;
  140.     var ltr=[rotate(lt[0],la),rotate(lt[1],la),rotate(lt[2],la)];
  141.     ctx.beginPath();
  142.     ctx.moveTo(ltr[0][0],ltr[0][1]);
  143.     ctx.lineTo(ltr[1][0],ltr[1][1]);
  144.     ctx.lineTo(ltr[2][0],ltr[2][1]);
  145.     ctx.fill();
  146.    }
  147.    tris.push(lt);
  148.   }
  149.  }
  150. }
  151. function run()
  152. {
  153.  tris=[];
  154.  ext=0;
  155.  meta.angle=(Math.PI*2)/meta.sides;
  156.  outc=document.getElementById("out");
  157.  csize=Math.max(64,Math.min(window.innerWidth,window.innerHeight)-32);
  158.  cmid=Math.floor(csize/2);
  159.  csize=cmid*2;
  160.  outc.setAttribute("width",csize+"px");
  161.  outc.setAttribute("height",csize+"px");
  162.  ctx=outc.getContext("2d");
  163.  ctx.clearRect(0,0,csize,csize);
  164.  meta.tn=zip(meta.tris[0],meta.tris[1],0.5);
  165.  for(var t=0;t<meta.tn;t++)
  166.  {
  167.   triangle();
  168.  }
  169. }
  170. window.requestAnimationFrame(run);
  171. </script></head><body style="background:black;" onkeydown="run()"><canvas id="out" width="1px" height="1px" style="display:block;margin:auto;"></canvas></body></html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement