【问题标题】:compute bounds of a path crash计算路径崩溃的边界
【发布时间】:2012-10-05 06:07:14
【问题描述】:

我已经关闭了由许多 Bezier 段组成的 Path-s。这些贝塞尔线段的整数坐标最大为 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));

我对每个路径执行一次,然后执行

region.contains(x, y);

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

有没有其他方法可以计算一个点是否在一个复杂的路径内,这不会崩溃?

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

编辑 2 这发生在带有 4.1.1 和 4.1.2 的 Nexus 7 以及 ICS x86 平板电脑模拟器中

【问题讨论】:

  • 我确定“bounds”对象为空。检查一下。

标签: android path contains point bounds


【解决方案1】:

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

您可以使用足够大的剪辑矩形将所有可能的路径绑定为剪辑区域,而不是计算路径的边界,这对于您的复杂路径来说似乎过于昂贵。

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");
}

【讨论】:

  • 我的应用程序中没有本机代码。我在其他地方读到,setPath 和 computeBounds 对于大路径可能会像这样崩溃。我看不出我们的代码有什么区别。两者都定义了一个路径,然后计算它的边界,然后创建一个区域并使用 setPath() 设置一个路径,或者我错过了什么?无论哪种方式,应用程序都会在第一个 path.computeBounds(bounds, true);如果我删除 computeBounds(当然还有 setPath),应用程序不会崩溃。如果我只删除 setPath,应用程序就会崩溃。
  • 正如我上面所说,您可以使用足够大的剪辑矩形将所有可能的路径绑定为clip,这样您就可以避免调用繁重且不必要的computeBounds。如果 Dalvik 无法处理包含大量控制点的路径,那么您应该专注于用较少点的较粗略的路径来近似您的路径。
  • 不计算路径的边界,只设置一个足够大的剪辑区域就解决了这个问题。程序不会崩溃,并且 region.contains() 是这个复杂路径的真正快速事件。你可以在开始时编辑你的答案,只使用足够大的剪辑区域吗?那我就接受了。
  • 由于您得到的是分段错误而不是异常,因此值得一提的是可能涉及自己的 JNI 代码,并强调这是一个例外情况,如果没有自己的 JNI 代码,需要非标准解决方法。
  • 如前所述,我没有自己的原生代码。 Path 和 Region 类本身使用本机代码来处理许多事情。有趣的是,它不能计算边界,而是计算一个点是否在闭合路径内而没有任何问题,这是一项要求更高的任务。再次感谢你。
猜你喜欢
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
相关资源
最近更新 更多