Canvas 梦幻树生长动画

这篇具有很好参考价值的文章主要介绍了Canvas 梦幻树生长动画。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

canvas实例应用100+ 专栏提供canvas的基础知识,高级动画,相关应用扩展等信息。
canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重要的帮助。

canvas可以制作出非常炫酷的动画,以下是一个梦幻树的示例。

效果图

Canvas 梦幻树生长动画,canvas实例应用100+,javascript,开发语言,ecmascript文章来源地址https://www.toymoban.com/news/detail-744727.html

源代码

							<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>梦幻数生长动画</title>

<script type="text/javascript" src=" http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript">
(function ($) {

	var Vector = function (x, y) {

		this.x = x || 0;

		this.y = y || 0;

	};

	Vector.prototype = {

		add: function (v) {

			this.x += v.x;

			this.y += v.y;

			return this;

		},

		length: function () {

			return Math.sqrt(this.x * this.x + this.y * this.y);

		},

		rotate: function (theta) {

			var x = this.x;

			var y = this.y;

			this.x = Math.cos(theta) * this.x - Math.sin(theta) * this.y;

			this.y = Math.sin(theta) * this.x + Math.cos(theta) * this.y;

			//this.x = Math.cos(theta) * x - Math.sin(theta) * y;

			//this.y = Math.sin(theta) * x + Math.cos(theta) * y;

			return this;

		},

		mult: function (f) {

			this.x *= f;

			this.y *= f;

			return this;

		}

	};



	var Leaf = function (p, r, c, ctx) {

		this.p = p || null;

		this.r = r || 0;

		this.c = c || 'rgba(255,255,255,1.0)';

		this.ctx = ctx;

	}



	Leaf.prototype = {

		render: function () {

			var that = this;

			var ctx = this.ctx;

			var f = Branch.random(1, 2)

			for (var i = 0; i < 5; i++) {

				(function (r) {

					setTimeout(function () {

						ctx.beginPath();

						ctx.fillStyle = that.color;

						ctx.moveTo(that.p.x, that.p.y);

						ctx.arc(that.p.x, that.p.y, r, 0, Branch.circle, true);

						ctx.fill();

					}, r * 60);

				})(i);

			}

		}

	}





	var Branch = function (p, v, r, c, t) {

		this.p = p || null;

		this.v = v || null;

		this.r = r || 0;

		this.length = 0;

		this.generation = 1;

		this.tree = t || null;

		this.color = c || 'rgba(255,255,255,1.0)';

		this.register();

	};



	Branch.prototype = {

		register: function () {

			this.tree.addBranch(this);

		},

		draw: function () {

			var ctx = this.tree.ctx;

			ctx.beginPath();

			ctx.fillStyle = this.color;

			ctx.moveTo(this.p.x, this.p.y);

			ctx.arc(this.p.x, this.p.y, this.r, 0, Branch.circle, true);

			ctx.fill();

		},

		modify: function () {

			var angle = 0.18 - (0.10 / this.generation);

			this.p.add(this.v);

			this.length += this.v.length();

			this.r *= 0.99;

			this.v.rotate(Branch.random(-angle, angle)); //.mult(0.996);

			if (this.r < 0.8 || this.generation > 10) {

				this.tree.removeBranch(this);

				var l = new Leaf(this.p, 10, this.color, this.tree.ctx);

				l.render();

			}

		},

		grow: function () {

			this.draw();

			this.modify();

			this.fork();

		},

		fork: function () {

			var p = this.length - Branch.random(100, 200); // + (this.generation * 10);

			if (p > 0) {

				var n = Math.round(Branch.random(1, 3));

				this.tree.stat.fork += n - 1;

				for (var i = 0; i < n; i++) {

					Branch.clone(this);

				}

				this.tree.removeBranch(this);

			}

		}

	};



	Branch.circle = 2 * Math.PI;

	Branch.random = function (min, max) {

		return Math.random() * (max - min) + min;

	};

	Branch.clone = function (b) {

		var r = new Branch(new Vector(b.p.x, b.p.y), new Vector(b.v.x, b.v.y), b.r, b.color, b.tree);

		r.generation = b.generation + 1;

		return r;

	};

	Branch.rgba = function (r, g, b, a) {

		return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';

	};

	Branch.randomrgba = function (min, max, a) {

		return Branch.rgba(Math.round(Branch.random(min, max)), Math.round(Branch.random(min, max)), Math.round(Branch.random(min, max)), a);

	};



	var Tree = function () {

		var branches = [];

		var timer;

		this.stat = {

			fork: 0,

			length: 0

		};

		this.addBranch = function (b) {

			branches.push(b);

		};

		this.removeBranch = function (b) {

			for (var i = 0; i < branches.length; i++) {

				if (branches[i] === b) {

					branches.splice(i, 1);

					return;

				}

			}

		};

		this.render = function (fn) {

			var that = this;

			timer = setInterval(function () {

				fn.apply(that, arguments);

				if (branches.length > 0) {

					for (var i = 0; i < branches.length; i++) {

						branches[i].grow();

					}

				}

				else {

					//clearInterval(timer);

				}

			}, 1000 / 30);

		};

		this.init = function (ctx) {

			this.ctx = ctx;

		};

		this.abort = function () {

			branches = [];

			this.stat = {

				fork: 0,

				length: 0

			}

		};

	};





	function init() {



		// init



		var $window = $(window);

		var $body = $("body");

		var canvas_width = $window.width();

		var canvas_height = $window.height();

		var center_x = canvas_width / 2;

		var stretch_factor = 600 / canvas_height;

		var y_speed = 3 / stretch_factor;

		var $statMsg = $("#statMsg");



		// tx



		var canvas = $('#canvas')[0];

		canvas.width = canvas_width;

		canvas.height = canvas_height;

		var ctx = canvas.getContext("2d");

		ctx.globalCompositeOperation = "lighter";



		// tree



		var t = new Tree();

		t.init(ctx);

		for (var i = 0; i < 3; i++) {

			new Branch(new Vector(center_x, canvas_height), new Vector(Math.random(-1, 1), -y_speed), 15 / stretch_factor, Branch.randomrgba(0, 255, 0.3), t);

		}

		t.render(function () {

			$statMsg.html(this.stat.fork);

		});




	}





	$(function () {

		init();

	});





})(jQuery);

