我正在处理图像缩放应用程序,并给出缩放比例和矩形。我需要将矩形与比率相乘,但也要确保生成的矩形只包含整数(即没有浮点)。如果不是,我想扩展源矩形,以使上述条件成立。对整数进行舍入,使其乘以浮点数返回整数
目前我很勉强它(代码如下)。但我很肯定有一种方法可以用聪明的数学来做这件事。
RECT AdjustRectWholeNumber(RECT SrcRect, float ratio)
{
RECT adjustedRect = SrcRect;
while (!isWholeNumber(adjustedRect.left * ratio))
{
adjustedRect.left--;
}
while (!isWholeNumber(adjustedRect.top * ratio))
{
adjustedRect.top--;
}
while (!isWholeNumber(adjustedRect.right * ratio))
{
adjustedRect.right++;
}
while (!isWholeNumber(adjustedRect.bottom * ratio))
{
adjustedRect.bottom++;
}
return adjustedRect;
}
实例:假设矩形(78,188,1068,790)和比1.25,则它应该返回(76,188,1068,792)
推理:如果我是乘以(78,188,1068, 790)减少1.25,它会给我(97.5,188,1068,987.5)。这是不理想的,因为如果我缩放(缩小或缩小)缩放的矩形,我会失去精度,这在屏幕上显示为小的损坏伪像。就像我们扩展源矩形一样,在乘以比例因子后,我们可以得到所有的整数,不会丢失精度,从而不会出现损坏。
注:缩放比例保证能够生产整数
任何帮助表示赞赏!
编辑:添加isWholeNumber
代码的要求
bool isWholeNumber(float f)
{
if (floor(f) == f)
return true;
return false;
}
澄清,让我们假设,我将永远得到唯一的比率(1.25,1.5,1.75,2.0,2.25)
你可能会更好地传递一个实际的比率或分数(即分子/分母作为'int's)。如果我通过pi传递,不确定你的函数需要返回什么? – franji1
你可以包含'isWholeNumber'的代码吗? –
“(78,188,1068,790)和1.25,它应该返回(76,188,1068,792)”?它不应该是(x',y',1335,988)。伪代码/数学是'newWidth =((int)(oldWidth * ratio + 0.5f))'0.5来说明四舍五入。 (x',y')将基于您要缩放的点。 – SGM1