2013-07-26 3 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에 의해 제공됩니다. 약간의 작업만으로도 코드의 크기를 줄일 수는 있지만 여기에 중요한 것은 결과뿐입니다 ... 나는 당신의 질문에 답하기에 충분했습니다.

관련 문제