In d3, how to get the interpolated line data from a SVG line?

前端 未结 3 904
时光说笑
时光说笑 2020-11-29 06:40

I display a line chart with D3 with roughly the following code (given the scale functions x, y and the float array data):



        
3条回答
  •  伪装坚强ぢ
    2020-11-29 07:12

    This solution is much more efficient than the accepted answer. It's execution time is logarithmic (while accepted answer has linear complexity).

    var findYatXbyBisection = function(x, path, error){
      var length_end = path.getTotalLength()
        , length_start = 0
        , point = path.getPointAtLength((length_end + length_start) / 2) // get the middle point
        , bisection_iterations_max = 50
        , bisection_iterations = 0
    
      error = error || 0.01
    
      while (x < point.x - error || x > point.x + error) {
        // get the middle point
        point = path.getPointAtLength((length_end + length_start) / 2)
    
        if (x < point.x) {
          length_end = (length_start + length_end)/2
        } else {
          length_start = (length_start + length_end)/2
        }
    
        // Increase iteration
        if(bisection_iterations_max < ++ bisection_iterations)
          break;
      }
      return point.y
    }
    

提交回复
热议问题