2

多くのベジエ セグメントで構成されるパスを閉じました。これらのベジエ セグメントには、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));

私はそれをパスごとに1回行い、次に行います

region.contains(x, y);

問題は、computeBounds が大きなパスのアプリをクラッシュさせることです。強制終了はありません。SIGSEGV を受信して​​ホーム画面に戻り、メッセージは表示されません。座標をより小さい数値 (1000 で除算) に縮小しようとしましたが、役に立ちませんでした。プログラムは依然としてクラッシュします。

ポイントが複雑なパス内にあるかどうかを計算する他の方法はありますか?これはクラッシュしませんか?

EDIT RenderScriptでこれを計算する方法はありますか? パス/ベジエ曲線を含む RenderScript の例が見つかりません...

EDIT 2 これは、Nexus 7の4.1.1と4.1.2、およびICS x86タブレットエミュレーターでも発生します

4

1 に答える 1

4

通常、Java コードはセグメンテーション違反ではなく例外になります。これは、プロジェクトに独自の JNI コードがあり、それがセグメンテーション違反を引き起こしている場合を除き、Java 仮想マシンに何か問題があることを意味します。

パスの境界を計算する代わりに、複雑なパスにはコストがかかりすぎるように思われる操作を行う代わりに、十分に巨大なクリップ四角形を使用して、可能なすべてのパスをクリップ領域としてバインドできるため、重くて不要な 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");
}
于 2012-10-17T10:23:58.943 に答える