Test for rawgit
Last active
January 10, 2018 11:47
-
-
Save IbrahimTanyalcin/80d8f6687dd8f29f90fa30b70fe47a8b to your computer and use it in GitHub Desktop.
hexBinSort
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var coordinates = [0,0]; | |
var areaBlob = {}; | |
var blobJsCanvasCounter = 0; | |
var blobTools ={ | |
vBelt:function vBelt(r,R,d,i,nodeCount) { | |
var sum = r+R+d; | |
var theta = Math.asin((R-r)/(R+r+d)); | |
var A = Math.sqrt(Math.pow(R+r+d,2)-Math.pow(R-r,2)); | |
var beta = Math.atan(A/r); | |
var y = Math.abs(Math.PI-i/nodeCount*Math.PI*2); | |
var x = Math.abs(Math.asin(sum*Math.sin(y)/R)) || 0; | |
var z = Math.PI-x-y; | |
var U = Math.sqrt(Math.pow(sum,2)+Math.pow(R,2)-2*sum*R*Math.cos(z)); | |
var delta = (Math.PI-2*theta)/2/Math.PI/2; | |
var betaCurrent = i/nodeCount <= 0.5 ? Math.PI*2*(i/nodeCount-delta) : Math.PI*2*(1-i/nodeCount-delta); | |
return blobTools.retrieveInterval(-0.5,delta,i,nodeCount)*r+blobTools.retrieveInterval(delta,delta+beta/Math.PI/2,i,nodeCount)*r/Math.cos(betaCurrent)+blobTools.retrieveInterval(delta+beta/Math.PI/2,1-delta-beta/Math.PI/2,i,nodeCount)*U+blobTools.retrieveInterval(1-delta-beta/Math.PI/2,(3/2*Math.PI+theta)/Math.PI/2,i,nodeCount)*r/Math.cos(betaCurrent)+blobTools.retrieveInterval((3/2*Math.PI+theta)/Math.PI/2,1,i,nodeCount)*r; | |
}, | |
retrieveInterval:function retrieveInterval (a,b,i,nodeCount){ | |
var mid = (a+b)/2; | |
var distance = Math.abs(a-mid); | |
return Math.round(0.5+distance-Math.abs(mid-i/nodeCount)); | |
}, | |
wiggle:function wiggle(R,Rx,teethCount,i,nodeCount){ | |
var teethWidth = nodeCount/teethCount; | |
var teethSegment = Math.floor((i%teethWidth)/(teethWidth/3)); | |
return (Math.floor(i/teethWidth)%2)*(Math.abs(Math.sign(teethSegment*(teethSegment-2)))*(Rx-R)/R+Math.abs(Math.sign((teethSegment-1)*(teethSegment-2)))*((Rx-R)/R*(i%(teethWidth/3))/teethWidth*3)+Math.abs(Math.sign(teethSegment*(teethSegment-1)))*((Rx-R)/R-(Rx-R)/R*(i%(teethWidth/3))/teethWidth*3)) | |
}, | |
ellipse:function ellipse (a,i,nodeCount,b){ | |
b = b === undefined ? 1 : b; | |
var tanTheta = Math.abs(Math.tan(i/nodeCount*Math.PI*2)); | |
var x = Math.sqrt(Math.pow(a,2)*Math.pow(tanTheta,2)*Math.pow(b,2)/(Math.pow(a,2)+Math.pow(tanTheta,2)*Math.pow(b,2))); | |
var y = tanTheta === 0 ? b : x/tanTheta; | |
/*x^2/a^2+(x/tanTheta)^2=1 | |
x^2*tanTheta^2+x^2*a^2 = a^2*tanTheta^2; | |
x^2(tanTheta^2+a^2) = a^2*tanTheta^2;*/ | |
return Math.sqrt(Math.pow(x,2)+Math.pow(y,2)); | |
}, | |
droplet:function droplet (roundness,i,nodeCount) { | |
var coefficient = 1/(1-roundness) === Infinity ? 0 : 1/(1-roundness); | |
return roundness+(coefficient*Math.pow((i-nodeCount*(1-roundness))/nodeCount,2))*blobTools.retrieveInterval(-0.5,1-roundness,i,nodeCount)+blobTools.retrieveInterval(roundness,1,i,nodeCount)*(coefficient*Math.pow((i-nodeCount*roundness)/nodeCount,2)); | |
}, | |
star:function star (vertexLength,vertexCount,sharpness,i,nodeCount) { | |
return 1-vertexLength+vertexLength*Math.abs(Math.pow(Math.sin(vertexCount*Math.PI*i/nodeCount-Math.PI/2),10*sharpness)) | |
}, | |
heart:function heart(a,b,i,nodeCount) { | |
var r = 1/(1+Math.pow(b,-5)); | |
return blobTools.retrieveInterval(-0.5,0.25,i,nodeCount)*1/(1+Math.pow(b,-1*(i/nodeCount*40-5)))+blobTools.retrieveInterval(0.75,1,i,nodeCount)*1/(1+Math.pow(b,-1*(10-(i/nodeCount-0.75)*40-5)))+blobTools.retrieveInterval(0.25,0.75,i,nodeCount)*blobTools.ellipse(a,i+nodeCount/4,nodeCount,r); | |
}, | |
polygonAngular:function polygonAngular(a,i,nodeCount){ | |
var length = a.length; | |
var residualAngle = Math.PI*2; | |
for (var j=0;j<a.length;j+=2){ | |
residualAngle -= a[j]/360*Math.PI*2; | |
} | |
var distanceRlastR1=Math.sqrt(Math.pow(a[a.length-1],2)+Math.pow(a[1],2)-2*a[a.length-1]*a[1]*Math.cos(residualAngle+a[0]/360*Math.PI*2)); | |
var zeta = Math.asin(a[a.length-1]*Math.sin(residualAngle+a[0]/360*Math.PI*2)/distanceRlastR1); | |
var r0 = Math.round(residualAngle*1000000)/1000000!==0?Math.sin(zeta)*a[1]/Math.sin(Math.PI-zeta-a[0]/360*Math.PI*2):a[a.length-1]; | |
var angle = i/nodeCount*360; | |
for (var j = 0,sum =0;(i/nodeCount*360>a[j]+sum && j<a.length);j+=2){ | |
sum += a[j]; | |
angle = i/nodeCount*360-sum; | |
} | |
j += 1; | |
angle = angle/360*Math.PI*2; | |
a[-1] = r0; | |
a[length] = residualAngle/Math.PI/2*360; | |
a[length+1] = r0; | |
var distanceRlastR0 = Math.sqrt(Math.pow(a[length-1],2)+Math.pow(r0,2)-2*a[length-1]*r0*Math.cos(residualAngle)); | |
var distanceRjRjmin2 = Math.sqrt(Math.pow(a[j],2)+Math.pow(a[j-2],2)-2*a[j]*a[j-2]*Math.cos(a[j-1]/360*Math.PI*2)); | |
var r; | |
if (j>length) { | |
if (Math.pow(r0,2)>= Math.pow(a[j-2],2)+Math.pow(distanceRlastR0,2)) { | |
r = Math.abs(a[j-2]*r0*Math.sin(residualAngle)/distanceRlastR0/Math.sin(-angle+Math.asin(r0*Math.sin(residualAngle)/distanceRlastR0))); | |
} else { | |
r = Math.abs(a[j-2]*r0*Math.sin(residualAngle)/distanceRlastR0/Math.sin(Math.PI-angle-Math.asin(r0*Math.sin(residualAngle)/distanceRlastR0))); | |
} | |
} else { | |
if (Math.pow(a[j],2)>=Math.pow(a[j-2],2)+Math.pow(distanceRjRjmin2,2)) { | |
r = Math.abs(a[j-2]*a[j]*Math.sin(a[j-1]/360*Math.PI*2)/distanceRjRjmin2/Math.sin(-angle+Math.asin(a[j]/distanceRjRjmin2*Math.sin(a[j-1]/360*Math.PI*2)))); | |
} else { | |
r = Math.abs(a[j-2]*a[j]*Math.sin(a[j-1]/360*Math.PI*2)/distanceRjRjmin2/Math.sin(Math.PI-angle-Math.asin(a[j]/distanceRjRjmin2*Math.sin(a[j-1]/360*Math.PI*2)))); | |
} | |
} | |
return r; | |
}, | |
moveTo:function moveTo (ID,pos,t,delay) { | |
delay = delay===undefined?0:delay; | |
var element = document.getElementById(ID); | |
var X = pos[0]!==undefined?pos[0]:pos.x; | |
var Y = pos[1]!==undefined?pos[1]:pos.y; | |
element.style.transition = "top "+t+"s ease"+" "+delay+"s,"+"left "+t+"s ease"+" "+delay+"s"; | |
element.style.top = Y+"px"; | |
element.style.left = X+"px"; | |
} | |
} | |
function initiateBlobArea (areaObject) { | |
//{id:"drawHere",width:1000,height:1000,top:0,left:0} | |
var top = areaObject.top+"px" || "0px"; | |
var left = areaObject.left+"px" || "0px"; | |
var zIndex = areaObject.zIndex || 1; | |
var width = areaObject.width+"px" || "1000px"; | |
var height = areaObject.height+"px" || "1000px"; | |
var background = areaObject.background || null; | |
var createdElement = document.createElement("div"); | |
createdElement.setAttribute("id",areaObject.id); | |
if (areaObject.parent) { | |
document.getElementById(areaObject.parent).appendChild(createdElement); | |
} else { | |
document.body.appendChild(createdElement); | |
} | |
document.getElementById(areaObject.id).style.position = "absolute"; | |
document.getElementById(areaObject.id).style.top = top; | |
document.getElementById(areaObject.id).style.left = left; | |
document.getElementById(areaObject.id).style.zIndex = zIndex; | |
document.getElementById(areaObject.id).style.width = width; | |
document.getElementById(areaObject.id).style.height = height; | |
document.getElementById(areaObject.id).style.background = background; | |
document.getElementById(areaObject.id).addEventListener("mousemove",listener); | |
areaBlob.width = parseFloat(width); | |
areaBlob.height = parseFloat(height); | |
areaBlob.top = top; | |
areaBlob.left = left; | |
areaBlob.zIndex = zIndex; | |
function listener(event){ | |
var area = document.getElementById(areaObject.id).getBoundingClientRect(); | |
coordinates = [event.clientX - area.left+0.001,event.clientY-area.top+0.001]; | |
//console.log(coordinates); | |
} | |
} | |
function blob(blobObject) { | |
//{id:"someID",width:600,height:600,nodeCount:50,origin:[300,300],maxPeriod:5,minPeriod:2,blobRadius:100,tickRadius:3,harmonicRadius:25,sync:1,randomness:0,lineWidth:100,lineOpacity:0.5,fillOpacity:0.5,attraction:0.5,bounce:1,xray:0.9} | |
//globals | |
var ID; | |
if (document.getElementById(blobObject.id)) { | |
ID = blobObject.id + blobJsCanvasCounter; | |
} else { | |
ID = blobObject.id || ("myCanvas"+blobJsCanvasCounter); | |
} | |
blobJsCanvasCounter++; | |
var width = blobObject.width===undefined?areaBlob.width:blobObject.width; | |
var height = blobObject.height===undefined?areaBlob.height:blobObject.height; | |
//var top = blobObject.top===undefined?areaBlob.top:blobObject.top; | |
//var left = blobObject.left===undefined?areaBlob.left:blobObject.left; | |
var nodeCount = blobObject.nodeCount || 10; | |
var origin = blobObject.origin || [(areaBlob.width)/2,(areaBlob.height)/2]; | |
var circlePositions = []; | |
var orCirclePositions = []; | |
var circleHarmonicLimits = []; | |
var circlePeriods = []; | |
var maxPeriod = blobObject.maxPeriod || 5; | |
var minPeriod = blobObject.minPeriod || 2; | |
var blobRadius = blobObject.blobRadius || 100; | |
var tickRadius = blobObject.tickRadius || 3; | |
var harmonicRadius = blobObject.harmonicRadius || 0.25*blobRadius; | |
var startTime; | |
var frameRate = blobObject.frameRate===undefined?1000:blobObject.frameRate; | |
var frameCount = 0; | |
var sync = blobObject.sync || 1; | |
var randomness = blobObject.randomness || 0; | |
var blobRadii = []; | |
var thetas = []; | |
var bounce = 0; | |
var bounceStrength = Math.PI*4; | |
var bounceSpeed = blobObject.bounceSpeed || 0.975; | |
var lineWidth = blobObject.lineWidth || 100; | |
var lineOpacity = blobObject.lineOpacity || 0.5; | |
var fillOpacity = blobObject.fillOpacity || 0.5; | |
var strokeStyle = blobObject.strokeStyle || "Orange"; | |
var fillStyle = blobObject.fillStyle || "Orange"; | |
var attraction = blobObject.attraction || 0.5; | |
var bounceOn = blobObject.bounce || 1; | |
var xray = blobObject.xray || 0; | |
var parentTop = blobObject.top === undefined ? "0px" : blobObject.top+"px"; | |
var parentLeft = blobObject.left === undefined ? "0px" : blobObject.left+"px"; | |
var parameter = blobObject.parameter || function(){return 1;}; | |
var parameterTime = blobObject.parameterTime || function(){return 1;}; | |
var offset = blobObject.offset===undefined? [0,0] : blobObject.offset; | |
var isStatic = blobObject.isStatic ? blobObject.isStatic : 0; | |
var phase = blobObject.phase ? blobObject.phase : 0; | |
var tick = blobObject.tick===undefined ? 1 : blobObject.tick; | |
var tickLine = blobObject.tickLine===undefined ? 1 : blobObject.tickLine; | |
//globals | |
//append the canvas element | |
var createdElement = document.createElement("canvas"); | |
createdElement.setAttribute("id",ID); | |
createdElement.setAttribute("width",width); | |
createdElement.setAttribute("height",height); | |
if (blobObject.parent) { | |
document.getElementById(blobObject.parent).appendChild(createdElement); | |
document.getElementById(ID).style.position = "absolute"; | |
document.getElementById(ID).style.top = parentTop; | |
document.getElementById(ID).style.left = parentLeft; | |
} else { | |
document.body.appendChild(createdElement); | |
document.getElementById(ID).style.position = "absolute"; | |
document.getElementById(ID).style.top = parentTop; | |
document.getElementById(ID).style.left = parentLeft; | |
} | |
document.getElementById(ID).style.zIndex = areaBlob.zIndex - 1; | |
var canvas = document.getElementById(ID); | |
var context = canvas.getContext("2d"); | |
//append the canvas element | |
function animate(timestamp) { | |
var thetaMouse = Math.atan((origin[1]+offset[1]-coordinates[1])/(origin[0]+offset[0]-coordinates[0])); | |
context.globalAlpha = xray; | |
var bounceCoeff = 1; | |
if (bounce !== 0 && !(Math.round(bounceStrength*1000)/1000 === 0)) { | |
bounceCoeff = 1+0.35*Math.sin(bounceStrength); | |
bounceStrength = bounceStrength*bounceSpeed; | |
} | |
if (!startTime){ | |
startTime = timestamp; | |
for (i=0;i<nodeCount;i++) { | |
var randomCoef = (1-randomness+randomness*Math.random()); | |
circlePositions[i]=[origin[0]+(blobRadius*randomCoef)*Math.sin(i*Math.PI*2/nodeCount),origin[1]-(blobRadius*randomCoef)*Math.cos(i*Math.PI*2/nodeCount)]; | |
orCirclePositions[i]=[origin[0]+(blobRadius*randomCoef)*Math.sin(i*Math.PI*2/nodeCount),origin[1]-(blobRadius*randomCoef)*Math.cos(i*Math.PI*2/nodeCount)]; | |
circlePeriods[i] = minPeriod+(maxPeriod-minPeriod)*Math.random(); | |
circleHarmonicLimits[i] = calculateMotionSpan(i); | |
blobRadii[i]= blobRadius*randomCoef*parameter(i,nodeCount); | |
thetas[i]=Math.atan((circleHarmonicLimits[i][1][1]-circleHarmonicLimits[i][0][1])/(circleHarmonicLimits[i][1][0]-circleHarmonicLimits[i][0][0])); | |
} | |
} | |
var currentTime = (timestamp-startTime)/1000; | |
if(currentTime*frameRate-frameCount>1 || currentTime===0){ | |
context.clearRect(0,0,width,height); | |
for (i=0;i<nodeCount;i++) { | |
var theta = thetas[i]; | |
var sign = Math.sign(origin[0]+offset[0]-coordinates[0])*Math.sign(origin[0]-circlePositions[i][0]); | |
if (i === 0 || i === nodeCount/2) { | |
sign = -Math.sign(origin[0]+offset[0]-coordinates[0]); | |
} | |
var distance = Math.min(Math.sqrt(Math.pow(coordinates[0]-origin[0]-offset[0],2)+Math.pow(coordinates[1]-origin[1]-offset[1],2)),blobRadius)/blobRadius; | |
var thetaDiff = thetaMouse-theta; | |
circlePositions[i]=[origin[0]+parameterTime(i,nodeCount,currentTime)*(blobRadii[i]+attraction*blobRadii[i]*bounceCoeff*sign*distance*Math.cos(thetaDiff))*Math.sin(i*Math.PI*2/nodeCount),origin[1]-parameterTime(i,nodeCount,currentTime)*(blobRadii[i]+attraction*blobRadii[i]*bounceCoeff*sign*distance*Math.cos(thetaDiff))*Math.cos(i*Math.PI*2/nodeCount)]; | |
orCirclePositions[i]=[origin[0]+parameterTime(i,nodeCount,currentTime)*(blobRadii[i]+attraction*blobRadii[i]*bounceCoeff*sign*distance*Math.cos(thetaDiff))*Math.sin(i*Math.PI*2/nodeCount),origin[1]-parameterTime(i,nodeCount,currentTime)*(blobRadii[i]+attraction*blobRadii[i]*bounceCoeff*sign*distance*Math.cos(thetaDiff))*Math.cos(i*Math.PI*2/nodeCount)]; | |
circleHarmonicLimits[i] = calculateMotionSpan(i); | |
} | |
for (i=0;i<nodeCount;i++){ | |
var w = 2*Math.PI/circlePeriods[i]; | |
var theta = thetas[i]; | |
var sign = sync === 1? Math.sign(nodeCount/2-i) || 1 : 1; | |
var x = orCirclePositions[i][0]+1*(harmonicRadius*Math.sin(w*currentTime+phase)*Math.cos(theta)*sign); | |
var y = orCirclePositions[i][1]+1*(harmonicRadius*Math.sin(w*currentTime+phase)*Math.sin(theta)*sign); | |
circlePositions[i] = [x,y]; | |
circleHarmonicLimits[i] = calculateMotionSpan(i); | |
context.globalAlpha = xray; | |
context.beginPath(); | |
context.arc(x,y,1,0,2*Math.PI,false); | |
context.lineWidth = 2; | |
context.strokeStyle = "Black"; | |
context.stroke(); | |
context.fillStyle = "Black"; | |
context.fill(); | |
generateTick(i); | |
} | |
for (i=0;i<nodeCount;i++){ | |
context.globalAlpha = tickLine; | |
context.beginPath(); | |
context.moveTo(origin[0],origin[1]); | |
context.lineTo(circlePositions[i][0],circlePositions[i][1]); | |
context.lineWidth = 1; | |
context.strokeStyle = "Black"; | |
context.stroke(); | |
} | |
context.beginPath(); | |
context.moveTo(circlePositions[0][0],circlePositions[0][1]); | |
context.lineJoin="round"; | |
context.lineWidth = lineWidth; | |
context.strokeStyle = strokeStyle; | |
context.fillStyle = fillStyle; | |
context.globalAlpha = lineOpacity; | |
for (i=1;i<nodeCount;i++){ | |
context.lineTo(circlePositions[i][0],circlePositions[i][1]); | |
} | |
context.closePath(); | |
context.stroke(); | |
context.globalAlpha = fillOpacity; | |
context.fill(); | |
//next frame | |
frameCount++; | |
} | |
if (bounce !== 0 && (Math.round(bounceStrength*1000)/1000 === 0)) { | |
bounce = bounce-1; | |
bounceStrength = Math.PI*4; | |
} else if (bounce === 0 && (Math.round(bounceStrength*1000)/1000 === 0)){ | |
bounceStrength = Math.PI*4; | |
} | |
var distance = Math.sqrt(Math.pow(coordinates[0]-origin[0]-offset[0],2)+Math.pow(coordinates[1]-origin[1]-offset[1],2)); | |
var thresholdRadius = (Math.max.apply(null,blobRadii)+Math.min.apply(null,blobRadii))/2; | |
if (Math.round((thresholdRadius+attraction*thresholdRadius+lineWidth/2)/distance*10)/10 === 1 && bounceOn === 1) { | |
bounce = 1; | |
bounceStrength = Math.PI*4; | |
} | |
function generateTick(order){ | |
context.globalAlpha = tick; | |
context.beginPath(); | |
context.moveTo(orCirclePositions[order][0]+harmonicRadius*Math.sin(order*Math.PI*2/nodeCount)-tickRadius*Math.cos(order*Math.PI*2/nodeCount),orCirclePositions[order][1]-harmonicRadius*Math.cos(order*Math.PI*2/nodeCount)-tickRadius*Math.sin(order*Math.PI*2/nodeCount)); | |
context.lineTo(orCirclePositions[order][0]+harmonicRadius*Math.sin(order*Math.PI*2/nodeCount)+tickRadius*Math.cos(order*Math.PI*2/nodeCount),orCirclePositions[order][1]-harmonicRadius*Math.cos(order*Math.PI*2/nodeCount)+tickRadius*Math.sin(order*Math.PI*2/nodeCount)); | |
context.lineWidth = 2; | |
context.strokeStyle = "Black"; | |
context.stroke(); | |
context.beginPath(); | |
context.moveTo(orCirclePositions[order][0]-harmonicRadius*Math.sin(order*Math.PI*2/nodeCount)-tickRadius*Math.cos(order*Math.PI*2/nodeCount),orCirclePositions[order][1]+harmonicRadius*Math.cos(order*Math.PI*2/nodeCount)-tickRadius*Math.sin(order*Math.PI*2/nodeCount)); | |
context.lineTo(orCirclePositions[order][0]-harmonicRadius*Math.sin(order*Math.PI*2/nodeCount)+tickRadius*Math.cos(order*Math.PI*2/nodeCount),orCirclePositions[order][1]+harmonicRadius*Math.cos(order*Math.PI*2/nodeCount)+tickRadius*Math.sin(order*Math.PI*2/nodeCount)); | |
context.lineWidth = 2; | |
context.strokeStyle = "Black"; | |
context.stroke(); | |
} | |
function calculateMotionSpan(order) { | |
var x1 = circlePositions[order][0]+harmonicRadius*Math.sin(order*Math.PI*2/nodeCount); | |
var x2 = circlePositions[order][0]-harmonicRadius*Math.sin(order*Math.PI*2/nodeCount); | |
var y1 = circlePositions[order][1]-harmonicRadius*Math.cos(order*Math.PI*2/nodeCount); | |
var y2 = circlePositions[order][1]+harmonicRadius*Math.cos(order*Math.PI*2/nodeCount); | |
return [[x2,y2],[x1,y1]]; | |
} | |
((function (){var x = {0:function(){window.requestAnimationFrame(animate)},1:function(){}}; return x[isStatic]})())(); | |
} | |
window.requestAnimationFrame(animate); | |
}; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!--Copyright Ibrahim Tanyalcin 2013-2015.--> | |
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1"> | |
<title>Blob.js by Ibrahim Tanyalcin</title> | |
<script src="https://cdn.rawgit.com/IbrahimTanyalcin/80d8f6687dd8f29f90fa30b70fe47a8b/raw/d1d8502fa6ac1cabb85c088b1f2d68ec5a2b002f/blob1.0.4.7.js" type="text/javascript"></script> | |
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script> | |
<script src="https://apis.google.com/js/platform.js" async defer></script> | |
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script> | |
<style type ="text/css"> | |
@font-face{ | |
font-family: "mystery"; | |
src: url("./fonts/mystery.ttf"); | |
} | |
@font-face{ | |
font-family: "freckle"; | |
src: url("./fonts/Asap-Regular.ttf"); | |
} | |
html { | |
background:gray; | |
margin-left:auto; | |
margin-right:auto; | |
} | |
body { | |
padding-left:50px; | |
position:relative; | |
margin-left:auto; | |
margin-right:auto; | |
background: white; | |
width: 800px; | |
height:2000px; | |
} | |
#textDiv { | |
position:relative; | |
margin-left:auto; | |
margin-right:auto; | |
top:100px; | |
text-align: center; | |
font-family: "mystery"; | |
} | |
#par{ | |
position:relative; | |
margin-left:auto; | |
margin-right:auto; | |
top:50px; | |
width:700px; | |
text-align: left; | |
font-family: "freckle"; | |
font-size: 16px; | |
opacity:0.8; | |
line-height: 60px; | |
padding-right:100px; | |
} | |
#par2,#par3,#par4,#par5,#par6,#par7,#par8,#par9{ | |
position:relative; | |
margin-left:auto; | |
margin-right:auto; | |
//top:700px; | |
width:700px; | |
text-align: left; | |
font-family: "freckle"; | |
font-size: 14px; | |
opacity:0.8; | |
line-height: 60px; | |
//overflow-y: scroll; | |
padding-right:100px; | |
} | |
#div1 { | |
position: absolute; | |
top:435px; | |
left:0px; | |
} | |
#drawHere { | |
overflow: hidden; | |
} | |
#button { | |
position: absolute; | |
top:400px; | |
left:400px; | |
} | |
#___plusone_0 { | |
position: absolute; | |
top: 350px; | |
left: 255px; | |
z-index: 100; | |
} | |
#twitterDiv{ | |
position: absolute; | |
top: 350px; | |
left:330px; | |
z-index: 100; | |
} | |
.fb-share-button { | |
position: absolute; | |
top: 350px; | |
left: 370px; | |
z-index: 100; | |
} | |
#linkedinShare{ | |
position: absolute; | |
top: 350px; | |
left: 540px; | |
z-index: 100; | |
} | |
#github { | |
position:absolute; | |
top: 350px; | |
left: 50px; | |
z-index: 100; | |
} | |
</style> | |
<!-- Start of Google Analytics Code for Default Guide --> | |
<script> | |
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ | |
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), | |
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) | |
})(window,document,'script','//www.google-analytics.com/analytics.js','ga'); | |
ga('create', 'UA-60672496-1', 'auto'); | |
ga('send', 'pageview'); | |
</script> | |
<!-- End of Google Analytics Code for Default Guide --> | |
<script src="//platform.linkedin.com/in.js" type="text/javascript"> lang: en_US</script> | |
</head> | |
<body> | |
<div id="github"><a class="github-button" href="https://github.com/IbrahimTanyalcin" data-style="mega" data-count-href="/IbrahimTanyalcin/followers" data-count-api="/users/IbrahimTanyalcin#followers" data-count-aria-label="# followers on GitHub" aria-label="Follow @IbrahimTanyalcin on GitHub">Follow @Ibrahim</a></div> | |
<div id="linkedinShare"><script type="IN/Share" data-url="http://i-pv.org/blob.html" data-counter="right"></script></div> | |
<div id="fb-root"></div> | |
<script>(function(d, s, id) { | |
var js, fjs = d.getElementsByTagName(s)[0]; | |
if (d.getElementById(id)) return; | |
js = d.createElement(s); js.id = id; | |
js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.5"; | |
fjs.parentNode.insertBefore(js, fjs); | |
}(document, 'script', 'facebook-jssdk'));</script> | |
<div class="fb-share-button" data-href="http://i-pv.org/blob.html" data-layout="button_count"></div> | |
<div id="twitterDiv"> | |
<a href="https://twitter.com/share" class="twitter-share-button" data-size="large" data-hashtags="Javascript">Tweet</a> | |
</div> | |
<div id="googlePlusOne" class="g-plusone"></div> | |
<div id="textDiv"><span style="font-size:40px;font-weight:900;color:darkslategray;opacity:0.7;">BLOB.js<span style="font-size:30px;font-weight:400;color:darkslategray;opacity:0.9;">v1.0.4.7</span></span><br><span style="font-size:30px;font-weight:normal;font-style:italic;color:slategray;opacity:0.9;">Drawing shapes and rendering scenes..</span> | |
<div id="par" style="height:739px;"> | |
<span style="text-align:center;color:red;font-size:15px;display:block;line-height:15px;font-style:italic;opacity:0.65;width:300px;margin-left:auto;margin-right:auto;">Below are the quick links:</span> | |
<span style="background:orange;display:table;text-align:center;margin-left:auto;margin-right:auto;width:300px;border-radius:25px;transition:background 1s ease;line-height:30px;" onmouseover="this.childNodes[0].parentElement.style.backgroundColor = 'DeepPink';" onmouseout="this.childNodes[0].parentElement.style.backgroundColor = 'orange';"><a href="./blob.html" style="color:gray;font-family:helvetica;text-decoration:none;">INTRODUCTION</a></span> | |
<span style="background:orange;display:table;text-align:center;margin-left:auto;margin-right:auto;width:300px;border-radius:25px;transition:background 1s ease;line-height:30px;" onmouseover="this.childNodes[0].parentElement.style.backgroundColor = 'DeepPink';" onmouseout="this.childNodes[0].parentElement.style.backgroundColor = 'orange';"><a href="./blob2.html" style="color:gray;font-family:helvetica;text-decoration:none;">RENDERING SHAPES</a></span><br> | |
</div> | |
</div> | |
<button id="button" onclick="render()">redraw</button> | |
<div id="div1"></div> | |
<script type="text/javascript"> | |
var data = {}; | |
var stack = {}; | |
var level = 20; | |
var step = 255/40; | |
var generator = d3.random.normal(127.5,50); | |
var timeout; | |
initiateBlobArea({id:"drawHere",width:850,height:800,top:0,left:0,parent:"div1"}); | |
function del() { | |
var nodeListCanvas = document.querySelectorAll("canvas"); | |
for (i=0;i<nodeListCanvas.length;i++){ | |
nodeListCanvas[i].remove(); | |
} | |
} | |
function render() { | |
del(); | |
initiateStack(); | |
clearTimeout(timeout); | |
for (var k=0;k<20;k++) { | |
for (var j=0;j<40;j++){ | |
generateBin(k,j,6); | |
} | |
} | |
function generateBin (k,j,r) { | |
//var rnd = Math.round(Math.random()*765/3); | |
var rnd = Math.round(Math.min(Math.max(0,generator()),255)); | |
var color = "rgba("+rnd+","+rnd+","+rnd+",1)"; | |
blob({width:2*r,height:3*r,top:0+k*3/2*r,left:220+j*r*Math.sqrt(3)+(k%2)*r/2*Math.sqrt(3),nodeCount:6,origin:[r,3/2*r],blobRadius:r,lineWidth:1,strokeStyle:"Black",fillStyle:color,randomness:0,fillOpacity:0.5,lineOpacity:0.8,minPeriod:3,maxPeriod:3,id:"myCanvas"+k+","+j,harmonicRadius:r*0.1,attraction:0.0001,bounce:1,xray:0,parent:"drawHere",tick:0,tickLine:0,isStatic:1}); | |
data["myCanvas"+k+","+j] = rnd; | |
} | |
timeout = setTimeout(function(){ | |
for (var k=level;k>=1;k--) { | |
sort(k,6); | |
} | |
},3000); | |
} | |
render(); | |
function initiateStack() { | |
for (var i = 0;i<41;i++) { | |
stack[i] = 0; | |
} | |
} | |
function sort(level,r) { | |
for (var j = 0;j<40;j++) { | |
var rnd = data["myCanvas"+(level-1)+","+j]; | |
var stackKey = Math.round(rnd/step); | |
var stackH = 220+(40-Math.round(rnd/step))*Math.sqrt(3)*r; | |
//console.log(48-Math.round(rnd/step)); | |
var stackV = 190+2*r*(stack[stackKey]+19); | |
blobTools.moveTo("myCanvas"+(level-1)+","+j,[stackH,stackV],3,0); | |
stack[stackKey]--; | |
} | |
} | |
</script> | |
<script async defer id="github-bjs" src="https://buttons.github.io/buttons.js"></script> | |
</body> | |
</html> | |
<!--Copyright Ibrahim Tanyalcin 2013-2015.--> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment