所以我有一个围绕原点旋转的物体。一旦我旋转然后改变原点。我的目标似乎是跳跃的位置。在跳跃之后,它旋转得很好...需要帮助找到模式/为什么跳跃以及我需要做些什么来阻止它。
这里是轮换代码:
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项目,您可以通过它来更好地了解发生的事情。
编辑链接 - 摆脱了原始错误和扩展错误 https://jsfiddle.net/fionoble/6k8sfkdL/13/
谢谢!
答案 0 :(得分:0)
旋转方向是您为旋转矩阵中的元素选择的符号的结果。 [这是罗德里格斯的二维旋转公式]。因此,以相反方向旋转只需减去y余弦项而不是y正弦项。
您也可以尝试查看数据的不同潜在表示形式。
如果你使用点之间的线的对称表示,你可以避免移位,而只是简单地转换你的坐标。
将[相对于旋转] c_0的原点作为对称形式的常量偏移。
你有一个相对于c_0的点p:
var A = (p.x - c_0.x);
var B = (p.y - c_0.y);
//This is the symmetric form.
(p.x - c_0.x)/A = (p.y - c_0.y)/B
在坐标变化和线上的任何点(也可以处理缩放/扩张)时都是如此。
然后在更改旋转坐标之后,您已经[注意到此旋转具有相反的意义,与您的旋转不同]。
//This is the symmetric form of the line incident on your rotated point
//and on the center of its rotation
((p.x - c_0.x) * c + (p.y - c_0.y) * s)/A = ((p.x - c_0.x) * s - (p.y - c_0.y) * c)/B
所以,乘以我们得到
(pn.x - c_0.x) * B * c + (pn.y - c_0.y) * B * s = (pn.x - c_0.x) * A * s - (pn.y - c_0.y) * A * c
重新排列
(pn.x - c_0.x) * (B * c - A * s) = - (pn.y - c_0.y) * (B * s + A * c)
pn.y = -(pn.x - c_0.x) * (B * c - A * s) / (B * s + A * c) + c_0.y;
任何缩放。