index.js
var width, height;
var canvas = document.querySelector(‘canvas’);
canvas.width = width = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
canvas.height = height = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
var ctx = canvas.getContext(‘2d’);
ctx.translate(canvas.width / 2, canvas.height / 2);
var points = [];
var depth = 8;
var scale = 70;
for (var x = -depth/2; x <= depth/2; x++) {
for (var y = -depth/2; y <= depth/2; y++) {
for (var z = -depth/2; z <= depth/2; z++) {
points.push([x * scale, y * scale, z * scale]);
}
}
}
var minDistance = 1000;
var maxDistance = 2000;
var f = 500;
var rot = 0;
var direction = -1;
var distance;
ctx.fillStyle = ‘#333’;
requestAnimationFrame(function loop() {
rot += .75;
distance = maxDistance - (maxDistance - minDistance) * Math.abs(Math.sin(rot/100));
ctx.clearRect( -width / 2, -height / 2, width, height);
var cpm = [
[f, 0, 0, 0],
[0, f, 0, 0],
[0, 0, 1, distance]
];
var rotX = getRotateY(rot);
var rotY = getRotateY(rot*2);
var rotZ = getRotateZ(rot*3);
var transformMatrix = matrixMultiply(rotY, rotZ);
transformMatrix = matrixMultiply(transformMatrix, rotX);
points
.forEach(function(point) {
var imagePoint = getImagePoint(matrixTimesVec(transformMatrix, point), cpm);
if (imagePoint[2] < 0) { return; }
var size = 5 * f / imagePoint[2];
var x = imagePoint[0] / imagePoint[2];
var y = imagePoint[1] / imagePoint[2];
ctx.beginPath();
ctx.arc(x, y, size, 0, 2 * Math.PI, true);
ctx.fill();
});
requestAnimationFrame(loop);
});
function getImagePoint(point3D, cameraProjectionMatrix) {
// make homogenous
var homogenousPoint3D = point3D.concat([1]);
return matrixTimesVec(cameraProjectionMatrix, homogenousPoint3D);
}
function add(a, b) { return a + b; }
function getRotateZ(deg) {
var rad = deg * Math.PI / 180;
var cos = Math.cos(rad);
var sin = Math.sin(rad);
return [
[cos, -sin, 0],
[sin, cos, 0],
[ 0, 0, 1]
];
}
function getRotateY(deg) {
var rad = deg * Math.PI / 180;
var cos = Math.cos(rad);
var sin = Math.sin(rad);
return [
[ cos, 0, sin],
[ 0, 1, 0],
[-sin, 0, cos]
];
}
function getRotateX(deg) {
var rad = deg * Math.PI / 180;
var cos = Math.cos(rad);
var sin = Math.sin(rad);
return [
[1, 0, 0],
[0, cos, -sin],
[0, sin, cos]
];
}
function matrixTimesVec(matrix, vec) {
return deepCopy(matrix).map(function(row) {
return row.map(function(cell, i) {
return cell * vec[i];
}).reduce(add, 0);
});
}
function deepCopy(arr) {
return arr.slice(0).map(function(v) {
return Array.isArray(v) ? deepCopy(v) : v;
});
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
资料过多,篇幅有限,需要文中全部资料可以点击这里免费获取前端面试资料PDF完整版!
自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。
这些内容对你有帮助,可以扫码获取!!(备注:前端)**
[外链图片转存中…(img-TgMaPxPN-1713612770020)]
最后
[外链图片转存中…(img-C0mhGkck-1713612770020)]
[外链图片转存中…(img-M2DJ7tTY-1713612770020)]
资料过多,篇幅有限,需要文中全部资料可以点击这里免费获取前端面试资料PDF完整版!
自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。