한 사각형의 크기를 다른 사각형 내에서 가능한 최대 크기로 조정하려면 어떻게합니까?
소스 사각형과 대상 사각형이 있습니다. 대상 사각형 내에 맞추고 원래 종횡비를 유지 하면서 소스의 크기를 조정할 수있는 최대 크기를 찾아야합니다 .
Google은 한 가지 방법을 찾았 지만 모든 경우에 작동하는지 확실하지 않습니다. 내 집에서 만든 솔루션은 다음과 같습니다.
- 각 직사각형의 높이 / 너비를 계산합니다. 이것은 대각선
msrc
과mdest
. - 경우
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;
이 솔루션은 더 짧고 빠르며 이해하기 쉽습니다.
- 더 작은 것
destWidth / srcWidth
및destHeight / srcHeight
- 그것에 의해 확장
편집 은 물론 공식의 일부를 이동하는 방법과 동일합니다. 내 의견 은 이것이 의미 론적으로 더 명확하다는 것입니다. 그러나 그것은 단지 의견입니다.
모든 차원이 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;
}
'Nice programing' 카테고리의 다른 글
linux / unix에서 WinAPI의 MAX_PATH에 해당하는 것이 있습니까? (0) | 2020.12.07 |
---|---|
C #에서 바이트 또는 short 대신 int를 사용해야하는 이유 (0) | 2020.12.07 |
특수 문자가 포함 된 ANSI 인코딩 파일을 읽는 방법 (0) | 2020.12.07 |
ImageMagick을 사용하여 더 큰 캔버스 안에 이미지 배치 (0) | 2020.12.07 |
Java에서 고유 한 컴퓨터 식별자 (예 : 디스크 ID 또는 마더 보드 ID)를 얻는 방법은 무엇입니까? (0) | 2020.12.07 |