2013-07-26 115 views
1

我有一個桌面應用程序,它顯示用戶屏幕的虛擬表示。我的應用程序中的畫布比例與用戶屏幕的比例不匹配。計算畫布更改寬高比時矩形的大小

enter image description here

在我的應用程序,用戶可以在屏幕上添加一個矩形形狀的部分。添加矩形後,實際桌面上的默認大小爲450x300。所以我需要調整虛擬桌面中的矩形來反映這一點。

所以我不能簡單地這樣做:

double virtualRectWidth = VirtualResolutionX/(RealResolutionX/450); 
double virtualRectHeight = virtualRectWidth/(RealResolutionX/RealResolutionY); 

長寬比將不匹配。

如何調整虛擬矩形的大小?

回答

1

如果您想要考慮所有可能的選項(真實高度/寬度大於/小於虛擬高度/寬度)並確保提供最佳配置(重新縮放以使可用空間最大化) ,它並不那麼簡單。下面的代碼佔所有不測事件:

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_finalvirtualRectHeight_final給出。通過一些工作,你可以減少代碼的大小,但這裏最重要的是結果,以及...我已經做了足夠的事情來回答你的問題。