Comment calculer le ratio d'aspect par un facteur donné?
Comment dois-je calculer le ratio d'aspect (au format integer:integer
) par un facteur donné?
Par exemple, le rapport d'aspect de 16:9 est un facteur de 1.778, car 16 /9 = 1.778. Mais comment puis-je trouver le ratio par ce facteur? Donc
Dimension getAspectRatio(double factor) {
...
}
public static void main(String[] arguments) {
Dimension d = getAspectRatio(16d / 9d);
System.out.println(d.width + ":" + d.height);
}
doit retourner
16:9
Vous pouvez peut-être bien servi par trouver le meilleure approximation rationnelle à votre entrée
OriginalL'auteur MC Emperor | 2011-09-16
Vous devez vous connecter pour publier un commentaire.
Avertissement: Ces algorithmes sont stupides et inefficaces. Je suis sûre qu'il y a de mieux...
Un idiot, simple (pas très efficace) algorithme pour trouver une approximation est: est-ce
De sortie.
Mise à jour: algorithme de remplacement
J'ai juste pensé à un algorithme de remplacement, qui tente de se refermer sur le rapprochement. Bien sûr, il n'est pas encore très efficace...
Le résultat est le même
Devrais-je tomber sur un algorithme efficace, je vais le poster ici 🙂
Je pense que la qualité de l'approximation doit être mieux évaluée légèrement autre manière: c'est
delta/minstep
, où minstep est de 1/dénominateur. De cette façon, nous évitons par exemple le choix de 1778/1000 comme une meilleure approximation. En effet, avec un dénominateur que nous sommes au moins aussi précis queminstep
, nous avons donc vérifier quelle est la qualité de l'approximation dans l'évidence de la précision.Comme aioobe dit, vous ne serez pas en mesure d'obtenir exactement les ratios en raison de l'arrondissement, mais lukas @a probablement votre meilleure solution. Mais même cela ne fonctionnera pas si vous utilisez un funky facteur, par exemple 5.941148 qui est 101/17 (j'ai juste pris un premier et un certain nombre de plus de 100 alors qu'il est en dehors de la boucle n'est pas vraiment une pratique taille de l'écran, juste illustrant un point).
Et vous n'avez pas besoin d'une boucle sur le numérateur: vous ne pouvez choisir que le dénominateur et le calcul de la meilleure correspondance numérateur (comme dans mon supprimés réponse).
Depuis c'est l'inverse d'une opération effectuée sur la commune entier paires, je pensais que c'est un assez proche de l'opération.
16:9
n'est vraiment pas un nombre arbitraire, donc je suppose que les OP seront en mesure de trouver les plus pertinents aspect ratio pour les écrans, tv, etc... Puis de nouveau, le mot "idiot" implique que c'est une "bête" de la solution 🙂OriginalL'auteur Lukas Eder
Ce n'est pas possible en général, depuis un double peut ne pas représenter le réel (exact) de la fraction. Vous devrez compter sur des heuristiques ou de la force brute, comme suggéré dans les autres réponses.
Si vous avez eu exactement la décimal expansion et la période que vous pourrait le résoudre.
Voici le papier et le stylo façon:
Supposons que vous démarrez avec
1.77777...
(qui est en 16/9 mais supposons que nous ne le savions pas)Vous notez que la période est
7
(un chiffre) vous multipliez par 10 (c'est à dire déplacer la virgule d'un cran vers la droite):Vous pouvez maintenant annuler la répétition de la partie par le calcul
10n - n
:Des problèmes pour
n
rendementsn = 16/9
La traduction de ce code serait vous obliger à déterminer le début et la durée de la période de l'expansion décimale qui sera lui-même un méchant problème, comme le nombre pourrait généralement ressembler à quelque chose comme
0.16666667
.OriginalL'auteur aioobe
C'est une réponse tardive, mais j'ai résolu ce problème en utilisant un moyen beaucoup plus facile et je sais que d'autres l'apprécierais.
Je suis en supposant que vous connaissez déjà la résolution de l'écran puisque vous savez que le rapport d'aspect (équivalent décimal). Vous pouvez trouver le rapport d'aspect (integer:entier) par la résolution pour le plus grand facteur commun entre la largeur de l'écran et de la hauteur.
Ce sera de retour le plus grand facteur commun entre la largeur de l'écran et de la hauteur. Pour trouver le rapport d'aspect, vous venez de diviser l'écran en largeur et en hauteur par le plus grand facteur commun. Alors...
Ce sorties:
Espère que cette aide.
Remarque: Cela ne fonctionne pas pour certaines résolutions. Les commentaires contiennent plus d'infos.
La grande question, j'ai fait une erreur. J'ai révisé ma réponse. Merci pour ce la raison pour laquelle mon attention.
Cela ne fonctionne pas pour les résolutions communes comme 1366x768 qui ont simplement un peu plus ou moins de pixels dans une direction donnée. Merci de voir stackoverflow.com/a/13466237/2153190
La question est dans l'autre sens. Compte tenu d'un ratio d'aspect de trouver la largeur et la hauteur.
OriginalL'auteur Chad Greenburg
Voici une implémentation en Scala, qui trouve la
Best rational approximation
basé sur la Farey séquence. Cet algorithme a été proposé par @AakashM et c'est traduit de l' John D. Cook Python de mise en œuvre et David Weber C++ modification.J'ai créé un gist qui contient également quelques tests.
OriginalL'auteur akkie
C'est une équation linéaire. En général, vous ne pouvez pas avoir deux inconnues dans une équation linéaire.
OriginalL'auteur Suraj Chandran
En fait, tous les facteurs de forme
a/b
sont présentés comme des finis de ratios ou de l'infini, mais périodique des ratios (à conditiona
etb
sont des entiers). La période peut être assez grande, mais. Vous pourriez essayer de le détecter et de trouver précisément le ratio si la période est, au moins, la moitié de moins que le double de la précision. Ou vous pouvez essayer de faire deviner.OriginalL'auteur pupssman
Rapport d'Aspect peut être un nombre réel (1.85:1 par exemple), alors je crains qu'il soit impossible de "deviner" ratio d'aspect de facteur.
Mais il y a peut-être 10 communes utilisé les ratios d'aspect. Vous pourriez facilement faire le facteur de ratio d'aspect de la table.
Nope! Il s'agit essentiellement d'un constat simple-approximative-PGCD question.
OriginalL'auteur bigGuy