2009-09-03 11 views
42

Tengo un rectángulo fuente y un rectángulo de destino. Necesito encontrar la escala máxima a la que se puede escalar la fuente mientras se ajusta dentro del rectángulo de destino y manteniendo su relación de aspecto original.¿Cómo escalo un rectángulo al tamaño máximo posible dentro de otro rectángulo?

Google encontró one manera de hacerlo, pero no estoy seguro de si funciona en todos los casos. Aquí está mi solución hecha en casa:

  • Calcular altura/ancho para cada rectángulo. Esto da las pendientes de las diagonales msrc y mdest.
  • Si msrc < mdst, fuente escala anchura para encajar el destino anchura (y altura de escala en la misma proporción)
  • De lo contrario, la fuente de escala altura para encajar el destino altura (y escala anchura por la la misma proporción)

Buscando otras posibles soluciones a este problema. ¡Ni siquiera estoy seguro de si mi algoritmo funciona en todos los casos!

Respuesta

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

Este es su enfoque, pero escrito de manera más clara.

+4

¡Dulce! Una vez que tenga la escala, utilícela para obtener las dimensiones finales: 'ancho = src.width * scale' y' height = src.height * scale' –

+4

Cambie el mínimo con el máximo si desea cubrir el área de destino completa. – Glogo

+6

La misma solución, pero con nombres más claros para mí: 'scale = min (maxWidth/realWidth, maxHeight/actualHeight)', 'newWidth = actualWidth * scale',' newHeight = actualHeight * scale'. –

1
  1. Calcular el menor de destWidth/srcWidth y destHeight/srcHeight
  2. escala por el que

edición es, por supuesto, lo mismo que su método, con las piezas de la fórmula mueven alrededor. Mi opinión es que esto es más claro semánticamente, pero es solo eso - una opinión.

10

Otra opción podría ser de escalar a la anchura máxima y luego verificar si la altura de escalado es mayor que la altura máxima permitida y si es así escala por la altura (o viceversa):

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

Creo que esta solución es más corto, más rápido y más fácil de entender.

+0

Creo que tienes la proporción volteada en tu tercera línea. – tom10

+0

tiene toda la razón. lo arreglé – Guss

1

Si todas las dimensiones son distintas de cero, utilizaría el siguiente código (que esencialmente coincide con su código).

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

Esto también puede ser modificado para permitir que cualquier dimensión a ser cero si es necesario.

+1

Creo que un rectángulo con una dimensión cero se llama una "línea". : P – MusiGenesis

+1

Esta solución es matemáticamente idéntica a la mía: multiplique su desigualdad por (innerHeight * outerHeight/innerWidth) y obtendrá mi desigualdad. La ventaja de mi código es que si la desigualdad falla, entonces la solución no necesita ser recalculada. – Guss

+0

El operador ternario también evaluará la condición una sola vez. Y, por supuesto, todas las soluciones deben ser equivalentes matemáticos ... o incorrectas ... –

Cuestiones relacionadas