我试图找到计算可包含在旋转矩形内的最大(面积)矩形的最佳方法。
有些图片应该有助于(我希望)理解我的意思:
输入矩形的宽度和高度是给定的,旋转角度也是给定的。输出矩形未旋转或倾斜。
我正在走一条冗长的路线,我什至不确定它是否能处理极端情况(没有双关语)。我确信有一个优雅的解决方案。有小费吗?
EDIT:输出矩形点不一定必须接触输入矩形边缘。 (感谢E先生)
我只是来这里寻找同样的答案。在想到涉及到如此多的数学内容后,我感到不寒而栗,我想我应该求助于半受过教育的猜测。涂鸦了一下,我得出了(直观的,可能不完全准确的)结论:最大的矩形与外部生成的矩形成比例,并且它的两个相对角位于外部矩形的对角线与外部矩形的最长边的交点处。旋转的矩形。对于正方形,任何对角线和边都可以......我想我对此很满意,现在将开始清除我生锈的三角技能上的蜘蛛网(可悲的是,我知道)。
小更新...设法进行一些三角计算。这是针对图像的高度大于宽度的情况。
更新。一切顺利。这是一些js代码。它连接到一个更大的程序,大多数变量都在函数的范围之外,并且直接从函数内部修改。我知道这不好,但我在孤立的情况下使用它,这样就不会与其他脚本混淆:redacted
我冒昧地清理了代码并将其提取到一个函数中:
function getCropCoordinates(angleInRadians, imageDimensions) {
var ang = angleInRadians;
var img = imageDimensions;
var quadrant = Math.floor(ang / (Math.PI / 2)) & 3;
var sign_alpha = (quadrant & 1) === 0 ? ang : Math.PI - ang;
var alpha = (sign_alpha % Math.PI + Math.PI) % Math.PI;
var bb = {
w: img.w * Math.cos(alpha) + img.h * Math.sin(alpha),
h: img.w * Math.sin(alpha) + img.h * Math.cos(alpha)
};
var gamma = img.w < img.h ? Math.atan2(bb.w, bb.h) : Math.atan2(bb.h, bb.w);
var delta = Math.PI - alpha - gamma;
var length = img.w < img.h ? img.h : img.w;
var d = length * Math.cos(alpha);
var a = d * Math.sin(alpha) / Math.sin(delta);
var y = a * Math.cos(gamma);
var x = y * Math.tan(gamma);
return {
x: x,
y: y,
w: bb.w - 2 * x,
h: bb.h - 2 * y
};
}
我遇到了一些问题gamma
-计算,并修改它以考虑原始盒子在哪个方向上最长。
——马格努斯·霍夫
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)