0

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

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

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

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

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

  • 有人使用 Degrafa 及其 BezierSpline 类遇到过这种问题吗?

  • 这可能是由于将 AIR 升级到最新的 3.9 版本造成的吗?

编辑:我刚刚在 Android 设备下测试了完全相同的代码,曲线显示正确,所以只有在 iOS 设备上部署时才会发生这种情况。

4

1 回答 1

0

我最终实现了 Lee Burrows在这里编写的这个非常有用的示例。这是我在一次通话中所需要的:

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”增量)来手动处理曲线平滑度。但我也可以根据控制点的数量或它们之间的距离动态定义这种增量。

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

于 2014-02-01T07:17:00.593 回答