2017-06-01 95 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了。 –