0

だから、これに対する答えは簡単なものになると確信しており、それを読んですぐに壮大なフェイスパルミングを開始しますが、現時点では、なぜこれが機能していないのか疑問に思って一日を過ごしました。問題を見つけます...

中心軸を中心に2Dポイントを回転させる単純な(とにかく)システムを構築しようとしていますが、これまでに2つの問題が見つかりました。これは私にはまったく意味がありません。

問題1:入力オブジェクトに割り当てられた正/負の数が、一見ランダムな方法でフリップフロップされています。問題2:回転の計算は正しいですが、結果は何でもありません。

この問題を再現するためのコードは次のとおりです。

function doRotate(pos){
    //convert angle to radians
    var ang = 90 * Math.PI / 180;

    //rotate points
    pos.left = Math.round(pos.left * Math.cos(ang) + pos.top * Math.sin(ang));
    pos.top = Math.round(pos.top * Math.cos(ang) - pos.left * Math.sin(ang));

    return pos;
}

var points = {
    'a':{left:32,top:32},
    'b':{left:-32,top:32},
    'c':{left:-32,top:-32},
    'd':{left:32,top:-32}
};

for( var k in points ){
    var msg = 'Start: X:'+points[k].left+' Y:'+points[k].top+'<br />';
    points[k] = doRotate(points[k]);
    var msg = msg+'End: X:'+points[k].left+' Y:'+points[k].top+'<br />';
    document.write( '<p>'+k+':<br />'+msg+'</p>' );
}

これで、次のように表示されます。a:開始:X:32 Y:32終了:X:32 Y:-32

b:開始:X:-32 Y:32終了:X:-32 Y:-32

c:開始:X:-32 Y:-32終了:X:-32 Y:32

d:開始:X:-32 Y:32終了:X:32 Y:32

しかし、代わりにあなたはこれを手に入れます:

a:開始:X:32 Y:32終了:X:32 Y:32

b:開始:X:-32 Y:-32終了:X:32 Y:32

c:開始:X:-32 Y:-32終了:X:-32 Y:-32

d:開始:X:32 Y:32終了:X:-32 Y:-32

計算をトリプルチェックしました。これは、2Dで原点を中心にポイントを回転させるのに100%正確です。このテストをPHPで再作成したところ、完全に機能します。私が理解できないのは、なぜJSがa)変数の割り当てを台無しにし、b)正しい結果が得られないのかということです。

パトリック卿が誇りに思うであろうフェイスパームで彼らの洞察に敬意を表するので、助けることができる人は誰でも安心するかもしれません;)

4

3 に答える 3

2

ちょっと待ってください-pos.left計算する前に保存して、その計算で古い値をpos.top使用できるようにするべきではありませんか? pos.left

于 2011-01-20T17:26:52.887 に答える
1

「varmsg=...」ステートメントでは、points [k] .leftを2回印刷し、points[k].topを印刷することはありません。

于 2011-01-20T17:24:38.420 に答える
1

facepalmを開始します:

for( var k in points ){
    var msg = 'Start: X:'+points[k].left+' Y:'+points[k].left+'<br />';
    points[k] = doRotate(points[k]);
    var msg = msg+'End: X:'+points[k].left+' Y:'+points[k].left+'<br />';
    document.write( '<p>'+k+':<br />'+msg+'</p>' );
}

読む必要があります

for( var k in points ){
    var msg = 'Start: X:'+points[k].left+' Y:'+points[k].top+'<br />';
    points[k] = doRotate(points[k]);
    var msg = msg+'End: X:'+points[k].left+' Y:'+points[k].top+'<br />';
    document.write( '<p>'+k+':<br />'+msg+'</p>' );
}

leftプロパティを印刷する必要があるときにYのtopプロパティを印刷しています

于 2011-01-20T17:26:16.990 に答える