Подтвердить что ты не робот

Как масштабировать один прямоугольник до максимального размера в другом прямоугольнике?

У меня есть прямоугольник источника и прямоугольник назначения. Мне нужно найти максимальный масштаб, на который можно масштабировать источник при установке в прямоугольнике назначения и сохранении его исходного соотношения сторон.

Google нашел один способ, но я не уверен, что он работает во всех случаях. Вот мое домашнее решение:

  • Рассчитать высоту/ширину для каждого прямоугольника. Это дает наклоны диагоналей msrc и mdest.
  • Если msrc < mdst, установите ширину источника изображения в соответствии с шириной места назначения (и высотой шкалы на тот же коэффициент)
  • В противном случае масштабируйте высоту источника, чтобы она соответствовала высоте назначения (и ширине шкалы на тот же коэффициент).

Ищем другие возможные решения этой проблемы. Я даже не уверен, работает ли мой алгоритм во всех случаях!

4b9b3361

Ответ 1

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

Это ваш подход, но написанный более чисто.

Ответ 2

Другим вариантом может быть масштабирование до максимальной ширины, а затем проверка, будет ли увеличенная высота больше максимально допустимой высоты и если она будет масштабироваться по высоте (или наоборот):

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

Я думаю, что это решение является более коротким, быстрым и понятным.

Ответ 3

  • Разработайте меньше destWidth / srcWidth и destHeight / srcHeight
  • Масштаб этого

отредактируйте его, конечно же, как и ваш метод, при этом фрагменты формулы перемещаются. Мое мнение таково, что это яснее семантически, но это только то - мнение.

Ответ 4

Если все измерения не равны нулю, я бы использовал следующий код (который по существу соответствует вашему коду).

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

Это также можно изменить, чтобы при необходимости любое измерение было равно нулю.