Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 寻找三次贝塞尔控制点的算法(实现细节)_Javascript_Algorithm_Curve_Bezier_Cubic Spline - Fatal编程技术网

Javascript 寻找三次贝塞尔控制点的算法(实现细节)

Javascript 寻找三次贝塞尔控制点的算法(实现细节),javascript,algorithm,curve,bezier,cubic-spline,Javascript,Algorithm,Curve,Bezier,Cubic Spline,我在谷歌上搜索了很多,但我找到的所有算法都使用方程式来寻找控制点。我认为有更简单的解决方案,并在ExtJS源代码中找到了一些实现:。它使用直线最近点之间的夹角来检测控制点和一些缺陷 有人能定义一下搜索控制点的算法吗?我被困在有圆周率和角度的吹管中。对于这种解决问题的方法,可能有更详细、更清晰的解释或共同的想法吗?这很合适:代码试图根据点X-1和X+1的位置,通过点X找到合适的切线,使切线平行于线(X-1)-(X+1),然后摆弄产生,确保“传入”和“传出”切线产生美观的曲线 有道理 假设切线等于

我在谷歌上搜索了很多,但我找到的所有算法都使用方程式来寻找控制点。我认为有更简单的解决方案,并在ExtJS源代码中找到了一些实现:。它使用直线最近点之间的夹角来检测控制点和一些缺陷

有人能定义一下搜索控制点的算法吗?我被困在有圆周率和角度的吹管中。对于这种解决问题的方法,可能有更详细、更清晰的解释或共同的想法吗?

这很合适:代码试图根据点X-1和X+1的位置,通过点X找到合适的切线,使切线平行于线(X-1)-(X+1),然后摆弄产生,确保“传入”和“传出”切线产生美观的曲线

  • 有道理
  • 假设切线等于(p-1)-(p+1)
  • 这看起来很可怕
  • 稍微缩放控制点以获得更好的拟合

  • 从技术上讲,如何执行步骤4不再是Catmull Rom,因为一旦切线设置完毕,真正的Catmull Rom样条曲线就会停止。如果你需要一个步骤4,通常的方法是根据投影距离来缩放点:如果你在线(x-1)上画点x(x+1),它很少会正好在直线的中间,但是在距离x-1和距离(100-v)%从点x + 1的某个距离v%,因此,您可以相应地缩放找到的切线。

    您可以描述代码的哪些部分与算法的步骤相匹配吗?我仍然无法在Sencha代码中描述第4部分是如何工作的。请在您链接的文件中查找“最后一次调整,确保没有控制锚定点垂直延伸超过”部分。我读了一些关于Catmull Rom的文章,但没有找到与您类似的解释。所有的公式都是这样的:0.5f*((2*p1)+(p2-p0)*t+(2*p0-5*p1+4*p2-p3)*t*t+(3*p1-p0-3*p2+p3)*t*t*t*t);}可能是在Sencha代码中使用的不是另一个版本的算法吗?在代码中你看到它在哪里这样做?至于找到一个“像我一样”的解释,三次hermite算法可以用两种截然不同的方式来解释——我给出了程序上的解释,但如果你喜欢,我也可以给你矩阵上的解释:初始曲线是用[1 t²t³]*[1 0 0 0;-3 3 3 0;3-6 3 0;1 3-3 1]*[p2 v1 v2 p3]形成的,其中,
    v1
    p2-(p3-p1)/12
    v2
    p3+(p4-p2)/12
    。但是,这就不那么容易理解了,尤其是因为大多数人在这里发帖时已经忘记了他们所有的线性代数;)(基本上,通常至少有两种完全不同的方法来解释几何构造算法。对于曲线,我可以想到至少三种方法:1)使用纯文本进行程序运算,2)使用线性代数进行矩阵运算,3)使用微积分进行参数函数表达式。如果你不熟悉这一主题,这三个词看起来会大不相同,但它们都描述了完全相同的东西)