Nice programing

한 사각형의 크기를 다른 사각형 내에서 가능한 최대 크기로 조정하려면 어떻게합니까?

nicepro 2020. 12. 7. 20:38
반응형

한 사각형의 크기를 다른 사각형 내에서 가능한 최대 크기로 조정하려면 어떻게합니까?


소스 사각형과 대상 사각형이 있습니다. 대상 사각형 내에 맞추고 원래 종횡비를 유지 하면서 소스의 크기를 조정할 수있는 최대 크기를 찾아야합니다 .

Google은 한 가지 방법을 찾았 지만 모든 경우에 작동하는지 확실하지 않습니다. 내 집에서 만든 솔루션은 다음과 같습니다.

  • 각 직사각형의 높이 / 너비를 계산합니다. 이것은 대각선 msrcmdest.
  • 경우 msrc < mdst스케일 소스하면, 가로 대상에 맞는 (동일한 비율에 의해 스케일 높이)
  • 그렇지 않으면 스케일 소스 높이 대상 맞는 높이 (동일한 비율에 의해 스케일 폭)

이 문제에 대한 다른 가능한 해결책을 찾고 있습니다. 내 알고리즘이 모든 경우에 작동하는지 확실하지 않습니다!


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

이것은 당신의 접근 방식이지만 더 깔끔하게 작성되었습니다.


또 다른 옵션은 최대 너비로 크기를 조정 한 다음 크기 조정 된 높이가 최대 허용 높이보다 큰지 확인하고 만약 그렇다면 높이에 따라 크기를 조정하는 것입니다 (또는 그 반대) :

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

이 솔루션은 더 짧고 빠르며 이해하기 쉽습니다.


  1. 더 작은 것 destWidth / srcWidthdestHeight / srcHeight
  2. 그것에 의해 확장

편집 은 물론 공식의 일부를 이동하는 방법과 동일합니다. 의견 은 이것이 의미 론적으로 더 명확하다는 것입니다. 그러나 그것은 단지 의견입니다.


모든 차원이 0이 아니면 다음 코드를 사용합니다 (기본적으로 코드와 일치 함).

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

필요한 경우 치수가 0이되도록 수정할 수도 있습니다.


다른 답변은 sourceWidth 또는 sourceHeight가 0이 될 때 0으로 나누기 예외를 생성 할 위험이 있습니다. 이를 방지하기 위해 비교를 수학적으로 동등한 다중 표현식으로 다시 작성해야합니다. 또한 무한 스케일 시나리오를 포착하기위한 추가 엣지 조건.

배율이있는 것 외에도 대상 사각형의 크기를 원했기 때문에 여기서 배율 계산과 대상 사각형 계산을 제공합니다.

무한 가장자리 조건으로 인해 대상 사각형이 더 강력하고 유용 할 것이라고 생각합니다.

    if (sourceWidth == 0 && sourceHeight == 0) {
        // scale = Infinity;
        outputWidth = 0;
        outputHeight = 0;
        outputX = destWidth / 2;
        outputY = destHeight / 2;
    } else if (destWidth * sourceHeight > destHeight * sourceWidth) {
        scale = destHeight / sourceHeight;
        outputWidth = sourceWidth * destHeight / sourceHeight;
        outputHeight = destHeight;
        outputX = (destWidth - outputWidth) / 2;
        outputY = 0;
    } else {
        scale = destWidth / sourceWidth;
        outputWidth = destWidth;
        outputHeight = sourceHeight * destWidth / sourceWidth;
        outputX = 0;
        outputY = (destHeight - outputHeight) / 2;
    }

참고URL : https://stackoverflow.com/questions/1373035/how-do-i-scale-one-rectangle-to-the-maximum-size-possible-within-another-rectang

반응형