Il s'agit d'une question complémentaire à celle-ci .
Je voudrais savoir s'il existe un motif commun / typique / meilleur pour mettre à l'échelle ma représentation du monde (actuellement 160Kmx160Km) pour l'adapter à la zone de dessin (actuellement 800x600 pixels).
Je peux penser à au moins quatre approches différentes:
Un naïf (comme je l'ai fait jusqu'à présent). J'ai implémenté une fonction globale sc(vector)
qui retournera simplement une copie réduite du vecteur transmis. Cela fonctionne bien sûr, mais m'oblige à écrire du code comme:
drawCircle(sc(radius), sc(position))
Fonctions d'emballage . Je pourrais définir plusieurs fonctions, chacune d'elles enveloppant celle du middleware d'origine. Par exemple, je pourrais définir myDrawCircle
qui mettrait d'abord à l'échelle les arguments qui ont besoin d'être mis à l'échelle, puis appeler drawCircle
avec ce dernier. Cela rendrait mon code peut-être plus lisible et plus facile à maintenir, mais je devrais écrire beaucoup de fonctions de wrapping, qui semblent idiotes.
Décorateur de fonction . Je pourrais simplement décorer les fonctions middleware existantes, fournissant une mise à l'échelle automatique pour tous les paramètres qui sont une instanciation de la classe Vector3D
, mais le problème est que ces fonctions fonctionnent également avec les mêmes paramètres étant list
ou Vector2D
aussi, et le décorateur n'aurait aucun moyen de savoir quelles listes doivent être mises à l'échelle (le rayon par exemple) et lesquelles non (les valeurs RVB).
Initialisation de surface . Lors de la définition de la surface sur laquelle je vais dessiner, je pourrais définir le facteur d'échelle (de sorte que j'utiliserais alors des mètres et non des pixels comme paramètres). Cela fonctionnerait de manière transparente pour moi et serait ma solution de choix, mais bien sûr, elle devrait être implémentée dans le middleware, donc ce n'est pas une vraie option.
... de toute façon: comme il s'agit d'un problème très courant, je me demande s'il existe un modèle établi qui résout avec élégance ce problème que je n'ai pas trouvé.
PS: Pour ce projet, j'utilise python (avec pygame ), mais - bien qu'une réponse spécifique à python / pygame soit très appréciée, je suis plus intéressé par la description générale / de haut niveau du modèle plutôt que par sa mise en œuvre concrète.
Merci d'avance pour votre temps et votre expertise.