AIR Degrafa在AIR 3.9下的bezier spline

时间:2014-01-31 15:56:16

标签: ios flex air flex-mobile degrafa

我有一个在iOS上运行的移动Flex项目,该项目一直使用Degrafa的库来使用它的BezierSpline类。目的是能够直接在屏幕上绘制,然后使用此库将用户手势给出的点集合转换为贝塞尔曲线。

但是,我的应用程序最近在显示包含至少一条这些曲线的页面时崩溃了。我没有得到任何错误,堆栈跟踪或任何东西,应用程序被简单地杀死,我被带回iOS桌面。 显然,错误发生在BezierSpline类的.draw()函数内部。

此外,我注意到这只发布在应用程序的发布版本上,或者通过AppStore(看起来他们没有注意到)或者通过部署在iPad上的发布包。一切都在模拟器中正常工作或直接在设备上使用调试包。 由于我有一段时间没有制作任何发布包,我不确定哪种修改可能导致这种情况。我唯一知道的是,我最近将Flash Builder更新为4.7,AIR更新为3.9(这是该项目其他功能所必需的)。

所以我基本上有三个问题:

  • 在哪种情况下,应用程序只能在发布模式下崩溃,而不是在调试模式下崩溃?代码保持不变。

  • 有人曾经使用过Degrafa及其BezierSpline课程遇到过这类问题吗?

  • 这可能是因为将AIR升级到最新的3.9版本?

编辑:我刚刚在Android设备下测试了完全相同的代码,曲线显示正确,因此只有在iOS设备上部署时才会出现。

1 个答案:

答案 0 :(得分:0)

我最终实现了这个由Lee Burrows here撰写的非常有用的例子。 以下是我在一次通话中所需要的全部内容:

static public function getPoint(t:Number, points:Array):Point
    {
        var x:Number = 0;
        var y:Number = 0;
        var n:uint = points.length-1;
        var factn:Number = factoral(n);

        for (var i:uint=0;i<=n;i++)
        {
            //calc binominal coefficent
            var b:Number = factn/(factoral(i)*factoral(n-i));
            //calc powers
            var k:Number = Math.pow(1-t, n-i)*Math.pow(t, i);
            //add weighted points to totals
            x += b*k*points[i].x;
            y += b*k*points[i].y;
        }

        return new Point(x, y);
    }

    static private function factoral(value:uint):Number
    {
        if (value==0) return 1;

        var total:Number = value;
        while (--value>1)
            total *= value;

        return total;
    }

上面的链接也提供了使用此类的示例代码。

这个解决方案的唯一缺点是我必须通过定义曲线的行数来手动处理曲线平滑度(通过改变“t”增量)。但我也可以根据控制点的数量或它们之间的距离来动态定义这种增量。

无论如何,这对我遇到的问题来说已经足够了,希望这有助于其他人。