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

时间:2016-02-06 10:48:25

标签: algorithm rotation geometry pseudocode

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

我有一张图片,我希望保留宽高比,因为它是一张图片。

我希望在0到90度(包括0和90度)之间找到最大比例因子和对应角度,这样图像将完全适合给定矩形。

示例1 :如果图像和矩形的比例相同,则角度将为0,比例因子将是矩形宽度与图像宽度的比率。 (或高度到高度。)

示例2 :如果图像和矩形比率彼此相反,则比例因子将与第一个示例相同,但角度将为90度。

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

1 个答案:

答案 0 :(得分:0)

好的,我自己想出来了。

首先,计算纵横比。如果你的图像是1:1,那么这里没有任何意义,因为角度始终为零,并且刻度始终为min(宽度,高度)。变性。

否则,您可以使用:

// 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;
    }
}

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

代码假定为弧度而不是度数,但转换起来并不难。

(另外,我有点震惊的是我的浏览器字典没有“弧度”。)