【发布时间】:2015-08-15 08:05:01
【问题描述】:
所以我有一个围绕原点旋转的对象。一旦我旋转然后更改原点。我的对象似乎跳了位置。跳跃后它旋转良好......需要帮助找到模式/为什么它会跳跃以及我需要做些什么来阻止它。
这是轮换代码:
adjustMapTransform = function (_x, _y) {
var x = _x + (map.width/2);
var y = _y + (map.height/2);
//apply scale here
var originPoint = {
x:originXInt,
y:originYInt
};
var mapOrigin = {
x:map.x + (map.width/2),
y:map.y + (map.height/2)
};
//at scale 1
var difference = {
x:mapOrigin.x - originPoint.x,
y:mapOrigin.y - originPoint.y
};
x += (difference.x * scale) - difference.x;
y += (difference.y * scale) - difference.y;
var viewportMapCentre = {
x: originXInt,
y: originYInt
}
var rotatedPoint = {};
var angle = (rotation) * Math.PI / 180.0;
var s = Math.sin(angle);
var c = Math.cos(angle);
// translate point back to origin:
x -= viewportMapCentre.x;
y -= viewportMapCentre.y;
// rotate point
var xnew = x * c - y * s;
var ynew = x * s + y * c;
// translate point back:
x = xnew + viewportMapCentre.x - (map.width/2);
y = ynew + viewportMapCentre.y - (map.height/2);
var coords = {
x:x,
y:y
};
return coords;
}
这里还有一个 JS Fiddle 项目,您可以在其中玩耍,让您更好地了解正在发生的事情。
EDITED LINK - 摆脱了 originY 错误和缩放错误 https://jsfiddle.net/fionoble/6k8sfkdL/13/
谢谢!
【问题讨论】:
-
不仅移动 y 原点在 x 移动之前无效
-
scale 也不起作用,因为我认为它应该,例如,如果您缩放更改原点然后缩放它不会将新大小添加到前一个大小,而是重新缩放,就好像我将地图居中一样设置原点然后缩放,而不是我缩放更改原点然后再次缩放。
-
谢谢@MuhammadUmer。我用 originY 错误修复编辑了 JSFiddle
-
好像我需要反向旋转原点
-
jsfiddle.net/xerxesnoble/yt7dbj03 我更新了您的代码,以便地图围绕不断变化的原点旋转/缩放。事实上,您的代码按原样工作。我只是在 displayLoop 的每个“步骤”上更新原点,而不是
oninput。但是,这表明您的问题出在其他地方:变化的原点实际上转换了#mapContainer内的地图 x/y 位置。
标签: javascript math rotation