whole_func_string: function(knots) {
              var firstControlPoints = [];
              var secondControlPoints = [];
              var n = knots.length - 1;
              var i;
  
              // Special case: Bezier curve should be a straight line.
              if (n == 1) { 
  	        // 3P1 = 2P0 + P3
  	        firstControlPoints[0] = point((2 * knots[0].x + knots[1].x) / 3,
  	                                      (2 * knots[0].y + knots[1].y) / 3);
  	        // P2 = 2P1 – P0
  	        secondControlPoints[0] = point(2 * firstControlPoints[0].x - knots[0].x,
  	                                       2 * firstControlPoints[0].y - knots[0].y);
  	        return [firstControlPoints, secondControlPoints];
              }
              
                  // Calculate first Bezier control points.
              // Right hand side vector.
              var rhs = [];
              
              // Set right hand side X values.
              for (i = 1; i < n - 1; i++) {
                  rhs[i] = 4 * knots[i].x + 2 * knots[i + 1].x;
              }
              rhs[0] = knots[0].x + 2 * knots[1].x;
              rhs[n - 1] = (8 * knots[n - 1].x + knots[n].x) / 2.0;
              // Get first control points X-values.
              var x = this.getFirstControlPoints(rhs);
              
              // Set right hand side Y values.
              for (i = 1; i < n - 1; ++i) {
  	        rhs[i] = 4 * knots[i].y + 2 * knots[i + 1].y;
              }
              rhs[0] = knots[0].y + 2 * knots[1].y;
              rhs[n - 1] = (8 * knots[n - 1].y + knots[n].y) / 2.0;
              // Get first control points Y-values.
              var y = this.getFirstControlPoints(rhs);
              
              // Fill output arrays.
              for (i = 0; i < n; i++) {
  	        // First control point.
  	        firstControlPoints.push(point(x[i], y[i]));
  	        // Second control point.
  	        if (i < n - 1) {
  	            secondControlPoints.push(point(2 * knots [i + 1].x - x[i + 1],
                                                     2 * knots[i + 1].y - y[i + 1]));
  	        } else {
  	            secondControlPoints.push(point((knots[n].x + x[n - 1]) / 2,
  					           (knots[n].y + y[n - 1]) / 2));
  	        }
              }
              return [firstControlPoints, secondControlPoints];
          }
func_code_string: function(knots) {
              var firstControlPoints = [];
              var secondControlPoints = [];
              var n = knots.length - 1;
              var i;
  
              // Special case: Bezier curve should be a straight line.
              if (n == 1) { 
  	        // 3P1 = 2P0 + P3
  	        firstControlPoints[0] = point((2 * knots[0].x + knots[1].x) / 3,
  	                                      (2 * knots[0].y + knots[1].y) / 3);
  	        // P2 = 2P1 – P0
  	        secondControlPoints[0] = point(2 * firstControlPoints[0].x - knots[0].x,
  	                                       2 * firstControlPoints[0].y - knots[0].y);
  	        return [firstControlPoints, secondControlPoints];
              }
              
                  // Calculate first Bezier control points.
              // Right hand side vector.
              var rhs = [];
              
              // Set right hand side X values.
              for (i = 1; i < n - 1; i++) {
                  rhs[i] = 4 * knots[i].x + 2 * knots[i + 1].x;
              }
              rhs[0] = knots[0].x + 2 * knots[1].x;
              rhs[n - 1] = (8 * knots[n - 1].x + knots[n].x) / 2.0;
              // Get first control points X-values.
              var x = this.getFirstControlPoints(rhs);
              
              // Set right hand side Y values.
              for (i = 1; i < n - 1; ++i) {
  	        rhs[i] = 4 * knots[i].y + 2 * knots[i + 1].y;
              }
              rhs[0] = knots[0].y + 2 * knots[1].y;
              rhs[n - 1] = (8 * knots[n - 1].y + knots[n].y) / 2.0;
              // Get first control points Y-values.
              var y = this.getFirstControlPoints(rhs);
              
              // Fill output arrays.
              for (i = 0; i < n; i++) {
  	        // First control point.
  	        firstControlPoints.push(point(x[i], y[i]));
  	        // Second control point.
  	        if (i < n - 1) {
  	            secondControlPoints.push(point(2 * knots [i + 1].x - x[i + 1],
                                                     2 * knots[i + 1].y - y[i + 1]));
  	        } else {
  	            secondControlPoints.push(point((knots[n].x + x[n - 1]) / 2,
  					           (knots[n].y + y[n - 1]) / 2));
  	        }
              }
              return [firstControlPoints, secondControlPoints];
          }
func_documentation_string: Get open-ended Bezier Spline Control Points. @param knots Input Knot Bezier spline points (At least two points!). @param firstControlPoints Output First Control points. Array of knots.length - 1 length. @param secondControlPoints Output Second Control points. Array of knots.length - 1 length.