2017-06-01 97 views
0

我正在处理图像缩放应用程序,并给出缩放比例和矩形。我需要将矩形与比率相乘,但也要确保生成的矩形只包含整数(即没有浮点)。如果不是,我想扩展源矩形,以使上述条件成立。对整数进行舍入,使其乘以浮点数返回整数

目前我很勉强它(代码如下)。但我很肯定有一种方法可以用聪明的数学来做这件事。

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)

+1

你可能会更好地传递一个实际的比率或分数(即分子/分母作为'int's)。如果我通过pi传递,不确定你的函数需要返回什么? – franji1

+2

你可以包含'isWholeNumber'的代码吗? –

+2

“(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

回答

2

我不不要认为你说的问题通常有很好的解决方法。并非所有的“好”分数都具有精确的浮点数(例如4/3不)。一般来说,精确表示只适用于那些功率为2的分数作为分母。如果您尝试使用“坏”分数的近似值,您将得到一个分母,其分母大约为2^-20,即大约10^-6拟合,这是毫无意义的。因此,显而易见的建议是使用一些明确的自定义类型来将分数表示为显式(整数)分子和分母。如果你对分母有明确的价值,任务就变得微不足道了。另外,如果你确信

我将永远得到唯一的比率(1.25,1.5,1.75,2.0,2.25)

你可以有一个简单的函数,将匹配值,并说,如果分母是1,24。如果你有更多的可能值,但所有的分数都有2的分母,你也可以考虑使用frexp/frexpf来得到指数(分母的2的幂)

所以现在当你有一个整数分母时,一切都很简单:你只需要找到一个可以被它整除的数字。你可以用整数除法和乘法(假设你的值是正数):

int roundDown(int value, int denominator) { 
    return (value/denominator) * denominator; 
} 

int roundUp(int value, int denominator) { 
    return ((value + denominator - 1)/denominator) * denominator; 
} 
+0

很明显,这些比率相当于“5/4”,“3/2”,“7/4”,“2/1”,“9/4”。如果你真的可以用这种方式表达它们而不是浮点比例,那么你就是金。如果您接受有限数量的分母和由此产生的可能错误,可以编写一个函数返回给定数字的最近分子/分母组合。 –

+0

@MarkRansom,我不知道这个评论与我在我的回答中建议的不同,因为“_因此,显而易见的建议是使用一些明确的自定义类型来表示分数作为显式(整数)分子和分母。”? – SergGr

+0

这并没有什么不同,我只是强调你已经提出的观点。我*之后*我给你+1了。 –