text: var math = require( '../../../../math' );
  
  var BRp = {};
  
  function pushBezierPts( r, edge, pts ){
    var qbezierAt = function( p1, p2, p3, t ){ return math.qbezierAt( p1, p2, p3, t ); };
    var _p = edge._private;
    var bpts = _p.rstyle.bezierPts;
  
    for( var i = 0; i < r.bezierProjPcts.length; i++ ){
      var p = r.bezierProjPcts[i];
  
      bpts.push( {
        x: qbezierAt( pts[0], pts[2], pts[4], p ),
        y: qbezierAt( pts[1], pts[3], pts[5], p )
      } );
    }
  }
  
  BRp.storeEdgeProjections = function( edge ){
    var _p = edge._private;
    var rs = _p.rscratch;
    var et = rs.edgeType;
  
    // clear the cached points state
    _p.rstyle.bezierPts = null;
    _p.rstyle.linePts = null;
    _p.rstyle.haystackPts = null;
  
    if( et === 'multibezier' ||  et === 'bezier' ||  et === 'self' ||  et === 'compound' ){
      var bpts = _p.rstyle.bezierPts = []; // jshint ignore:line
  
      for( var i = 0; i + 5 < rs.allpts.length; i += 4 ){
        pushBezierPts( this, edge, rs.allpts.slice( i, i + 6 ) );
      }
    } else if(  et === 'segments' ){
      var lpts = _p.rstyle.linePts = [];
  
      for( var i = 0; i + 1 < rs.allpts.length; i += 2 ){
        lpts.push( {
          x: rs.allpts[ i ],
          y: rs.allpts[ i + 1]
        } );
      }
    } else if( et === 'haystack' ){
      var hpts = rs.haystackPts;
  
      _p.rstyle.haystackPts = [
        { x: hpts[0], y: hpts[1] },
        { x: hpts[2], y: hpts[3] }
      ];
    }
  
    _p.rstyle.arrowWidth = this.getArrowWidth( edge.pstyle('width').pfValue, edge.pstyle( 'arrow-scale' ).value )
      * this.arrowShapeWidth;
  };
  
  BRp.recalculateEdgeProjections = function( edges ){
    this.findEdgeControlPoints( edges );
  };
  
  module.exports = BRp;
  