计算路径崩溃的边界

时间:2012-10-15 09:25:24

标签: android path contains point bounds

我关闭了Path-s,它由许多Bezier段组成。这些贝塞尔曲线段的整数坐标最大为5000,5000。我需要计算一个点是否在这些封闭路径之一内。我使用这段代码:

// p is a Path, bounds is a RectF
p.computeBounds(bounds, true);
Region region = new android.graphics.Region();
region.setPath(path, new android.graphics.Region((int)bounds.left, (int)bounds.top, (int)bounds.right, (int)bounds.bottom));

我按照Path执行一次,然后执行

region.contains(x, y);

问题是,computeBounds崩溃了我的大路径的应用程序。没有强制关闭,它只接收SIGSEGV并返回主屏幕,没有消息。我试图将坐标缩小到较小的数字(除以1000),但它没有帮助,程序仍然崩溃。

有没有其他方法可以计算一个点是否在一个复杂的Path里面,它不会崩溃?

修改 有没有办法用RenderScript计算?我找不到任何带路径/贝塞尔曲线的RenderScript示例......

编辑2 这种情况发生在Nexus 7 4.1.1和4.1.2以及ICS x86平板电脑仿真器

1 个答案:

答案 0 :(得分:4)

通常,Java代码会导致异常而不是分段错误,这意味着Java虚拟机存在问题,除非您的项目中有自己的JNI代码并导致分段错误。

而不是计算路径的边界,这对于复杂路径来说似乎是太昂贵的操作,你可以使用足够大的剪辑矩形将所有可能的路径绑定为剪辑区域,这样就可以避免调用繁重且不必要的Path.computeBounds。

import android.graphics.Region;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Rect;

private static final String id = "Graphics";

...

Path path = new Path();
/* Initialize path here... */

/* Huge rectangle to bound all possible paths */
Region clip = new Region(0, 0, 10000, 10000);

/* Define the region */
Region region = new Region();
if (region.setPath(path, clip)) {
    Log.d(id, "This region is fine");
} else {
    Log.e(id, "This region is empty");
}