html - JavaScript 曲线生成

标签 html canvas bezier

如何编写一个函数,接受 2D 点数组并返回贝塞尔/二次曲线,以便稍后使用 HTML5 Canvas bezierCurveToquadraticCurveTo< 重新绘制它 方法?

最佳答案

编辑:改进。

See a demo它使用下面的代码。

var makeCurveArgs = function(points) {
  var copy = points.slice();
  var result = [];
  copy.shift(); //drop the first point, it will be handled elsewhere
  var tangent;
  if(copy.length >= 3) {
    var cp1 = copy.shift();
    var cp2 = copy.shift();
    var p2 = copy.shift();

    result.push([cp1[0], cp1[1], cp2[0], cp2[1], p2[0], p2[1]]);            
  }
  while(copy.length >= 2) {
    var cp1 = [2 * p2[0] - cp2[0], 2 * p2[1] - cp2[1]];
    var cp2 = copy.shift();
    var p2 = copy.shift();
    result.push([cp1[0], cp1[1], cp2[0], cp2[1], p2[0], p2[1]]);            
  }
  return result;
}

var notThatHard = function(points) {
  var origin = points[0].slice();
  var curves = makeCurveArgs(points);
  var drawCurves = function(context) {


    context.beginPath();
    context.moveTo(origin[0], origin[1]);
      for(var i = 0; i < curves.length; i++) {
      var c = curves[i];
      context.bezierCurveTo(c[0], c[1], c[2], c[3], c[4], c[5]);
  }
  };
  return drawCurves;
};

一般方法是,您向我提供点和控制点的坐标,然后我返回一个函数,该函数将在 Canvas 上下文上执行该路径。

我给出的函数需要一个 2N+2 2 元素数组的数组;每个 2 元素数组都是一个 (x,y) 坐标。坐标使用如下:

points[0]: starting point of the curve
points[1]: lies on a line tangent to the beginning of the 1st bezier curve
points[2]: lies on a line tangent to the end of the 1st bezier curve
points[3]: end of 1st bezier curve, start of 2nd bezier curve
points[4]: lies on a line tangent to the end of the 2nd bezier curve
points[5]: end of 2nd bezier curve, start of 3rd curve
...
points[2*K+2]: lies on a line tangent to the end of the Kth bezier curve
points[2*K+3]: end of Kth bezier curve, start of (K+1)th

我认为 quadraticCurveTo 的类似函数并不难编写。

关于html - JavaScript 曲线生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7584917/

相关文章:

java - 如何在Java中绘制绝对自定义的形状?

opengl - 如何在OpenGL中绘制2D不规则曲线形状

javascript - 我们所说的 firefox 开发者工具中的等待时间是什么意思

css - div 背景仅向左重复

java - 如何使用 java awt.Graphics2D 绘制锥度轮廓

javascript - 将绘图从 Canvas 保存到本地文件夹

javascript - HTML5 canvas toDataURL 不适用于 Canvas 上的图像

html - 如何使我的网页固定布局?

javascript - 初学者 - While 循环将所有用户输入求和在 50 以下 - Javascript

javascript - 在 JavaScript 中合并两个图像