给定矩形的纵横比,找到最大比例和角度以使其适合另一个矩形

Given aspect ratio of a rectangle, find maximum scale and angle to fit it inside another rectangle

我已经阅读了几十个关于这个主题的问题,但是 none 似乎正是我要找的,所以我希望这不是重复的。

我有一张图片,我想保持其纵横比,因为它是一张图片。

我想找到最大比例因子,以及对应的角度介于0度和90度之间(含),这样图像就会适合完全在给定的矩形内。

例1:如果图片和矩形的比例相同,则角度为0,比例因子为矩形的宽度与图片的宽度之比. (或高度比。)

示例2:如果图像和矩形的比例互为倒数,则比例因子与第一个示例相同,但角度为90度.

所以,对于一般情况,给定 image.width、image.height、rect.width、rect.height,我如何找到 image.scale 和 image.angle?

好的,我自己想出来了。

首先,计算纵横比。如果您的图像是 1:1,那么这没有意义,因为角度始终为零,并且比例始终为 min(Width, Height)。退化.

否则,你可以使用这个:

// assuming below that Width and Height are the rectangle's

_imageAspect = _image.width / _image.height;
if (_imageAspect == 1) { // div by zero implied
    trace( "square image...this does not lend itself to rotation ;)" );
    return;
}
_imageAspectSq = Math.pow( _imageAspect, 2 );

var rotate:Float;
var newHeight:Float;
if (Width > Height && Width / Height > _imageAspect) { // wider aspect than the image
    newHeight = Height;
    rotate = 0;
} else if (Height > Width && Height / Width > _imageAspect) { // skinnier aspect than the image rotated 90 degrees
    newHeight = Width;
    rotate = Math.PI / 2;
} else {
    var hPrime = (_imageAspect * Width - _imageAspectSq * Height) / ( 1 - _imageAspectSq );
    var wPrime = _imageAspect * (Height - hPrime);
    rotate = Math.atan2( hPrime, wPrime );
    var sine = Math.sin(rotate);
    if (sine == 0) {
        newHeight = Height;
    } else {
        newHeight = (Width - wPrime) / sine;
    }
}

前两种情况也是退化的:图像的纵横比小于矩形。这类似于矩形内正方形的情况,只是在那种情况下,正方形 总是 退化。

代码采用弧度而不是度数,但转换起来并不难。

(另外我有点震惊我的浏览器字典没有 'radians'。)