最近公司给了个题目,要求判断一个曲线的抖动程度,然后根据判断结果决定是否对此曲线进行平滑!请问,如何获得一条曲线的抖动程度,或者说是光滑程度阿!各位大侠帮帮偶吧,给点相关思路或者资料来源也行啊!先谢过啦!

解决方案 »

  1.   

    你可以试试在画的过程中判断:
    随时记录当前点坐标与前面若干点的坐标值(例如记录当前点x0与前面的20个点x1……x20)
    然后计算x0点与x1点间的斜率值,并计算x1与x2间,x2与x3间……x19与x20间的斜率。
    根据已有的前面的范围计算出一个斜率变化的阈值范围,看x0与x1间的斜率是否在你计算出的
    合理阈值变化范围之内,如果在,ok;否则,则x0点坐标需要平滑处理。K1=K(x1,x2), K2=K(x2,x3)…… K19= K(x19, x20)
    使用K1等形成一个判断阈值Ak_unknow = K(x0, x1)
    if(k_unknow < A)
    {
        pass//合理值
    }
    else
    {
       平滑处理
    }
      

  2.   

    谢谢 drowdrow 
    阀值的选取可能有点难度,倘若我是用鼠标画一个圆,那么阀值要怎么选,这个阀值可能要动态选取吧,这个是不是传说中的自适应?
      

  3.   

    而且x1、x2……x20点之间的距离的选取也应该很重要。
    若x1、x2点间的距离太小了,例如为1,则可能计算出的K值之间会变化很大
    距离太大了,不能对快速变化做出反映。
    因此每隔鼠标移动3~5个点记录一次参考点比较合适
      

  4.   

    drowdrow ,我是用这种方法实现的!把每个点到  它两边的点所连直线  的距离相加,然后除以曲线的总长度,作为门限值!
    比如:A B C D ······四个点,计算点B 到 线AC的距离+点C 到线BD的距离+······ 然后用总和除以线的长度,计算出的值跟一个门限值比较!
    可是,有点小问题!倘若画一条垂直的线(比较长的),线中间有一点发生抖动(就一点,还比较严重),这种情况下算出来的值虽然很小,但是抖动的效果却非常明显,请问,能否通过别的办法,把线段的长度作为权重加到门限的计算中?
      

  5.   

    drowdrow谢谢你帮忙,等过几天能给帖子加分了,我再结帖!