2009-09-03 64 views
42

我有一個源矩形和一個目標矩形。我需要找到在擬合目標矩形時可以縮放源的最大比例尺,並且保持其原始高寬比爲的如何在另一個矩形內將一個矩形縮放爲可能的最大尺寸?

Google找到one這樣做的方法,但我不確定它是否適用於所有情況。這裏是我自己釀造的解決方案:

  • 計算每個矩形的高度/寬度。這給出了對角線msrcmdest的斜率。
  • 如果msrc < mdst,規模源寬度(由和規模高度相同的比率)寬度
  • 否則,規模源高度以適應目標由以適應目標高度(和刻度寬度相同比例)

尋找其他可能的解決方案來解決這個問題。我甚至不確定我的算法是否適用於所有情況!

回答

84
scale = min(dst.width/src.width, dst.height/src.height) 

這是你的方法,但寫得更乾淨。

+4

甜!一旦你的規模,用這些來得到最終的尺寸:寬'= src.width * scale'和'高度= src.height * scale' – 2013-09-12 02:04:22

+4

變化最小,最大,如果你想覆蓋整個目標區域。 – Glogo 2014-06-17 10:45:37

+6

相同的解決方案,但其名稱更清楚對我說:'規模=分鐘(maxWidth/ActualWidth的,maxHeight /的ActualHeight)','newWidth = ActualWidth的* scale','newHeight =的ActualHeight * scale'。 – 2014-08-06 08:38:22

1
  1. 制定出destWidth/srcWidth較小和destHeight/srcHeight
  2. 比例由

編輯這是當然的與您的方法,用式的碎片四處移動。我的意見是這是更清晰的語義,但它只是 - 一個意見。

10

另一種選擇可能是擴展到最大寬度,然後檢查縮放的高度大於所述最大允許高度並且如果是這樣的規模由高度(或反之亦然):

scale = (dst.width/src.width); 
if (src.height * scale > dst.height) 
scale = dst.height/src.height; 

我認爲這種溶液更短,更快,更易於理解。

+0

我認爲你的比例在你的第三行中翻轉了。 – tom10 2009-09-03 16:03:24

+0

你是絕對正確的。我解決了。 – Guss 2009-09-03 17:25:10

1

如果所有維度都不爲零,我會使用下面的代碼(基本上與您的代碼相匹配)。

scaleFactor = (outerWidth/outerHeight > innerWidth/innerHeight) 
    ? outerHeight/innerHeight 
    : outerWidth/innerWidth 

這也可以修改,以允許任何維度如果需要爲零。

+1

我認爲一個零維的矩形稱爲「線」。 :P – MusiGenesis 2009-09-03 12:47:46

+1

該解決方案在數學上與我的相同:將不等式乘以(innerHeight * outerHeight/innerWidth),得到我的不平等。我的代碼的優點是,如果不等式失敗,那麼解決方案不需要重新計算。 – Guss 2009-09-03 12:50:15

+0

三元運算符也只會評估一次條件。當然,所有的解決方案都應該是數學上等同的......或者錯誤的...... – 2009-09-03 13:35:06

相關問題