algorithm - 计算旋转矩形中的最大内接矩形

标签 algorithm math language-agnostic geometry

我正在尝试找到计算可以包含在旋转矩形内的最大(面积)矩形的最佳方法。

一些图片应该有助于(我希望)形象化我的意思:

input rectangle with given width and height rotate erctangle by alpha degrees output inner rectangle

输入矩形的宽度和高度是给定的,旋转的角度也是给定的。输出矩形未旋转或倾斜。

我正在沿着冗长的路线走下去,我什至不确定它是否会处理极端情况(没有双关语意)。我确信有一个优雅的解决方案。有什么建议吗?

编辑:输出矩形点不必接触输入矩形边缘。 (感谢 E 先生)

最佳答案

我只是来这里寻找相同的答案。在想到涉及如此多的数学后不寒而栗,我想我会求助于一个半受过教育的猜测。稍微涂鸦一下,我得出(直观但可能不完全准确)的结论,即最大的矩形与外部结果矩形成比例,并且它的两个相对角位于外部矩形的对角线与最长边的交点处旋转的矩形。对于正方形,任何对角线和边都可以……我想我对此很满意,现在将开始清除我生锈的三角技能上的蜘蛛网(我知道这很可怜)。

Probably not the best solution, but good enough for what I'm about to do

次要更新...设法进行了一些三角计算。这是针对图像高度大于宽度的情况。

Some trig scribbles

更新。一切正常。这是一些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 计算中遇到了一些问题,并对其进行了修改以考虑原始框在哪个方向上最长。

-- 马格努斯霍夫

关于algorithm - 计算旋转矩形中的最大内接矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5789239/

相关文章:

java - 如何使用递归实现dfs?

c - 理解算法的一部分

java - Java 中更快的 GCD(n, m)?

java - 为什么这个整数方程输出0

language-agnostic - 如何表示魔方

language-agnostic - 自安装应用程序或单独的安装程序?

最短加权路径算法 - 频繁变化的边

algorithm - 如何使用两个变量创建评分系统

java - 如何避免 double 舍入到 0

user-interface - 使用多对多关系编辑数据的 GUI 模式