打开就随机生长的树

jtxiao 2018-02-28 原文

打开就随机生长的树

今天接触了一个新东西,感觉很酷炫的样子。
不是我写的,拿给大家看一看,喜欢的可以直接拿走不谢。
树的形状和树枝多少都是随机的,每刷新一次就有一次的惊喜哦,无聊的亲们可以多刷几次,当动画来看哦。
2017年又一天一天的走完了,2018都已经过去三十多天了。我每天都新建一个文件夹,这个文件夹里便是这一天的时光。可能在别人看来乏味而枯燥,但我竟然觉得这感觉相当不错。
临近年关,却没有要过年的感觉。估计是因为身在异乡,身边没有亲朋友人,便总是觉得冷清了一些。
所以就敲代码吧。
html 代码

<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”UTF-8″>
<meta name=”viewport” content=”width=device-width, initial-scale=1.0″>
<meta http-equiv=”X-UA-Compatible” content=”ie=edge”>
<title></title>
</head>
<body>
<canvas id=”canvas”></canvas>
<script>
const canvas = document.getElementById(‘canvas’)
const ctx = canvas.getContext(‘2d’)

const W = canvas.width = 900
const H = canvas.height = 700

canvas.style.border = ‘8px solid #000’

// rp([1, 3]) ==> 1 | 2 | 3
// rp([3, 1], true) ==> 1 – 3 之间随机的小数
const rp = function (arr, uint){
const min = Math.min(…arr)
const max = Math.max(…arr)
const ret = Math.random() * (max – min) + min
return uint ? ret : Math.round(ret)
}

const maxBranch = 3

tree(ctx, W/2, H/2 + 200, 70, -Math.PI/2, 14, 20)

function tree(ctx, startX, startY, branchLen, angle, depth, branchWidth) {
const endX = startX + branchLen * Math.cos(angle)
const endY = startY + branchLen * Math.sin(angle)

const color = (depth–) < maxBranch – 1 ? `rgb(0, ${rp([128, 196])}, 0)` : ‘rgb(68, 50, 25)’

ctx.save()
ctx.lineCap = ’round’
ctx.lineWidth = branchWidth
ctx.strokeStyle = color
ctx.beginPath()
ctx.moveTo(startX, startY)
ctx.lineTo(endX, endY)
ctx.stroke()
ctx.restore()

if (!depth) return

const subBranches = rp([1, maxBranch])

for (let i=0; i<subBranches; i++) {
setTimeout(
tree,
0,
ctx,
endX,
endY,
branchLen * rp([0.7, 1], true),
angle + rp([-Math.PI/5, Math.PI/5], true),
depth,
branchWidth * 0.72
)
}
}

</script>
</body>
</html>

发表于 2018-02-28 11:51 境界始于淡定肖 阅读() 评论() 编辑 收藏

 

版权声明:本文为jtxiao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/jtxiao/p/8482837.html

打开就随机生长的树的更多相关文章

  1. 树_详解

    树_详解 树的定义   树是一种很特别的数据结构,树这种数据结构叫做“树”就是因为它长得像一棵树。但是这棵树话 […]...

  2. 数据结构与算法:堆排序

    堆 堆是一个近似完全二叉树完全二叉树)的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它 […]...

  3. 数据结构系列(2)之 AVL 树

    本文将主要讲解平衡二叉树中的 AVL 树,其中将重点讲解二叉树的重平衡方法,即左旋和右旋,以及 3+4 重构; […]...

  4. 程序员如何自我成长

    大多数未毕业和工作不久的程序员同学都存在以下几点迷茫: 针对未毕业的计算机同学来说,存在迷茫点有: 1. 不知 […]...

  5. [HEOI2015] 兔子与樱花

    Description 很久很久之前,森林里住着一群兔子。有一天,兔子们突然决定要去看樱花。兔子们所在森林里的 […]...

  6. 【漫画】以后在有面试官问你平衡(AVL)树,你就把这篇文章扔给他。

    西天取经的路上,一样上演着编程的乐趣…..       1、若它的左子树不为空,则左子树上所有的节 […]...

  7. 红黑树——以无厚入有间(插入)

    首先说一下,关于红黑树有一篇很棒的论文《A dichromatic framework for balance […]...

  8. B-树 动机与结构

    Ps.我们遵循从感性到理性的认知顺序来逐步探索B-树的奥秘,之前经常说的value这里用key(关键码)指代, […]...

随机推荐

  1. 前端小结(基础知识)

    一、概述   本篇文章将对前端的一些基本内容以及平时的面试题进行简单总结,也当做对基础知识的巩固了。 二、HT […]...

  2. 使用ajax进行图片上传

    本来用的框架中的图片上传,但是感觉不够灵活,有些地方不合我意,所以自己实现了,顺便学习下。 首先,常规的aja […]...

  3. 03- 手机App功能测试要点以及登录页面的测试

      当你进入一个互联网公司以后,首先对公司结构有所了解,然后遇到问题找对应的工作人员,效率就事半功倍了。   […]...

  4. 远程管理FTP

    FTP默认路径 建立pub目录(注意不是文件) LeapFTP使用 注:上传到服务器的pub文件下,不要弄错目 […]...

  5. 网页打包安卓APP流程

    搭建环境过程: 1. 安装JDK。        参见http://www.cnblogs.com/Li-Ch […]...

  6. 负载均衡服务之HAProxy基础配置(一)

    haproxy的配置文件大概可以分两段;第一段配置上global配置段即全局配置段,主要是针对haproxy的 […]...

  7. SpringBoot解决跨域攻击

      前言  同源策略:判断是否是同源的,主要看这三点,协议,ip,端口。 同源策略就是浏览器出于网站安全性的考 […]...

  8. 平面设计

    一、基本概念   (一)、平面设计   平面设计是将不同的基本图形,按照一定的规则在平面上组合成图案的。主要在 […]...

展开目录

目录导航