html5 可旋转的三维树形结构,利用HTML5实现勾股树植物生长动画特效
特效描述:利用HTML5实现 勾股树 植物生长 动画特效。利用HTML5实现勾股树植物生长动画特效
代码结构
1. HTML代码
const canvas = document.querySelector("#canvas");
const context = canvas.getContext("2d", { alpha: false });
let vw = canvas.width = window.innerWidth;
let vh = canvas.height = window.innerHeight;
// let boxSize = Math.min(vw / 6, vh / 4);
let boxSize = 80;
const maxLevel = 10;
const roundTo = 1000;
const color1 = { h: 69, s: 75, l: 51 };
const color2 = { h: 288, s: 98, l: 17 };
const colors = getColors(color1, color2, maxLevel + 2);
const mouse = {
x: vw / 2,
y: vh / 2
};
let count = 0;
let lean = 0;
let scale = 0;
let resized = false;
let requestId = null;
let x = (vw - boxSize) / 2;
let y = vh;
//
// CALC BRANCHES
// ================================================================================
const calcBranches = (function() {
let memo = {};
let memoize = function(width, scale, lean) {
const memoKey = `${width}-${scale}-${lean}`;
if (!memo[memoKey]) {
const currentH = width * scale;
const result = {
leftSize: Math.sqrt(currentH ** 2 + (width * (0.5 - lean)) ** 2),
rightSize: Math.sqrt(currentH ** 2 + (width * (0.5 + lean)) ** 2),
leftAngle: Math.atan(currentH / ((0.5 - lean) * width)),
rightAngle: Math.atan(currentH / ((0.5 + lean) * width))
};
memo[memoKey] = result;
memoize.count++;
}
return memo[memoKey];
}
memoize.count = 0;
memoize.cache = memo;
return memoize;
})();
window.addEventListener("resize", onResize);
window.addEventListener("mousemove", onMouseMove);
update();
//
// DRAW TREE
// ================================================================================
function drawTree(size, scale, lean, level) {
if (size < 1) {
count += 2;
return;
}
size = Math.round(size * roundTo) / roundTo;
const { leftSize, leftAngle, rightSize, rightAngle } = calcBranches(size, scale, lean);
context.save();
context.fillRect(0, 0, size, -size);
context.fillStyle = colors[level];
context.translate(0, -size);
context.rotate(-leftAngle);
if (level) {
drawTree(leftSize, scale, lean, level - 1);
} else {
context.fillRect(0, 0, leftSize, -leftSize);
}
context.translate(leftSize, 0);
context.rotate(rightAngle + leftAngle);
if (level) {
drawTree(rightSize, scale, lean, level - 1);
} else {
context.fillRect(0, 0, rightSize, -rightSize);
}
context.restore();
}
//
// UPDATE
// ================================================================================
function update() {
if (resized) {
vw = canvas.width = window.innerWidth;
vh = canvas.height = window.innerHeight;
// boxSize = Math.min(vw / 6, vh / 4);
x = (vw - boxSize) / 2;
y = vh;
}
scale = Math.round(map(mouse.y, vh, 0, 0, 0.8) * roundTo) / roundTo;
lean = Math.round(map(mouse.x, 0, vw, 0.5, -0.5) * roundTo) / roundTo;
context.fillStyle = "white";
context.fillRect(0, 0, vw, vh);
context.save();
context.fillStyle = colors[maxLevel+1];
context.translate(x, y);
drawTree(boxSize, scale, lean, maxLevel, maxLevel);
context.restore();
resized = false;
requestId = null;
}
//
// GET COLORS
// ================================================================================
function getColors(c1, c2, steps) {
const colors = [];
for (let i = 0; i < steps; i++) {
const t = i / (steps - 1);
const h = Math.round(lerp(c1.h, c2.h, t));
const s = Math.round(lerp(c1.s, c2.s, t));
const l = Math.round(lerp(c1.l, c2.l, t));
colors.push(`hsl(${h},${s}%,${l}%)`);
}
return colors;
}
//
// ON MOUSE MOVE
// ================================================================================
function onMouseMove(event) {
mouse.x = event.clientX;
mouse.y = event.clientY;
if (!requestId) {
requestId = requestAnimationFrame(update);
}
}
//
// ON RESIZE
// ================================================================================
function onResize() {
resized = true;
if (!requestId) {
requestId = requestAnimationFrame(update);
}
}
function lerp(a, b, t) {
return a + (b - a) * t;
}
function map(x, a, b, c, d) {
return c + (d - c) * ((x - a) / (b - a)) || 0;
}
html5 可旋转的三维树形结构,利用HTML5实现勾股树植物生长动画特效相关推荐
- android 五彩纸屑动画,利用H5实现Canvas五彩纸屑飘落动画特效
特效描述:利用H5实现 Canvas 五彩纸屑飘落 动画特效.利用H5实现Canvas五彩纸屑飘落动画特效 代码结构 1. HTML代码 "use strict"; var _cr ...
- html5实现粒子效果的文字,利用HTML5实现Canvas粒子文字特效
特效描述:利用HTML5实现 Canvas 粒子文字特效.利用HTML5实现Canvas粒子文字特效 代码结构 1. HTML代码 change /*jshint esversion:6*/ var ...
- html5如何写出圆背景,利用HTML5实现Canvas虚幻圆点背景特效
特效描述:利用HTML5实现 Canvas 虚幻圆点 背景特效.利用HTML5实现Canvas虚幻圆点背景特效 代码结构 1. 引入JS 2. HTML代码 (function($){ var can ...
- 苹果手机html5摇一摇游戏戏码,利用HTML5的devicemotion事件实现手机摇一摇抽奖,年会抽奖,html5devicemotion...
利用HTML5的devicemotion事件实现手机摇一摇抽奖,年会抽奖,html5devicemotion 摇一摇JS脚本逻辑: 接下来是移动端JS脚本逻辑的实现,摇一摇的实现需借助html5新增的 ...
- html5经纬度定位 源码_利用HTML5定位功能获取经纬度,在根据经纬度利用百度地图获取位置信息...
一.引入相关js 二.js代码 // 单次位置请求执行的函数 function getLocation(){ navigator.geolocation.getCurrentPosition(mapI ...
- html5简单制作效果,分享一个利用HTML5制作的海浪效果代码-H5教程
在前面简单讲述了一下HTML里的Canvas,这次根据Canvas完成了"海浪效果"(水波上升). (O(∩_∩)O哈哈哈~作者我能看这个动画看一下午) 上升水波.gif动画分析 ...
- 利用HTML5+CSS3+JS实现简单的钟表
HTML5+CSS3+JS实现动态时钟 利用HTML5+CSS3+JS实现简单的钟表,仅供参考学习 效果图: 在线效果预览 思路: 1. 先定义一个类名为timepiece的圆表表盘 HTML: &l ...
- 让人脸动起来html源码,分享利用HTML5的Canvas制作人脸的实例代码
这里主要使用了 HTML5 的 Canvas 进行绘制.利用html5制作人脸的实例代码. 先看我们要绘制的人脸效果图: 这里主要使用了 HTML5 的 Canvas 进行绘制. 下面我们开始整个绘制 ...
- 分享web前端七款HTML5 Loading动画特效集锦
以前我们大部分的Loading动画都是利用gif图片实现的,这种图片实现Loading动画的方法虽然也很不错,但是作为HTML5开发者来说,如果能利用HTML5和CSS3实现这些超酷的Loading动 ...
最新文章
- java double转换符_java中字符串怎么转换成double类型
- 2字节取值范围_第二篇——整数和浮点数在计算机中的表示(2)
- 认识探头(一) (转)
- DSS流媒体服务器搭建
- 实际生产中,微服务用 Spring Cloud 多还是 Dubbo 多?
- VC6编译64位程序
- 最新老男孩Linux云计算sre学什么
- vyos配置ds-nat
- Python计算流体动力学(CFD)模拟人体呼吸系统
- 分布式共识算法——Gossip协议(图解)
- mysql查询这一周数据库_MYSQL查询一周,一月内的数据
- 三端口 DC-DC 变换器(C 题)-- 2021年全国大学生电子设计竞赛试题
- kettle与MySQL数据库建立连接教程
- MATLAB---读取STL文件并解析
- mysql在线考试的设计_在线考试系统设计与实现(MySQL)
- Mina中的Pasta(Pallas和Vesta)曲线
- mysql 存储过程 varchar 赋值,mysql 存储过程中变量的定义与赋值操作
- 【转】免费学术资源网址
- arm 关于m a r系列区别
- 实现一个自主飞行的无人机需要的技术:定位导航-环境感知-目标感知-控制规划