给定矩形的纵横比,找到最大比例和角度以使其适合另一个矩形
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'。)
我已经阅读了几十个关于这个主题的问题,但是 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'。)