2011-04-08 6 views
1

J'écris un simple jeu OpenGL avec Haskell. Chaque fois que l'utilisateur redimensionne la fenêtre, j'obtiens sa largeur et sa hauteur. J'ai besoin de calculer la plus grande largeur et la hauteur qui correspond à l'intérieur de leur fenêtre tout en maintenant le ratio W/H de 1,6.Meilleure façon de trouver le ratio d'aspect

C'est ce que j'ai écrit. Cela fonctionne mais je ne pense pas que ce soit la meilleure façon de le faire chez Haskell. Quelqu'un peut-il suggérer des alternatives:

fixedRatio = 1.6 

keepRatio (w,h) = head [(floor w',floor h') | w' <- [w, h*fixedRatio], h' <- [h, w/fixedRatio], w' <= w, h' <= h, w'/h' == fixedRatio ] 

Répondre

4

que je le ferais avec un gardien (condition):

keepRatio (w,h) | w > expectedWidth = (floor expectedWidth, h) 
       | otherwise   = (w, floor(fromIntegral w/fixedRatio)) 
       where expectedWidth = fromIntegral h * fixedRatio 
1

Essayez ceci:

keepRatio (w,h) = min sizeByWidth sizeByHeight 
    where sizeByWidth = (w, (w * 5) `div` 8) 
     sizeByHeight = ((h*8) `div` 5, h) 

Cela suppose que seul l'aspect besoin rapport au pixel le plus proche.

+0

Dans ce cas, peut-on dire 'min' au lieu de' minBy (en comparant fst) '? – dave4420

+0

Oui! J'avais oublié cette instance (Ord a, Ord b) => Ord (a, b). Edité en conséquence. –

Questions connexes