Étant donné une forme rectangulaire S, avec un rapport d'aspect sx/sy, et deux autres formes rectangulaires A (avec rapport d'aspect ax/ay) et B (avec rapport d'aspect bx/par) comment Je découvre lequel de forme A ou B a le rapport d'aspect le plus proche de S? Les tailles des formes sont sans importance.Comment déterminer quels rapports d'aspect sont les plus proches
Est-ce simplement que (sx/sy)/(ax/ay) et (sx/sy)/(bx/par) sont les plus proches de 1? Ce que j'essaie réellement de faire est de trouver quelle forme sur une diapositive PPTX correspondrait le mieux à une image qui sera redimensionnée puis recadrée pour l'adapter à cette forme. J'imagine qu'une autre approche consisterait à déterminer quelle forme entraîne la perte du plus petit nombre de pixels, bien que dans mon code, ce soit plus facile si je peux le faire en comparant les proportions.
En fin de compte, je suis allé avec l'algorithme ci-dessous, mis en œuvre comme suit (grâce à Matt Ball pour ses commentaires):
ShapeInPPTXLocation closest;
double imageAR = a_imageDim.getWidth()/a_imageDim.getHeight();
double aspectRatioCandidateA = a_candidateA.getWidth()/a_candidateA.getHeight();
double aspectRatioCandidateB = a_candidateB.getWidth()/a_candidateB.getHeight();
double closenessScoreA=1-(imageAR/aspectRatioCandidateA);
double closenessScoreB=1-(imageAR/aspectRatioCandidateB);
if (Math.abs(closenessScoreA) <= Math.abs(closenessScoreB))
{
closest=a_candidateA;
}
else
{
closest=a_candidateB;
}
J'ai d'abord pensé à cela mais je pense que cela ne fonctionne que si nous supposons que toutes les formes ont X> Y (ou vice versa).Par exemple, pour les images portrait, le rapport d'aspect est toujours une fraction; pour le paysage c'est un entier. Faites-moi savoir si je me trompe à ce sujet - merci –
Supposons que 'target_ratio' est' 1', 'a_ratio' est' 1.1', et 'b_ratio' est' 0.5' (donc la bonne réponse est 'a_ratio') . Alors vous avez '| -0.1 | <| 0.5 | 'ou' 0.1 <0.5' donc le cas 'if' est' true', donc nous avons 'a_ratio' de l'algorithme du pseudo-code. Donc, cela fonctionne très bien lorsque vous utilisez un mélange de paysage et de portrait. –
Juste implémenté ceci dans mon code et cela fonctionne parfaitement - merci :-) –