Comment puis-je échelle d'un rectangle à la taille maximale possible dans un autre rectangle?
J'ai un rectangle source et un rectangle de destination. J'ai besoin de trouver le maximum de l'échelle à laquelle la source peut être réduite tout en s'inscrivant dans le rectangle de destination et en conservant son aspect d'origine.
Google a trouvé un façon de le faire mais je ne suis pas sûr si cela fonctionne dans tous les cas. Ici est ma maison brassée solution:
- Calculer la Hauteur/Largeur de chaque rectangle. Cela donne les pentes des diagonales
msrc
etmdest
. - Si
msrc < mdst
, à l'échelle de la source de largeur pour s'adapter à la destination largeur (et de la hauteur de l'échelle par le même ratio) - Contraire, l'échelle de la source de hauteur pour s'adapter à la destination hauteur (et de la largeur de l'échelle par le même ratio)
À la recherche d'autres solutions possibles à ce problème. Je ne suis même pas sûr si mon algorithme fonctionne dans tous les cas!
Vous devez vous connecter pour publier un commentaire.
C'est votre approche, mais écrit de façon plus propre.
width = src.width * scale
etheight = src.height * scale
scale = min(maxWidth/actualWidth, maxHeight/actualHeight)
,newWidth = actualWidth*scale
,newHeight = actualHeight*scale
.Une autre option pourrait être à l'échelle de largeur maximale et de vérifier ensuite si l'échelle de hauteur supérieure à la hauteur maximale autorisée et, dans l'affirmative à l'échelle en fonction de la hauteur (ou vice versa):
Je pense que cette solution est à la fois plus court, plus rapide et plus facile à comprendre.
destWidth /srcWidth
etdestHeight /srcHeight
modifier bien sûr, c'est la même méthode, avec les pièces de la formule de déplacés. Mon avis est que c'est plus clair du point de vue sémantique, mais c'est seulement que - une opinion.
Si toutes les dimensions sont non nuls, je voudrais utiliser le code suivant (qui, pour l'essentiel correspond à votre code).
Cela peut également être modifié pour permettre à toute la dimension de zéro si nécessaire.
Autres réponses souffrent d'un risque de générer une division par zéro exception lorsque le sourceWidth ou sourceHeight devient zéro. Pour éviter cette situation, nous devons réécrire la comparaison dans une mathématiquement équivalent de multiples expression. Aussi, d'autres de bord de la condition d'attraper l'infini à l'échelle scénario.
En dehors d'avoir l'échelle, je voulais vraiment les dimensions du rectangle cible, donc, ici, je vais fournir à l'échelle de calcul et le rectangle cible de calcul.
En raison du débordement de la condition, je pense que le rectangle cible sera plus robuste /utile: