当前位置: 首页 > 知识库问答 >
问题:

创建三次和/或二次Bezier曲线以拟合路径

上官扬
2023-03-14

我想沿着这条路径平稳地移动一个物体。为了实现这一点,我想创建基于点的二次或三次Bezier曲线,并插值这些曲线。然而,我如何适当地拟合曲线,以使路径不被破坏,如果。一条曲线在F点停止,另一条曲线开始?

共有1个答案

万俟光临
2023-03-14

曲线拟合在这个问题中解释:我如何将一条Bézier曲线拟合到一组数据

然而,必须有一个更简单的方法来插值点。它是这样的:

  1. 细化:在每条边的中间放置一个点。
  2. 对偶:在每条边的中间放置一个点,并删除旧点。
  3. 多次重复双重步骤。
  4. 从步骤一开始重复,直到曲线足够光滑。
function bspline_smooth(points, order) {

    // insert a point in the middle of each edge.
    function _refine(points) {
      var i, index, len, point, refined;
      points = [points[0]].concat(points).concat(points[points.length-1]);
      refined = [];
      index = 0;
      for (i = 0, len = points.length; i < len; i++) {
        point = points[i];
        refined[index * 2] = point;
        if (points[index + 1]) {
          refined[index * 2 + 1] = _mid(point, points[index + 1]);
        }
        index += 1;
      }
      return refined;
    }

    // insert point in the middle of each edge and remove the old points.
    function _dual(points) {
      var dualed, i, index, len, point;
      dualed = [];
      index = 0;
      for (i = 0, len = points.length; i < len; i++) {
        point = points[i];
        if (points[index + 1]) {
          dualed[index] = _mid(point, points[index + 1]);
        }
        index += 1;
      }
      return dualed;
    }

    function _mid(a, b) {
      return new Point(
        a.x + ((b.x - a.x) / 2),
        a.y + ((b.y - a.y) / 2) );
    }

    if (!order) {
       return points;
    }
    return bspline_smooth(_dual(_dual(_refine(points))), order - 1);
}
 类似资料:
  • 给定一个X值(或百分比),我需要沿着二次Bezier曲线找到一点的Y坐标 该曲线是在android中使用以下内容绘制的折线图的一部分:

  • 我试图画一条具有一定厚度的三次bezier路径,但曲线看起来像是一系列断开的线段(在我的例子中是3段)。这是一张截图(蓝色圆圈是曲线的控制点)。 我注意到在cocos2d-x测试中的“绘制原语”中也出现了同样的效果。不管怎样,我很确定应该有一个变通办法,但我自己找不到。此外,线条受到锯齿效应的影响,我不知道如何应用一个alpha阴影来避免它。 这是我使用的代码:

  • 创建一条平滑的三维 二次贝塞尔曲线, 由起点、终点和一个控制点所定义。 代码示例 const curve = new THREE.QuadraticBezierCurve3( new THREE.Vector3( -10, 0, 0 ), new THREE.Vector3( 20, 15, 0 ), new THREE.Vector3( 10, 0, 0 ) ); const poi

  • 创建一条平滑的二维 三次贝塞尔曲线, 由起点、终点和两个控制点所定义。 代码示例 const curve = new THREE.CubicBezierCurve( new THREE.Vector2( -10, 0 ), new THREE.Vector2( -5, 15 ), new THREE.Vector2( 20, 15 ), new THREE.Vector2( 10,

  • bezierCurveTo()方法 绘制三次贝塞尔曲线代码如下。 context.bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y); 这个方法可谓是绘制波浪线的神器。根据之前的结论,n阶贝塞尔曲线就有n-1个控制点,所以三次贝塞尔曲线有1个起始点、1个终止点、2个控制点。因此传入的6个参数分别为控制点cp1 (cp1x, cp1y),控制点cp2 (cp2x, cp2

  • 本节,我们将学习如何绘制二次曲线。跟其堂兄弟圆弧相比,二次曲线是创建自定义图形的优秀工具,它可以绘制出更柔和、曲率更自然的曲线。 图1-5 绘制二次曲线 绘制步骤 按照以下步骤绘制二次曲线: 1. 定义2D画布上下文,并设置曲线样式: window.onload  = function(){ var canvas  = document.getElementById("myCanvas");