3

私の 2D レイ トレーサーは、計算されたレイを角度 (具体的にはラジアン) でソートするまでは問題なく動作していました。タンの行動に関係していると思いますが、よくわかりません。衝突と起点の既知の x、y を使用して角度を並べ替える最良の方法は何ですか? 私は同じ問題に2週間オンとオフで取り組んでおり、ほとんどすべてを試しました.

私は今ここに写真をアップロードすることができます: これはそれが機能するときです したがって、そうでない場合(スクリーンキャプチャ時に切り取られた赤いボックスは無視してください) あなたがそれをいじりたいなら、ここに有罪のコードがあります:

function sortByAngle(pos){
for (var i = viewFeild.length - 1; i >= 0; i --) {      
    viewFeild[i][3] = Math.atan((viewFeild[i][4]-pos.y)/(viewFeild[i][0]-pos.x));
    if(viewFeild[i][5]<pos.y)
        viewFeild[i][6] = viewFeild[i][7]*-1-4;

    if (viewFeild[i][8]<0) {viewFeild[i][9]+=2};
};

viewFeild.sort(function(a,b){return a[2]-b[2]});
}

function fillView(pos) {

for (var i = viewFeild.length - 1; i >= 0; i--) {
    //console.log(i+"     "+viewFeild[i][10] + "   " + viewFeild[(i+1)%viewFeild.length][11])
    //console.log(viewFeild.length)
    ctx.beginPath();
    ctx.moveTo(pos.x, pos.y);
    ctx.lineTo(viewFeild[i][0]+pos.x, viewFeild[i][12]+pos.y);
    ctx.lineTo(viewFeild[(i+1)%viewFeild.length][0]+pos.x, viewFeild[(i+1)%viewFeild.length][13]+pos.y);
    ctx.closePath();
    ctx.fillStyle = "rgba(100, " + 35*i  + ", 100, .6)";
    ctx.fill();
};
}

js コード全体と html を含む Google ドキュメントを次に示します (html は js の後にあり ます)

4

1 に答える 1

2

最初に行うことは、コードを明確にすることです。
1) 逆の順序で配列を埋める必要はありません。
2) atan2 を使用します - ラジアンを扱う方法がわかりませんでした...
3) 再利用する配列要素をキャッシュします。
4) ソートごとに 1 つのソート関数を作成しないでください。
5) 正しい順序で並べ替えれば、逆順に表示する必要はありません。

状況が明確になると、ポイントの y にフィールド 3、5、または 6 を使用していることが奇妙に感じられます。y データのオフセットは 1 つだけで十分です ;-)

function sortByAngle(center) {
    for (var i = 0 ; i<viewFeild.length ; i++) {
        var thisField = viewFeild[i] ; 
        thisField[2] = Math.atan2( thisField[3] - center.y) 
                                    , (thisField[0] - center.x));
    };
    viewFeild.sort(sortOnSecondItem);
}

function fillView(pos) {
    for (var i = 0 ; i<viewFeild.length ; i++) {
        var thisField = viewFeild[i] ; 
        var nextField = (i==viewFeild.length-1) ?
                            viewFeild[0] 
                          : viewFeild[i+1] ;
        ctx.beginPath();
        ctx.moveTo(pos.x, pos.y);
        ctx.lineTo(thisField[0] + pos.x, thisField[5] + pos.y);
        ctx.lineTo(nextField[0] + pos.x, nextField[6] + pos.y);
        ctx.closePath();
        ctx.fillStyle = "rgba(100, " + 35 * i + ", 100, .6)";
        ctx.fill();
    };
}

function sortOnSecondItem(a,b) { return a[2] - b[2] }
于 2014-04-15T08:51:49.633 に答える