我想根据收到的角度旋转指南针图像。输入度在0到359之间,所以当我从0旋转-1度时,图像旋转一整圈并设置为359:

function setCompass(degrees){
    $("#compass").stop().transition({rotate: -1*degrees +'deg'});
}


我试图通过返回-1(而不是359)来解决该问题,因此将代码更改为以下内容:

function setCompass(degrees){
    if (degrees>180){degrees=degrees-360}
    $("#compass").stop().transition({rotate: -1*degrees +'deg'});
}


它解决了0和360的滞后问题,但问题转移到180。现在,当我将设备从180旋转到181时,它旋转了一个完整的负回合,返回到-179!请建议我如何修改计算,以便每个度数都能平稳变化?

最佳答案

您可以使用一些取模公式来确定是顺时针还是逆时针旋转。使用jQuery的data方法保持当前角度(因此,如果您愿意,可以拥有多个这样的指南针),并允许以CSS值传递的角度在0-359范围之外。

运作方式如下:



function setCompass(degrees){
    var curr = $("#compass").data("rotation") || 0;
    var next = curr + ((degrees - curr)%360 + 180*3) % 360 - 180;
    $("#compass").data("rotation", next).stop().transition({rotate: -next + 'deg'});
}

// Demo with randomly generated angles between 0 and 359
setInterval(function() {
    setCompass(Math.floor(Math.random()*360));
}, 1000);

<img id="compass" src="https://i.stack.imgur.com/zdHVn.png" width="100px" height="100px">

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.transit/0.9.12/jquery.transit.min.js"></script>

10-06 00:52