如果您想要考慮所有可能的選項(真實高度/寬度大於/小於虛擬高度/寬度)並確保提供最佳配置(重新縮放以使可用空間最大化) ,它並不那麼簡單。下面的代碼佔所有不測事件:
double safeRatio = 0.95; //Avoiding identical height/width
double heightWidthRatio = virtualRectHeight/virtualRectWidth; //450/300
double diffWidth = safeRatio * realRectWidth - virtualRectWidth;
double diffHeight = safeRatio * realRectHeight - virtualRectHeight;
double virtualRectWidth_final = virtualRectWidth;
double virtualRectHeight_final = virtualRectHeight;
if (diffWidth <= 0 && diffHeight <= 0) //virtualRectWidth >= safeRatio*realRectWidth and virtualRectHeight >= safeRatio*realRectHeight
{
int counterDec = 10;
if(Math.Abs(diffWidth) > Math.Abs(diffHeight))
{
virtualRectWidth_final = safeRatio * realRectWidth + counterDec;
do
{
virtualRectWidth_final = safeRatio * realRectWidth - counterDec;
virtualRectHeight_final = virtualRectWidth_final * heightWidthRatio;
} while(virtualRectHeight_final > safeRatio * realRectHeight);
}
else
{
virtualRectHeight_final = safeRatio * realRectHeight + counterDec;
do
{
virtualRectHeight_final = safeRatio * realRectHeight - counterDec;
virtualRectWidth_final = virtualRectHeight_final/heightWidthRatio;
} while(virtualRectWidth_final > safeRatio * realRectWidth);
}
}
else if (diffWidth <= 0) //virtualRectWidth >= safeRatio*realRectWidth
{
virtualRectWidth_final = safeRatio * realRectWidth;
virtualRectHeight_final = virtualRectWidth_final * heightWidthRatio;
if (virtualRectHeight_final >= safeRatio * realRectHeight)
{
virtualRectHeight_final = safeRatio * realRectHeight;
virtualRectWidth_final = virtualRectHeight_final/heightWidthRatio;
}
}
else if (diffHeight <= 0) //virtualRectHeight >= safeRatio*realRectHeight
{
virtualRectHeight_final = safeRatio * realRectHeight;
virtualRectWidth_final = virtualRectHeight_final/heightWidthRatio;
if (virtualRectWidth_final >= safeRatio * realRectWidth)
{
virtualRectWidth_final = safeRatio * realRectWidth;
virtualRectHeight_final = virtualRectWidth_final * heightWidthRatio;
}
}
else //virtualRectWidth < safeRatio*realRectWidth && virtualRectHeight < safeRatio*realRectHeight
{
if (diffWidth < diffHeight)
{
virtualRectHeight_final = virtualRectWidth_final * heightWidthRatio;
}
else
{
virtualRectWidth_final = virtualRectHeight_final/heightWidthRatio;
}
}
最終值由virtualRectWidth_final
和virtualRectHeight_final
給出。通過一些工作,你可以減少代碼的大小,但這裏最重要的是結果,以及...我已經做了足夠的事情來回答你的問題。