阅读递归树绘制一节,使用canvas绘制递归树。 按照自己喜欢的风格着色。

    答案

    1. const canvas = document.querySelector('canvas')
    2. const ctx = canvas.getContext('2d')
    3. const screenWidth = document.documentElement.clientWidth
    4. const screenHeight = document.documentElement.clientHeight
    5. canvas.width = screenWidth * 2
    6. canvas.height = screenHeight * 2
    7. function color(level) {
    8. const x = level * 10
    9. return '#'+x.toString('16') + x.toString('16') + x.toString('16')
    10. }
    11. function tree_plot(p, a, w, h, L) {
    12. if(L > 10) {return}
    13. const [x, y] = p
    14. // 绘制一个枝干
    15. ctx.translate(x, y)
    16. ctx.rotate(a * Math.PI / 180)
    17. ctx.moveTo(- w/2, 0)
    18. ctx.lineTo(-w*0.65 / 2, - h)
    19. ctx.lineTo(w * 0.65/ 2, - h)
    20. ctx.lineTo( w / 2, 0)
    21. ctx.strokeStyle = color(L)
    22. ctx.setTransform(1, 0, 0, 1, 0, 0)
    23. ctx.fill()
    24. const nextX = x + h * Math.sin(a * Math.PI / 180)
    25. const nextY = y - h * Math.cos(a * Math.PI / 180)
    26. tree_plot([nextX, nextY], a + 15, w * 0.65, h * 0.9, L + 1)
    27. tree_plot([nextX, nextY], a - 15, w * 0.65, h * 0.9, L + 1)
    28. }
    29. // 利用generator实现一步一步显示
    30. // function * tree_plot_gen(p, a, w, h, L) {
    31. // if(L > 6) {return}
    32. // const [x, y] = p
    33. // const nextX = x + h * Math.sin(a * Math.PI / 180)
    34. // const nextY = y - h * Math.cos(a * Math.PI / 180)
    35. // yield * tree_plot_gen([nextX, nextY], a - 15, w * 0.65, h * 0.9, L + 1)
    36. // // 绘制一个枝干
    37. // ctx.translate(x, y)
    38. // ctx.rotate(a * Math.PI / 180)
    39. // ctx.moveTo(- w / 2, 0)
    40. // ctx.lineTo(-w * 0.65 / 2, - h)
    41. // ctx.lineTo(w * 0.65 / 2, - h)
    42. // ctx.lineTo(w / 2, 0)
    43. // ctx.strokeStyle = color(L)
    44. // ctx.setTransform(1, 0, 0, 1, 0, 0)
    45. // ctx.fill()
    46. // yield true
    47. // yield * tree_plot_gen([nextX, nextY], a + 15, w * 0.65, h * 0.9, L + 1)
    48. // }
    49. tree_plot([screenWidth, 2*screenHeight - 200], 0, 30, 150, 0)
    50. // const it = tree_plot_gen([screenWidth, 2*screenHeight - 200], 0, 30, 150, 0)
    51. // 按键一步一步显示
    52. // document.addEventListener('keyup', (e) => {
    53. // if(e.keyCode === 39) {
    54. // it.next()
    55. // }
    56. // })