そうは言っても、あなたの一般的な考えは正しいです。問題は、それをどうにかして最適化できるかということです。
ここで採用できる可能性のある方法はたくさんあります。秘訣は、データを整理する方法にあります。現在のケースでは、感度変数をスパンとして中心点を実行しています。最初の最適化は、中心点から左右に上下に移動する感度を使用する代わりに、左上の点から左右にのみ移動するスパンを持つ左上の点を実装することであると想像できます。その場合、ifステートメントは次のようになります。
if(x > cxy[z][0] && x < (cxy[z][0]+sensivity) && y > cxy[z][1] && y < (cxy[z][1]+sensivity))
それで、これはあなたのために何をしますか:この上記の最適化はあなたが同じ全体量のデータを保持することを可能にしますが、チェックごとに2つの数学演算を取り除きます。入力パラメータが両方とも浮動小数点であることを考慮すると、これによりかなりの時間を節約できます。
すべてのピクセルベースの操作を実行している場合は、次の最適化に進みます。浮動小数点の代わりに整数を使用してすべての計算を実行します。これにより、アルゴリズム全体の時間が大幅に短縮されます。
さらに最適化すると、パフォーマンスを向上させるためにより多くのRAMを使用する場合は、リージョンごとに1ポイントを設定する代わりに、リージョンごとに左上と右下のポイントを設定できます。これにより、ifステートメントは次のようになります。
if(x > tlxy[z][0] && x < brxy[z][0] && y > tlxy[z][1] && y < brxy[z][1])
where tlxy is the array of top-left points, brxy is the array of bottom-right points
and z is still the "region" you are checking against
これはどのように役立ちますか:上記のifステートメントでわかるように、これには明示的な数学演算がまったくありません。このアルゴリズムをサポートするには、配列cxyの元の2倍のメモリを使用する必要があります。
これでループ内で、24のリージョンポイントすべてを通過します。どのリージョンもオーバーラップしていないことを確実に知っている場合、ポイントは実際には一度に1つのリージョンにしか分類できません。ポイントをインクリメントするポイントでforループを解除することにより、ほとんどのxy入力ポイントで時間を節約できます。これは次のようになります。
public void checkCoordinate(float x, float y){
for(int z = 0; z < 24; z++){
if(x > tlxy[z][0] && x < brxy[z][0] && y > tlxy[z][1] && y < brxy[z][1]){
points += 1;
break;
}
}
}
上記は、重複する領域がない(エッジさえない)ことが確実にわかっている場合にのみ機能します。
最終的な最適化では、可能性があることがわかります。リージョンがどのように見えるかに応じて、すべてのリージョンを象限に事前に分離することができます。このようにして、xポイントが画面の左側または右側にあるかどうかをテストしてから、yポイントが上部または下部にあるかどうかをテストできます。リージョンの分布がかなり均一である場合、象限内のリージョンをテストする必要があるだけでなく、テスト時間を4短縮できる可能性があります(指定された統計分布が私が言ったことである場合)。最悪の場合、すべての領域が単一の象限にあり、テストするすべてのポイントがその象限にあります。この場合、複雑さの観点からの問題は以前よりも悪くはありません。入力xとyにセットアップテストを追加するだけです。
これで、少なくとも途中で始めるのに十分な情報が得られることを願っています!!!