프랙탈로 나무 쓰기

7651 단어 CoffeeScript
그러고 보니 쓴 적 없었기 때문에 해 보았다.

개념


  • 여러 번 재귀할지 결정(depth)
  • 좌표 지정(x1, y1)
  • 방향 지정 (θ)
  • x1, y1에서 그 방향으로 선을 그립니다 (x2, y2)
  • 재귀 횟수가 남아 있으면 빼기 (x2, y2)에서 임의의 각도 r로 θ-r, θ + r 방향으로 선을 그립니다.

    코드



    주의: 늘이는 길이, 각도에 난수가 들어 있음
    {sin, cos, PI} = Math
    
    drawLine = (ctx, p1, p2) ->
      ctx.beginPath();
      ctx.strokeStyle = 'gray'
      ctx.moveTo(p1.x, p1.y);
      ctx.lineTo(p2.x, p2.y);
      ctx.stroke();
    
    drawTree = (
      ctx     # canvas context
      x1, y1  # position
      len     # length of node
      stand   # current dir
      depth   # recursion count
    ) ->
      rl = Math.abs(0.5 - Math.random()) * len
      x2 = x1 + rl * cos(stand)
      y2 = y1 + rl * sin(stand)
      drawLine(ctx, {x: x1, y: y1}, {x: x2, y: y2})
      if depth > 0
        diffdir = Math.random() * PI / 6
        drawTree(ctx, x2, y2, len, stand + diffdir, depth-1)
        drawTree(ctx, x2, y2, len, stand - diffdir, depth-1)
    
    window.addEventListener 'load', ->
      canvas = document.createElement 'canvas'
      canvas.width=800
      canvas.height=600
      document.body.appendChild(canvas)
      ctx = canvas.getContext('2d')
      for x in [1..30]
        drawTree(ctx, 600*Math.random(), 400*Math.random(), 20, -PI/2, 8)
    

    결과



  • 좋은 웹페이지 즐겨찾기