c2
Version:
d3 component canvas
174 lines (151 loc) • 5.41 kB
JavaScript
window.addEventListener('DOMContentLoaded',function () {
var content = document.querySelector('.content');
load();
})
function load () {
var Proxy = c2.element(function (context,d,i) {
var j,jln,children = this.children,child;
for (var i=0,ln=contexts.length,ctx;i<ln;i++) {
ctx = contexts[i];
ctx.canvas.height = ctx.canvas.height;
}
//for (var i=0,ln=contexts.length,ctx;i<ln;i++) {
//ctx = contexts[i];
//ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height);
//ctx.canvas.height = ctx.canvas.height;
for (j=0,jln=children.length;j<jln;j++) {
child = children[j];
//if (
//child.x < ctx.right && (child.x+child.w) > ctx.left &&
//child.y < ctx.bottom && (child.y+child.h) > ctx.top
//) {
//child.render(ctx);
child.render();
//}
//children[j].render(ctx);
}
//}
});
var Rect = c2.element(function (context,d,i) {
var x=this.x,y=this.y,w=this.w,h=this.h,ctx;
for (var i=0,ln=contexts.length;i<ln;i++) {
ctx = contexts[i];
contexts[i].fillRect(x - ctx.left,y-ctx.top,w,h);
}
}).attributes({
x : c2.types.float,
y : c2.types.float,
w : c2.types.float,
h : c2.types.float
});
var data = [],
content = d3.select('.content'),
num_data = 64000,
num_groups = 5;
for (var i=0,ln=num_data;i<ln;i++) {
data.push({
value : Math.random(),
id : i
});
}
content.datum(data)
var
layerSize = 550,
layerColumns = Math.ceil(window.innerWidth / layerSize),
layerRows = Math.ceil(window.innerHeight / layerSize),
num_groups = layerColumns * layerRows,
ctx,
canvas,
canvases =[],
contexts = [];
document.body.style.width = (layerColumns * layerSize) + 'px'
document.body.style.height = (layerRows * layerSize) + 'px'
console.error(num_groups,layerColumns);
for (var i=0,ln=num_groups;i<ln;i++) {
canvas = document.createElement('canvas');
canvas.width = layerSize;
canvas.height = layerSize;
contexts.push(ctx=canvas.getContext('2d'));
ctx.top = (Math.floor(i / layerColumns) * layerSize)
ctx.left = ((i % layerColumns) * layerSize)
ctx.size = layerSize;
ctx.right = ctx.left + layerSize;
ctx.bottom = ctx.top + layerSize;
canvas.style.top = ctx.top + 'px'
canvas.style.left = ctx.left + 'px'
canvas.style.zIndex=i;
canvases.push(canvas);
document.body.appendChild(canvas);
}
var layers = d3.select(new Proxy());
var direction = 1,
width = window.innerWidth - 450,
height = window.innerHeight-50,
last_size = data.length;
//width/=2
//height/=2
//layers.attr('height',(height)|0);
//layers.attr('width',(width)|0);
//layers.style('width',(width)+'px');
//layers.style('height',(height)+'px');
//layers.style('transform','translate3d(-25%,-25%,0)scale(0.5)');
//layers.style('z-index',(d,i)=>i)
function render () {
var cnt=0;
//return;
//return;
//console.error(contexts.node().context.imageSmoothingEnabled=false)
//contexts.node().context.translate(0.5,0.5)
//return;
var lastSize = last_size,
xScale = d3.scaleLinear().range([25,width-50]).domain([0,data.length]),
yScale = d3.scaleLinear().range([25,height-50]).domain([0,d3.max(data,(d)=>d.value)])
var elements = layers.selectAll(Rect).data(data);
elements = elements.enter().append(Rect)
.attr('x',width)
.attr('y',(d)=>height-yScale(d.value)/2)
.attr('w',0)
.attr('h',0)
.merge(elements)
.call(
c2.animate()
.duration(2000)
.ease(d3.easeLinear)
.delay((d,i)=> direction === -1 ? Math.max((lastSize-d.id)/50,1) : Math.max(d.id/50,1))
.to({
x : (d,i) => xScale(d.id),
y : (d,i) => (d._y = yScale(d.value),(height-25)-d._y),
w : Math.max(width/data.length-0.5,1),
h : (d,i) => Math.max(d._y,1)
})
)
}
render()
}
/*
*function test (start,end,data) {
* var data = [];
* for (var i=1,ln=start;i<ln;i++) {
* data.push(i);
* }
*
* function innerTest (next) {
* var result,arr,v,j,jln,k,kln;
* data.push(next);
* for (var num_groups=1,ln=next;num_groups<=ln;num_groups++) {
* result = Array.apply(null,new Array(num_groups)).map((d,i) => data.slice(Math.ceil((data.length/num_groups)*i),Math.ceil((i+1)*(data.length/num_groups))));
* v=1;
* for (j=0,jln=result.length;j<jln;j++) {
* arr = result[j];
* for (k=0,kln=arr.length;k<kln;k++) {
* if (arr[k] !== v++) {
* throw "NOT RIGHT"
* }
* }
* }
* }
* next < end && innerTest(next+1)
* }
* innerTest(start);
*}
*/