Napisz program, który wczyta od użytkownika pewien wzór złożony z znaków alfanumerycznych oraz skalę s. Następnie wypisz na konsolę ten sam wzór zeskalowany o wczytaną wcześniej wartość. Wczytana wartość skalowanie może być dowolną liczbą rzeczywistą większą od 0.
Przypuśćmy, że użytkownik wpisze następujący wzór:
Zadana skala wynosi 2, a więc wzór zostanie powiększony dokładnie 2 razy:
Do powiększania wzoru zostanie zastosowana technika najbliższego sąsiada. Metoda ta polega na kopiowaniu sąsiednich wartości w przypadku zwiększania, a jeśli wzór będzie zmniejszany to analogicznie pewne wartości zaczną znikać. W celu rozszerzenia / skrócenia linijki danych należy wyliczyć stosunek starej szerokości do nowej mn, a następnie dla każdej nowej pozycji pobrać wartość pod indeksem, który jest iloczynem aktualna pozycji oraz wyliczonej wartości mn.
Przykładowo rozszerzamy dwukrotnie linijkę ab. W tym celu wyliczamy nową szerokość czyli 4, a następnie przechodzimy do wyliczania wartości. Mnożnik mn wynosi 1/2=0.5. W tabelce zebrano potrzebne informacje:
Nowa pozycja | 0 | 1 | 2 | 3 |
---|---|---|---|---|
Wyliczona wartość | 0 | 0.5 | 1 | 1.5 |
Stara pozycja | 0 | 0 | 1 | 1 |
Znak | a | a | b | b |
Wyliczonej wartości na podstawie indeksu nowej pozycji należy obciąć część ułamkową. Dzięki temu możliwe będzie pobranie wartości z starej linijki. Na koniec obliczona wartość wskazuje indeks pozycji do pobrania z danych.
Poniższa funkcja SkalujWzor() jest rozwiązaniem omawianego problemu. Przyjmuje ona tablicę łańcuchów znaku, gdzie przechowywany jest wzór oraz skalę - liczbę rzeczywistą.
Na początku pobierana jest akualna szerokość oraz wysokość, a następnie wyliczana nowa szerokość i wysokość. Dla każdej nowej pozycji zeskalowanego obiektu: należy obliczyć, którą wartość należy przepisać z danych. Warto pamiętać, że interpolację przeprowadzamy zarówno wzdłuż szerokości jak i wysokości, a więc potrzebny jest inny mnożnik dla każdej współrzędnej. (W przypadku równomiernego skalowania i kwadratowego obrazka wystarczyłby jeden mnożnik.)
Test kodu można przeprowadzić używając poniższego fragmentu kodu, który wczyta potrzebne dane, a następnie wypisz wynik na ekran.