Questa è una domanda di follow-up a quest'altra .
Vorrei sapere se esiste un modello comune / tipico / migliore per ridimensionare la mia rappresentazione del mondo (attualmente 160Kmx160Km) per adattarla all'area di disegno (attualmente 800x600 pixel).
Mi vengono in mente almeno quattro approcci diversi:
Uno ingenuo (il modo in cui l'ho fatto finora). Ho implementato una funzione globale sc(vector)
che restituirà semplicemente una copia ridotta del vettore passato. Questo ovviamente funziona, ma mi obbliga a scrivere codice come:
drawCircle(sc(radius), sc(position))
Funzioni di avvolgimento . Potrei definire diverse funzioni, ognuna delle quali racchiude quella del middleware originale. Ad esempio, potrei definire myDrawCircle
che prima ridimensionerebbe gli argomenti che necessitano di ridimensionamento, e poi chiamerei drawCircle
con quest'ultimo. Ciò renderebbe il mio codice forse più leggibile e più facile da mantenere, ma dovrei scrivere molte funzioni di wrapping, che sembrano sciocche.
Decoratore di funzioni . Potrei semplicemente decorare le funzioni del middleware esistenti, fornendo il ridimensionamento automatico per tutti i parametri che sono un'istanza della classe Vector3D
, ma il problema è che quelle funzioni funzionano anche con gli stessi parametri essendo list
o Vector2D
troppo, e il decoratore non avrebbe modo di sapere quali elenchi devono essere ridimensionati (ad esempio il raggio) e quali no (i valori RGB).
Inizializzazione della superficie . Quando definisco la superficie su cui disegnerò, potrei definire il fattore di ridimensionamento (in modo da utilizzare quindi i parametri e non i pixel come parametri). Questo funzionerebbe in modo trasparente per me e sarebbe la mia soluzione preferita, ma ovviamente dovrebbe essere implementato nel middleware, quindi non è una vera opzione.
... comunque: dato che si tratta di un problema molto comune, mi chiedo se esiste un modello consolidato che risolva elegantemente questo problema che non sono riuscito a trovare.
PS: Per questo progetto sto usando python (con pygame ), ma - sebbene una risposta specifica per python / pygame sia molto apprezzata, sono più interessato alla descrizione generale / di alto livello del modello piuttosto che alla sua concreta implementazione.
Grazie in anticipo per il tuo tempo e competenza.