Android 计算路径崩溃的边界

Android 计算路径崩溃的边界,android,path,contains,point,bounds,Android,Path,Contains,Point,Bounds,我有闭合路径-s,它由许多贝塞尔线段组成。这些贝塞尔线段的整数坐标高达50005000。我需要计算一个点是否在这些闭合路径中。我使用以下代码: // 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,

我有闭合路径-s,它由许多贝塞尔线段组成。这些贝塞尔线段的整数坐标高达50005000。我需要计算一个点是否在这些闭合路径中。我使用以下代码:

// 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));
我在每条路径上执行一次,然后执行

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

如果一个点位于一个复杂的路径中,有没有其他方法可以计算它不会崩溃

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

编辑2
这发生在Nexus 7的4.1.1和4.1.2版本中,也发生在ICS x86 tablet emulator中

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

您可以使用足够大的剪辑矩形将所有可能的路径绑定为剪辑区域,以避免调用繁重和不必要的path.computeBounds,而不是计算路径的边界(这对于复杂的路径来说似乎过于昂贵)

导入android.graphics.Region;
导入android.graphics.Path;
导入android.graphics.RectF;
导入android.graphics.Rect;
私有静态最终字符串id=“Graphics”;
...
路径路径=新路径();
/*在这里初始化路径*/
/*将所有可能的路径绑定到一个巨大的矩形*/
区域剪辑=新区域(0,0,10000,10000);
/*定义区域*/
区域=新区域();
if(region.setPath(path,clip)){
Log.d(id,“该区域很好”);
}否则{
Log.e(id,“该区域为空”);
}

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

您可以使用足够大的剪辑矩形将所有可能的路径绑定为剪辑区域,以避免调用繁重和不必要的path.computeBounds,而不是计算路径的边界(这对于复杂的路径来说似乎过于昂贵)

导入android.graphics.Region;
导入android.graphics.Path;
导入android.graphics.RectF;
导入android.graphics.Rect;
私有静态最终字符串id=“Graphics”;
...
路径路径=新路径();
/*在这里初始化路径*/
/*将所有可能的路径绑定到一个巨大的矩形*/
区域剪辑=新区域(0,0,10000,10000);
/*定义区域*/
区域=新区域();
if(region.setPath(path,clip)){
Log.d(id,“该区域很好”);
}否则{
Log.e(id,“该区域为空”);
}

我的应用程序中没有本机代码。我在别的地方读到过,setPath和computeBounds在大路径上会像这样崩溃。我看不出我们的代码有什么不同。两者都定义一条路径,然后计算其边界,然后创建一个区域并使用setPath()设置一条路径,或者我缺少什么?无论哪种方式,应用程序都会在第一条路径上崩溃;如果我删除computeBounds(当然还有setPath),应用程序不会崩溃。如果我只删除setPath,应用程序就会崩溃。正如我前面所说,你可以使用足够大的clip矩形将所有可能的路径绑定为
clip
,这样你就可以避免调用沉重和不必要的
计算边界。如果Dalvik无法处理包含大量控制点的路径,则应重点使用包含少量点的较粗路径来近似路径。不计算路径边界,只设置足够大的剪辑区域即可解决问题。程序不会崩溃,对于这种复杂的路径,region.contains()是非常快的事件。你能在开始的时候编辑你的答案吗,那只是使用一个足够大的剪辑区域?我会接受的。因为你得到的是一个分段错误而不是一个异常,所以值得一提的是可能涉及到自己的JNI代码,并强调如果没有自己的JNI代码,这是一个例外情况,需要非标准的解决方法。正如我前面所说,我没有自己的本机代码。Path和Region类本身使用本机代码处理许多事情。有趣的是,它不能计算边界,但可以计算一个点是否在闭合路径内而没有任何问题,这是一项要求更高的任务。再次谢谢。我的应用程序中没有本机代码。我在别的地方读到过,setPath和computeBounds在大路径上会像这样崩溃。我看不出我们的代码有什么不同。两者都定义一条路径,然后计算其边界,然后创建一个区域并使用setPath()设置一条路径,或者我缺少什么?无论哪种方式,应用程序都会在第一条路径上崩溃;如果我删除computeBounds(当然还有setPath),应用程序不会崩溃。如果我只删除setPath,应用程序就会崩溃。正如我前面所说,你可以使用足够大的clip矩形将所有可能的路径绑定为
clip
,这样你就可以避免调用沉重和不必要的
计算边界。如果Dalvik无法处理包含大量控制点的路径,则应重点使用包含少量点的较粗路径来近似路径。不计算路径边界,只设置足够大的剪辑区域即可解决问题。程序不会崩溃,对于这种复杂的路径,region.contains()是非常快的事件。你能在开始的时候编辑你的答案吗,那只是使用一个足够大的剪辑区域?既然你得到的是一个分段错误而不是一个异常,那么值得一提的是可能涉及到自己的JNI代码,并强调如果没有自己的JNI代码,这是一个例外情况,需要