To jest pytanie uzupełniające do tego drugiego .
Chciałbym wiedzieć, czy istnieje wspólny / typowy / najlepszy wzór do skalowania mojej reprezentacji świata (obecnie 160 km x 160 km), aby dopasować ją do obszaru rysowania (obecnie 800 x 600 pikseli).
Mogę wymyślić co najmniej cztery różne podejścia:
Naiwny (tak jak dotychczas to zrobiłem). Zaimplementowałem funkcję globalną sc(vector)
, która po prostu zwróci pomniejszoną kopię przekazywanego wektora. To oczywiście działa, ale zobowiązuje mnie do napisania kodu takiego jak:
drawCircle(sc(radius), sc(position))
Funkcje owijania . Mógłbym zdefiniować kilka funkcji, z których każda otacza oryginalną wersję oprogramowania pośredniego. Na przykład mógłbym zdefiniować myDrawCircle
, że najpierw skaluje argumenty, które wymagają skalowania, a następnie wywołuje drawCircle
z tym drugim. To by uczyniło mój kod być może bardziej czytelnym i łatwiejszym w utrzymaniu, ale powinienem napisać wiele funkcji zawijania, które brzmią głupio.
Dekorator funkcji . Mógłbym po prostu udekorować istniejące funkcje oprogramowania pośredniego, zapewniając automatyczne skalowanie wszystkich parametrów, które są wystąpieniem klasy Vector3D
, ale problem polega na tym, że te funkcje działają również z tymi samymi parametrami, które są list
lub Vector2D
też, a dekorator nie miałby sposobu, aby wiedzieć które listy należy skalować (na przykład promień), a które nie (wartości RGB).
Inicjalizacja powierzchni . Podczas definiowania powierzchni, na której zamierzam rysować, mogłem zdefiniować współczynnik skalowania (tak, że jako parametry używałbym mierników, a nie pikseli). To działałoby dla mnie transparentnie i byłoby moim rozwiązaniem z wyboru, ale oczywiście powinno być zaimplementowane w oprogramowaniu pośrednim, więc nie jest to realna opcja.
... w każdym razie: skoro jest to bardzo powszechny problem, zastanawiam się, czy istnieje ustalony wzór, który elegancko rozwiązuje ten problem, którego nie udało mi się znaleźć.
PS: W tym projekcie używam Pythona (z pygame ), ale - choć doceniona jest odpowiedź specyficzna dla python / pygame, bardziej interesuje mnie ogólny / ogólny opis wzorca, a nie jego konkretna implementacja.
Z góry dziękuję za poświęcony czas i wiedzę.