1

人間/バクテリアのグループがお互いを追いかけるアプリケーションを作ろうとしています。しかし、ターゲットに向かって真っ直ぐに行かせようとすると、代わりにすべてが左に移動します。(「ターゲット」と言うのは、一方が他方のメンバーをターゲットにしているためです。) 最初の x、y 座標がある三角法を使用してみましたが、勾配と移動距離で次の x、y 座標を見つける必要があります。知られています。関連するコードは次のとおりです。

/*Functions for calculating next x, y*/
function calculate_nextX(startx, length, slope)
{
    var x = 0;
    var degree = Math.atan(slope);
    x = (startx + (length * Math.sin(degree * 0.0174)));
    return x;
}
function calculate_nextY(starty, length, slope)
{
    var y = 0;
    var degree = Math.atan(slope);
    y = (starty + (length * Math.cos(degree * 0.0174)));
    return y;
}

/*Where the functions get used*/

function updateeverything()
{
    for(var i=0;i<=49;i++)
    {
        if(bacteriaGroup[i].dead == false)
        {
            if(humanGroup[bacteriaGroup[i].target].dead == true)
            {
                bacteriaGroup[i].target = settarget(true,i);
            }
            var left = parseInt(document.getElementById("bacteria"+i).style.left);
            var left1 = parseInt(document.getElementById("human"+bacteriaGroup[i].target).style.left);
            var top = parseInt(document.getElementById("bacteria"+i).style.top);
            var top1 = parseInt(document.getElementById("human"+bacteriaGroup[i].target).style.top);

            var finalleft = calculate_nextX(left,1,(top1-top)/(left1-left));
            var finaltop = calculate_nextY(top,1,(top1-top)/(left1-left));
            document.getElementById("bacteria"+i).style.left = finalleft;
            document.getElementById("bacteria"+i).style.top = finaltop;
        }
        if(humanGroup[i].dead == false)
        {
            if(bacteriaGroup[humanGroup[i].target].dead == true)
            {
                humanGroup[i].target = settarget(false,i);
            }
            var left = parseInt(document.getElementById("human"+i).style.left);
            var left1 = parseInt(document.getElementById("bacteria"+humanGroup[i].target).style.left);
            var top = parseInt(document.getElementById("human"+i).style.top);
            var top1 = parseInt(document.getElementById("bacteria"+humanGroup[i].target).style.top);
            var finalleft = calculate_nextX(left,1,(top1-top)/(left1-left));
            var finaltop = calculate_nextY(top,1,(top1-top)/(left1-left));
            document.getElementById("human"+i).style.left = finalleft;
            document.getElementById("human"+i).style.top = finaltop;
        }
    }
}
4

2 に答える 2

1

表現

(top1-top)/(left1-left)

ターゲットが上下左右にあるかどうかに関係なく、同じ値を持ちます。これがあなたの問題の根源かもしれません。

私が提案する:

var distance_to_target = sqrt((top1-top)*(top1-top) + (left1-left)*(left1-left));
var fraction_of_distance = length / distance_to_target;
var dx = (left1 - left) * fraction_of_distance;
var dy = (top1 - top) * fraction_of_distance;

また、css の場所は最も近い整数に丸められるため、移動量が少ない場合は、論理的な場所で作業を行い、最後に丸める必要があることに注意してください。

于 2013-01-17T05:32:44.710 に答える
0

あなたslopeは上と下/左と右への移動を区別しません-それはの比率だけですx/y. を取得するには、と値のdegree両方が必要で、関数(JS では) を使用する必要があります。xyatan2Math.atan2

ただし、方向に度数を使用する理由はまったくありません。単純なピタゴラスの定理を使用して、次の座標を簡単に (そしてはるかに高速に) 計算できます。

于 2013-01-17T06:02:32.747 に答える