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: Start: X:32 Y:32 End: 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

开始打脸:

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 回答
1

在您的“var msg = ...”语句中,您要打印 points[k].left 两次,而不是打印 points[k].top。

于 2011-01-20T17:24:38.420 回答