Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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 如何比较Bezier曲线的形状_Javascript_Algorithm_Vector Graphics_Image Recognition_Paperjs - Fatal编程技术网

Javascript 如何比较Bezier曲线的形状

Javascript 如何比较Bezier曲线的形状,javascript,algorithm,vector-graphics,image-recognition,paperjs,Javascript,Algorithm,Vector Graphics,Image Recognition,Paperjs,我想比较两条贝塞尔曲线。我知道端点和控制点的坐标,但对于2条比较曲线,该坐标可能不相同。我需要比较一下这些曲线的形状。为了“真实”,形状必须大致相同 我使用javascript和paper.js 请看图片: 出路在哪里?Thanx.根据您提供的示例,我假设 大小无关 形状可以扭曲到某一点 如果旋转曲线不相同 N点采样曲线 只是一步一步地通过参数 对于三次曲线,我将使用16到32个采样点 点数越多,比较就越精确 但是更大的运行时间 计算每段的角度 使用atan2或 将这些角度存储在阵

我想比较两条贝塞尔曲线。我知道端点和控制点的坐标,但对于2条比较曲线,该坐标可能不相同。我需要比较一下这些曲线的形状。为了“真实”,形状必须大致相同

我使用javascript和paper.js

请看图片:


出路在哪里?Thanx.

根据您提供的示例,我假设

  • 大小无关
  • 形状可以扭曲到某一点
如果旋转曲线不相同

  • N点采样曲线

    • 只是一步一步地通过参数
    • 对于三次曲线,我将使用16到32个采样点
    • 点数越多,比较就越精确
    • 但是更大的运行时间
  • 计算每段的角度

    • 使用atan2或
    • 将这些角度存储在阵列中
  • 比较这些数组

    • 恰当地做到这一点的最好和最简单的方法是
    • 如果相关系数接近
      +1
      ,则形状相似或相同
  • 如果旋转,应产生相同的类似曲线

  • 轮换

    • 然后进行上述几次旋转(例如0,10,20,…,350度)
    • 如果有,如果这些相同,则停止并返回true
    • 如果没有,则返回false
    • 曲线的旋转只是给它的所有角度加上一个常数
  • 旋转不变性

    • 如果将两个比较的曲线角度偏移为从角度0开始
    • 所以只要从曲线的所有角度减去第一个角度
    • 然后将两条曲线彼此对齐,这样只需要比较两个位置
    • 所以你比较一下这个
    • 如果不相同,则在一条曲线上添加180度,然后再次比较
    • 这就足够了
  • [附注]

    • 在关联之前,您应该对所有角度进行规格化(将其设置为间隔
    • 更多的想法请看这里

    三次Bézier样条曲线由任意四个点定义:起点、控制点-1、控制点-2和终点,我将其编号为0、1、2、3。现在我们假设这四个点是不同的,没有三个点在一条直线上

    曲线可以采取三种根本不同的形式,这取决于直线0--1和1--2之间、1--2和2--3之间的转弯方向,以及0--1和2--3是否相交

    在类型1中,两个转弯都向右,或者都向左,并且0--1不穿过2--3。在提问者的例子中,这给出了一条类似于a、b或c的曲线。在类型2中,第一个转弯是向左,第二个转弯是向右,反之亦然,在提问者的例子中给出了一条类似于d的曲线,带有一个扭结。在类型3中,两个转弯方向相同,但直线0--1和2--3交叉,形成一条带回路的曲线

    我们可以首先将单三次样条曲线分为三种类型之一,给它们一个类型字符串:普通(“空字符串”)、扭结(“K”)和循环(“L”)

    然而,示例e由两条平滑连接的三次样条曲线组成。为了处理这样的序列,我们遍历它们并创建一个字符串,为每个扭结曲线添加一个K,为每个循环曲线添加一个L。我们还为两条样条曲线之间的每个连接添加一个K,其中连接前的转向与连接后的转向相反:先左后右,或先右后左

    这为我们提供了类型字符串“K”,例如e,根据需要将其与d匹配

    我们还允许一个类型字符串与另一个类型字符串相反的匹配:因此“KL”匹配“LK”