this.x = x || 1;
this.y = y || 0;
this.z = z || 1.001;
this.scale = scale || 1;
this.alpha = alpha || 1.0;
this.color = color || “#fff”;
this.vel = vel || [0,0,0];
this.ttl = Math.random()*ttl + 1;
this.sttl = this.ttl;
}
function render() {
if(!blur) {
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
} else {
ctx.fillStyle = ‘rgba(0,0,0,’+blurf+‘)’;
ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);
}
plane.draw();
for(var i = 0; i < points.length;i++) {
pt = process(points[i]);
drawCircle(pt.x, pt.y, points[i].scale*pt.scale, 1, points[i].color);
}
animate();
requestAnimFrame(render);
}
function animate() {
var time = new Date().getTime();
var t = (time - last) / 1000;
t = t > 0.3 ? 0.3 : t; // HACK - clamp time so it doesnt go haywire when last grows large cus render stops
for(var i = 0; i < points.length;i++) {
points[i].ttl -= t;
points[i].x += points[i].vel[0] * t;
points[i].y += points[i].vel[1] * t;
points[i].z += points[i].vel[2] * t;
points[i].vel[1] += gravity;
points[i].scale = (points[i].ttl/points[i].sttl);
points[i].color = “hsla(”+(color+(points[i].ttl/points[i].sttl)*30)+“,100%, “+(points[i].ttl/points[i].sttl)*100+”%,1.0)”;
if(points[i].ttl < 0) {
points.splice(i,1);
points.push( createpoint() );
}
if((points[i].y+points[i].scale/2) >= plane.cy) {
points[i].vel[1] = -points[i].vel[1] * bounce + gravity*1.25; // + grav, keeps them from bouncing forever
points[i].y = plane.cy-(points[i].scale/2);
}
}
last = time;
}
function drawCircle(x, y, r, w, color) {
ctx.fillStyle = color;
ctx.lineWidth = w;
ctx.beginPath();
ctx.arc(x, y, (r>0?r:0), 0, Math.PI*2);
ctx.fill();
}
function drawLine(sx,sy, x, y, color) {
ctx.strokeStyle = color;
ctx.beginPath();
ctx.moveTo(sx,sy);
ctx.lineTo(x, y);
ctx.stroke();
}
function process(pt) {
var p = rotate(pt);
return project§;
}
function rotate(pt) {
var p = sCopy(pt);
p.x = (pt.x)*Math.cos(ry)-(pt.z)*Math.sin(ry);
p.z = (pt.x)*Math.sin(ry)+(pt.z)*Math.cos(ry) + z;
p.scale = pt.scale;
return p;
}
function project(pt) {
var p = sCopy(pt);
p.x = ctx.canvas.width/2 + (pt.x * (dist/pt.z));
p.y = ctx.canvas.height/2 + (pt.y * (dist/pt.z));
p.scale = (dist/pt.z);
return p;
}
function init() {
points = [];
for(var i = 0; i < numpts;i++){
points.push( createpoint() );
points[i].ttl = 0;
}
}
function createpoint() {
return new Point(
Math.random()*2-1,
Math.random()*2-1,
Math.random()*2-1,
undefined, //Math.random()+0.1,
“#f0f”,
.5,
[Math.random()xvel-xvel/2, Math.random()-yvel, Math.random()*zvel-zvel/2]
);
}
function sCopy(obj) {
var o = {};
for(var a in obj) {
if(obj.hasOwnProperty(a)){ o[a] = obj[a]; }
}
return o;
}
window.addEventListener(‘load’, onLoad, false);
function onLoad(evt) {
var canvas = document.querySelector(‘canvas’);
ctx = canvas.getContext(“2d”);
window.onresize = function () {
ctx.canvas.height = document.body.offsetHeight;
ctx.canvas.width = document.body.offsetWidth;
};
window.onresize();
canvas.addEventListener(‘mousedown’, function(evt) { mouse = true;
lastx=((evt.layerX||evt.offsetX||evt.clientX) - ctx.canvas.width/2)/ctx.canvas.width * Math.PI*2;;
lasty=(-evt.layerY||evt.offsetY||evt.clientY);
});
canvas.addEventListener(‘mouseup’, function(evt) { mouse = false; });
canvas.addEventListener(‘mousemove’, function(evt) {
if(!mouse)return;
var ex = ( evt.layerX||evt.offsetX||evt.clientX);
var ey = (-evt.layerY||evt.offsetY||evt.clientY);
var r = ((ex - ctx.canvas.width/2)/ctx.canvas.width) * Math.PI*2;
ry += r - lastx;
lastx = r;
z += ey - lasty;
if(z > 1000) {z = 1000; }
if(z < 30) {z = 30; }
lasty = ey;
});
init();
render();
}
var gui = new dat.GUI();
gui.close();
var c = gui.add(window, “numpts”,1, 2000);
gui.add(window, “bounce”, 0.1, 0.8);
gui.add(window, “color”, 0, 360);
gui.add(window, “ttl”, 0, 40);
gui.add(window, “gravity”, 0.1, 30);
gui.add(window, “xvel”, 1, 100);
gui.add(window, “yvel”, 1, 100);
gui.add(window, “zvel”, 1, 100);
gui.add(window, “blurf”, 0.1, 0.9);
gui.add(window, “blur”, false, true);
var to;
c.onChange(function(value) {
clearTimeout(to);
to = setTimeout(init, 500);
});
window.requestAnimFrame = (function(){
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
mg-B87uFfaB-1715746020788)]
[外链图片转存中…(img-nlip95st-1715746020788)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!