</script>

<style type="text/css">

body {

	padding: 0;

	margin: 0;

	background: #fff;

	font-family: Courier;

}
canvas {

	background-color: #000;

	cursor: pointer;

}
</style>

</head>
<body>

<canvas id='canvas'></canvas>

</body>
</html>

							


canvas基本属性

属性 属性 属性
canvas fillStyle filter
font globalAlpha globalCompositeOperation
height lineCap lineDashOffset
lineJoin lineWidth miterLimit
shadowBlur shadowColor shadowOffsetX
shadowOffsetY strokeStyle textAlign
textBaseline width

canvas基础方法

方法 方法 方法
arc() arcTo() addColorStop()
beginPath() bezierCurveTo() clearRect()
clip() close() closePath()
createImageData() createLinearGradient() createPattern()
createRadialGradient() drawFocusIfNeeded() drawImage()
ellipse() fill() fillRect()
fillText() getImageData() getLineDash()
isPointInPath() isPointInStroke() lineTo()
measureText() moveTo() putImageData()
quadraticCurveTo() rect() restore()
rotate() save() scale()
setLineDash() setTransform() stroke()
strokeRect() strokeText() transform()
translate()

到了这里,关于Canvas 梦幻树生长动画的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • flutter开发实战-Canvas绘图之Path路径动画

    flutter开发实战-Canvas绘图之Path路径动画 flutter提供一块2D画布Canvas,Canvas内部封装了一些基本绘制的API,开发者可以通过Canvas绘制各种自定义图形。canvas上绘图,有多种不同的方式,常用的就是使用 Path。这里是flutter实现Path路径动画。 实现小球根据Path来做动画效果。 运行后

    2024年02月16日
    浏览(53)
  • web功能实例 - Canvas裁剪工具

    嗯,手撸官方文档2天,发现没啥用,尤其是动画,那种计算出来的,根本想不到。因此学着学了抱着要做个东西的想法,去网上找相关案例,最终做出了这个裁剪工具。 PS :先说一下思路: 核心实现有3个canvas图层, 其中一个负责图片的预览。 另外2个叠加到一起,底层canvas负责图片的

    2024年01月18日
    浏览(39)
  • 【Canvas】使用画布绘制动画录制成MP4视频解决方案

    电脑浏览器上是可以将Canvas绘制的动画录制成视频的,实现一键生成视频动画分享,让视频制作变得更容易更快捷,这里将实现过程讲一下。 建议在谷歌浏览器上测试 熟悉HTML,Canvas,JavaScript知识即可 部分浏览器上可以使用 MediaRecorder 类,来录制视频,如下代码,检查是否

    2024年02月15日
    浏览(39)
  • 在线 gif 转 svg / canvas / css(高度还原设计稿的动画效果)

    最近接到一个需求,是要 UI 给的 loading 动画替代首屏的白屏。可是 UI 大大给的是一个 gif 图,并且说这个 gif 图转不了 svg 格式给我。无奈之下,用 gif 图去实现了一版,但是测试大大又说加载 gif 图在网络不好的时候,耗时太长了。那能怎么办?优化呗!!! 在网络上冲浪,

    2024年02月11日
    浏览(50)
  • uni-app:官方文档中的canvas实例剖析

    canvas | uni-app官网 (dcloud.net.cn)

    2024年02月07日
    浏览(49)
  • HTML5 Canvas与JavaScript携手绘制动态星空背景

    目录 一、程序代码 二、代码原理 三、运行效果 这段代码通过 HTML5 的 canvas 元素和 JavaScript 实现了一个星空背景效果。首先,它在页面加载时创建了一个全屏大小的画布,并使用 JavaScript 生成了多个具有不同运动轨道的星星对象。每颗星星都具有随机的半径、位置、运动速度

    2024年02月20日
    浏览(53)
  • JavaScript实践:用Canvas开发一个可配置的大转盘抽奖功能

    🏆作者简介,黑夜开发者,全栈领域新星创作者✌,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:100个JavaScript的小应用。 🎉欢迎 👍点赞✍评论⭐收藏 大转盘抽奖是一种常见的

    2024年02月14日
    浏览(42)
  • 奇舞周刊第497期:解锁 PDF 文件:使用 JavaScript 和 Canvas 渲染 PDF 内容

    记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~  解锁 PDF 文件:使用 JavaScript 和 Canvas 渲染 PDF 内容 最近研究了 Web 的 FileSystemAccess Api,它弥补了 Web 长期以来缺少的能力:操作用户设备中的文件;而如今通过这个 Api 我们能够实现常见的文件

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包