花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 123|回复: 71

用canvas画布绘制一棵静态树

[复制链接]
  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2024-4-19 20:35 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    本帖最后由 马黑黑 于 2024-4-19 23:43 编辑

    递归指的是一个函数在执行过程中调用自己、直至执行条件满足时终止函数的自执行。我们接触得最多的应该就是请求关键帧动画,我们把动画的执行机制做成一个函数,在函数内部使用 requestAnimationFrame() 反复调用该函数:

    let raf = null; //操作动画的开关   let render = () => {     /* ... 这里是运行动画的代码 */     raf = requestAnimationFrame(render); //通过请求关键帧动画调用函数自身 };

    requestAnimationFrame() 方法是JS封装好的以显示刷新率为运行频率的API,它在函数 render() 的内部调用了函数 render() ;自身,使得函数要执行的任务得以不间断地执行。上例没有在函数内部提供任务终结的直接出口,而是通过请求关键帧动画标识 raf 用做开关,以便可以在函数的外部对动画的运行、暂停进行有效控制。不过地道的递归函数则应在函数内部提供出口条件,换言之,函数自身应该具备终止执行任务的条件,为此,我们在设计递归函数时,除了可以像上例那样可以在外部开、关函数的运行外,还应有能力在函数内部设立开、关逻辑清晰的运行机制,让递归函数适时终止自执行。以下例子,函数需要一个整数型参数,函数的任务是1加到该参数,就是等差数列求和,数学家高斯小时候做的1加到100的那个问题:

    let add = (num) => {     if(num <= 0) return 0;     console.log(`${num} + add(${num} - 1)`);//本行测试 :打印运算式子     return num + add(num - 1); }; console.log(add(100));

    add(num) 函数首先设立一个条件,即代码第2行,如果参数 num ≤ 0 将返回 0,这个条件一旦满足,函数就会退出运行。第 4 行代码,整体意思是返回 num + add(num -1),这里信息量很庞大:return 是返回结果;而结果,首先是 num 自身,其次是它依次通过修改参数为 num - 1 来反复调用函数自身、直至参数 num ≤ 1 时把第二行的返回值也加上就退出累加工作。代码第 6 行,运行函数 add(num),传参是 100,并打印出最终累加结果。

    需要特别注意,递归函数必须设计出口,以逻辑清晰的条件为临界,令任务执行完毕跳出任务的执行。递归递归,递是传递,将传递出去的指令一一落实,归就是回归,指令执行到满足条件了就要回头,不要无休止地干下去。

    利用递归函数,我们可以在canvas画布上画一棵树,思路是这样子:

    ① 设计一个 draw 函数,需要 5 个参数:树干起始点XY坐标 sx 和 sy、树干单节长度 len、树干宽度 width、树干折向角度 deg;
    ② 接力绘制树干,每一次都将画布坐标系位移到(sx,sy)处、旋转画布坐标系 deg 个弧度。首次在外部调用函数时使用实数参数,内部的递归调用则依据情况按一定系数调整各个参数;
    ③ 以 len 参数即一节树干(后来变为树枝)的长度为出口参数,内部递归调用乘上一个小于 1 的参数,这样它不断变短——实际上从第二次开始它们变成了分岔的树枝——,当它短到一定的程度,退出递归调用,退出时还有一个重要的任务,绘制果实;
    ④ 函数内部要两次递归调用函数自身,实现树枝左右折向,同时也令绘制情景更为复杂化;
    ⑤ 我们需要树枝的折向角度不那么一致,以避免树的成品过于对称。

    这样绘制出来的树不带叶子,适合在沙漠中生长,其果实可以加工成黑石浓缩饮料,价值连城。下面是完整代码:

    <canvas id="canv" width="800" height="500" style="border: 1px solid gray"></canvas>   <script> let ctx = canv.getContext('2d'); let ww = canv.width, hh = canv.height;   let rad = () => Math.random() * 10 + 10; //获取10~20的弧度  
    /* 绘制函数 以画树干为主体绘制任务,通过递归调用函数自身,变树干为树枝 当树干长度低于 15 改画随机颜色的果实并退出绘制任务 */
    let draw = (sx,sy,len,width,deg) => {     ctx.strokeStyle = 'olivedrab';     ctx.lineWidth = width;     ctx.lineCap = 'square';     ctx.lineJoin = 'miter';     ctx.beginPath();     ctx.save();     ctx.translate(sx,sy);     ctx.rotate(deg * Math.PI / 180);     ctx.moveTo(0, 0);     ctx.lineTo(0, -len);     ctx.stroke();       if(len < 15) {         ctx.beginPath();         ctx.arc(0, -len, 6, 0, deg * Math.PI * 2, false);         ctx.fillStyle = `#${Math.random().toString(16).substr(-6)}`;         ctx.fill();         ctx.restore();         return;        }       //两次不同折角的递归调用函数自身     draw(0, -len, len * 0.8, width * 0.8, deg + rad());     draw(0, -len, len * 0.8, width * 0.8, deg - rad());         ctx.restore(); };   //从函数外部调用绘制函数 draw(ww / 2, hh, hh / 4.5, 10, 0);   </script>

    可以将上述代码存为本地 .html 文档,或将代码拿到 pencil code,然后运行查看效果。

    评分

    参与人数 3威望 +130 金钱 +260 经验 +130 收起 理由
    红影 + 50 + 100 + 50 赞一个!
    小辣椒 + 50 + 100 + 50 赞一个!
    南无月 + 30 + 60 + 30 很给力!

    查看全部评分

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-4-19 20:52 | 显示全部楼层
    来自大漠的成吉思汗贴子里知道了回调函数,
    这个贴子依然是大漠风,用递归函数绘制的黑石沙棘林。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-4-19 20:55 | 显示全部楼层
    函数的样式好多,功能好强,老师运用的好灵活。。
    思路和代码对应,模块很清晰。。
    如看看高手画画,三两下就画出惊世之作,鼓掌赞叹。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-4-19 20:57 | 显示全部楼层
    黑石沙棘原浆预定一箱。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-11-25 21:11
  • 签到天数: 1 天

    [LV.1]初来乍到

    1421

    主题

    6万

    回帖

    12万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀青草情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀男儿情怀鹰傲苍穹心香一瓣音画大师天籁妙音风雨同行我心永远喜乐安康中秋征文指尖上的流年花潮管理

    发表于 2024-4-19 21:26 | 显示全部楼层
    小辣椒就看看,以后看看黑黑的作品效果
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-4-19 21:31 | 显示全部楼层
    南无月 发表于 2024-4-19 20:52
    来自大漠的成吉思汗贴子里知道了回调函数,
    这个贴子依然是大漠风,用递归函数绘制的黑石沙棘林。。{:4_17 ...

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-4-19 21:31 | 显示全部楼层
    小辣椒 发表于 2024-4-19 21:26
    小辣椒就看看,以后看看黑黑的作品效果

    成品在代码里
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-4-19 21:32 | 显示全部楼层
    南无月 发表于 2024-4-19 20:57
    黑石沙棘原浆预定一箱。。

    首次下单3万一箱
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-4-19 21:33 | 显示全部楼层

    这么贵,杀新啊。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-4-19 21:34 | 显示全部楼层
    南无月 发表于 2024-4-19 21:33
    这么贵,杀新啊。。

    正常价是5W
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-4-19 21:34 | 显示全部楼层

    回调函数,递归函数,这么形象的名字是原本就有的还是你取的。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-4-19 21:35 | 显示全部楼层

    居然打了骨折。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-4-19 21:35 | 显示全部楼层

    就是就是,知足吧
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-4-19 21:36 | 显示全部楼层
    南无月 发表于 2024-4-19 21:34
    回调函数,递归函数,这么形象的名字是原本就有的还是你取的。

    这是原有的,就这么定着
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-4-19 21:37 | 显示全部楼层
    马黑黑 发表于 2024-4-19 21:35
    就是就是,知足吧

    知足者常乐。。。喝一瓶才乐。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-4-19 21:38 | 显示全部楼层
    南无月 发表于 2024-4-19 21:37
    知足者常乐。。。喝一瓶才乐。

    浓缩了五万倍,买一箱,喝一辈子还有遗产
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2024-4-19 22:16 | 显示全部楼层
    这棵树太美了,这样的运算喝设计好强大
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-4-19 22:17 | 显示全部楼层
    马黑黑 发表于 2024-4-19 21:36
    这是原有的,就这么定着

    好形象的名字。。功能也强大。。一下子觉得挺可爱的这些函数
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-4-19 22:20 | 显示全部楼层
    马黑黑 发表于 2024-4-19 21:38
    浓缩了五万倍,买一箱,喝一辈子还有遗产

    太厉害了。这可是比黄金还保值。。谁也不要告诉,再来一箱。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-4-19 23:33 | 显示全部楼层
    南无月 发表于 2024-4-19 22:20
    太厉害了。这可是比黄金还保值。。谁也不要告诉,再来一箱。。

    俺这就安排
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2025-12-16 02:03 , Processed in 0.100263 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表