2014年2月26日水曜日

新作Androidアプリ開発 ボールをランダムに配置しよう編

ボールを操作で投げれるようになったので、今回はボールを任意のエリアにランダムに配置してみましょう
配置したいエリアはというと、距離的にフリースローからスリーポイントまでの間にあたる扇状の青の部分です
操作の都合上、リングの左右側の鋭角を10°程削っています
これをどう計算してランダムな座標を生成するか
もし対象とするエリアが長方形だったりすると話は簡単です
XとY軸の対象範囲をRandom.nextInt(value)するだけ
Rect area = new Rect(100, 100, 400, 300);
Random random =new Random();
int x = area.left + random.nextInt(area.width());
int y = area.top + random.nextInt(area.height());
試しに1000個ほど生成して描画してみましょう

Rect area = new Rect(100, 100, 400, 300);
canvas.drawRect(area, paint);
Random random =new Random();
for (int i = 0; i < 1000; i++) {
    int x = area.left + random.nextInt(area.width());
    int y = area.top + random.nextInt(area.height());
    canvas.drawCircle(x, y, 3f, paint);
}
なんか気持ち悪いですね
今回は変形扇形のエリアではいろいろと方法はあると思いますが、このような考え方で生成しました
赤枠部分フリースローラインからスリーポイントラインまでの範囲でランダムにセットした座標を、対象範囲角をランダムにセットして回転する

ソースとしてはこのような感じ
Random random =new Random();
Plot ring = new Plot(7500, 1882);
for (int i = 0; i < 1000; i++) {
    //リングX座標+フリースローラインまでの距離(4.118m)+フリースローラインからスリーポイントラインの間(2.52m)の間のランダム値
    Plot base = new Plot(ring.x + 4118 + ((2520 * random.nextInt(100)) / 100), ring.y);
    //削った10度+配置部分160°のランダム値
    int angle = 10 + random.nextInt(160);
    //回転処理
    Plot pos = Utl.rotate(angle, ring, base);
    //描画座標変換
    pos = Court.getDPlot(pos);
    canvas.drawCircle(pos.x, pos.y, 3f, paint);
}
試しに1000個ほど生成して描画
よさそうです

0 件のコメント:

コメントを投稿