基本上我是在问这个问题与JavaScript有关:从旋转矩形计算边界框坐标。
我有一个部分解决方案,但X/Y坐标的计算没有正常工作...
我觉得我离成功很近,但又似乎很远...
非常感谢您能提供的任何帮助!
为了帮助不会JavaScript的人...
一旦HTML元素被旋转,浏览器会返回一个“矩阵变换”或“旋转矩阵”,它似乎是这样的:
我有一种感觉,这将启示我们如何仅基于旋转元素(蓝色)的宽度、高度和角度来获取边界框(红色)的X、Y坐标。
新资讯
嗯...有趣...
看起来,尽管浏览器为旋转的对象正确报告了X/Y,但未旋转的版本仍存在“幽灵”X/Y。似乎这是操作顺序:
- 从X,Y为20,20的未旋转元素开始 - 旋转该元素,导致将X,Y报告为15,35 - 通过JavaScript/CSS移动该元素到X,Y 10,10 - 浏览器逻辑上将元素反向旋转回20,20,移动到10,10,然后重新旋转,导致X,Y为5,25
所以...我希望元素在旋转后最终停留在10,10,但由于元素(似乎)在移动后重新旋转,所以结果的X,Y与设置的X,Y不同。
这是我的问题!所以我真正需要的是一个函数,它可以获取所需的目标坐标(10,10),并从那里向后计算出起始X、Y坐标,以使元素旋转到10,10。至少现在我知道了我的问题,因为由于浏览器的内部工作原理,似乎旋转的元素中的10等于5!
- iX = 旋转(蓝色)HTML元素的宽度
- iY = 旋转(蓝色)HTML元素的高度
- bx = 边界框(红色)的宽度
- by = 边界框(红色)的高度
- x = 边界框(红色)的X坐标
- y = 边界框(红色)的Y坐标
- iAngle/t = HTML元素(蓝色;未在下面的代码中显示,但用于代码中),旋转角度。FYI:在此示例中为37度(对于示例无关紧要)
我有一个部分解决方案,但X/Y坐标的计算没有正常工作...
var boundingBox = function (iX, iY, iAngle) {
var x, y, bx, by, t;
//# Allow for negetive iAngle's that rotate counter clockwise while always ensuring iAngle's < 360
t = ((iAngle < 0 ? 360 - iAngle : iAngle) % 360);
//# Calculate the width (bx) and height (by) of the .boundingBox
//# NOTE: See https://dev59.com/x3A75IYBdhLWcg3wkJz1
bx = (iX * Math.sin(iAngle) + iY * Math.cos(iAngle));
by = (iX * Math.cos(iAngle) + iY * Math.sin(iAngle));
//# This part is wrong, as it's re-calculating the iX/iY of the rotated element (blue)
//# we want the x/y of the bounding box (red)
//# NOTE: See https://dev59.com/NGkw5IYBdhLWcg3wVpBi
x = (1 / (Math.pow(Math.cos(t), 2) - Math.pow(Math.sin(t), 2))) * (bx * Math.cos(t) - by * Math.sin(t));
y = (1 / (Math.pow(Math.cos(t), 2) - Math.pow(Math.sin(t), 2))) * (-bx * Math.sin(t) + by * Math.cos(t));
//# Return an object to the caller representing the x/y and width/height of the calculated .boundingBox
return {
x: parseInt(x), width: parseInt(bx),
y: parseInt(y), height: parseInt(by)
}
};
我觉得我离成功很近,但又似乎很远...
非常感谢您能提供的任何帮助!
为了帮助不会JavaScript的人...
一旦HTML元素被旋转,浏览器会返回一个“矩阵变换”或“旋转矩阵”,它似乎是这样的:
rotate(Xdeg) = matrix(cos(X), sin(X), -sin(X), cos(X), 0, 0);
请参阅此页面获取更多信息。我有一种感觉,这将启示我们如何仅基于旋转元素(蓝色)的宽度、高度和角度来获取边界框(红色)的X、Y坐标。
新资讯
嗯...有趣...
看起来,尽管浏览器为旋转的对象正确报告了X/Y,但未旋转的版本仍存在“幽灵”X/Y。似乎这是操作顺序:
- 从X,Y为20,20的未旋转元素开始 - 旋转该元素,导致将X,Y报告为15,35 - 通过JavaScript/CSS移动该元素到X,Y 10,10 - 浏览器逻辑上将元素反向旋转回20,20,移动到10,10,然后重新旋转,导致X,Y为5,25
所以...我希望元素在旋转后最终停留在10,10,但由于元素(似乎)在移动后重新旋转,所以结果的X,Y与设置的X,Y不同。
这是我的问题!所以我真正需要的是一个函数,它可以获取所需的目标坐标(10,10),并从那里向后计算出起始X、Y坐标,以使元素旋转到10,10。至少现在我知道了我的问题,因为由于浏览器的内部工作原理,似乎旋转的元素中的10等于5!