Strona główna » Algorytmy » Artykuły » Krzywa Smoka
 

Krzywa Smoka

Wstęp

Krzywa Smoka to fraktal, który generuje się na podstawie ciągu zer i jedynek. Następnie wartości zero przydziela się skręt w lewo, a wartości jeden skręt w prawo. Pomiędzy skrętami należy narysować kreskę do przodu.

Definicja

Pierwszym wyrazem ciągu smoka jest 1. Każdy następny wyraz polega na wstawieniu na początku i końcu aktualnego wyrażenia oraz pomiędzy aktualnymi znakami naprzemian wartości 1 oraz 0. Wartości te można interpretować na różne sposoby.

Przykład

Pierwszy wyraz to 1. Następny uzyskujemy poprzez dopisanie pustych pozycji _ 1 _, a następnie wpisaniu w nie naprzemian 1 i 0. Wtedy okaże się, że drugi wyraz to 110. Budowana kolejnego wyrazu polega na tym samym, ale tym razem pojawią się puste pola wewnątrz aktualnego wyrazu _ 1 _ 1 _ 0 _. Ostatecznie trzeci wyraz to 1101100. Następne wyrazy buduje się w identyczny sposób.

Wizualizacja

Poniżej została przedstawiony fraktal wygenerowany na podstawie Krzywej Smoka. Przyciski służą do wygenerowania fraktalu na podstawie poprzedniego wyrazu ciągu, albo następnego. Uwaga: dla dużych wartości generowanie będzie trawło długo.

Poprzedni Wyraz Następny Wyraz

Implementacja

Do generowania KrzywaSmokaNastepny(), która na podstawie poprzedniego wyrazu zwróci kolejny wyraz. W przypadku braku podania argumentu (poprzedniego wyrazu) funkcja zwróci pierwszy wyraz ciągu smoka. Funkcja nie sprawdza poprawności podanego wyrażenia!

  1. static string KrzywaSmokaNastepny(string poprzedni = "")
  2. {
  3. string wynik = "1";
  4. for (int i = 0; i < poprzedni.Length; i++)
  5. {
  6. wynik += poprzedni[i];
  7. wynik += (char)((i % 2) + '0');
  8. }
  9. return wynik;
  10. }

Niezależnie, który wyraz chcemy wyznaczyć to na początku stoi zawsze wartość 1. Następnie dla każdej wartości z poprzedniego wyrazu przepisywane są kolejne znaki, a pomiędzy nie wstawiana jest na przemian wartość 1 i 0. Do tego celu wykorzystana została funkcja modulo, która na podstawie numeru iteracji zwraca potrzebne wartości. Na koniec funkcja zwraca kolejny wyraz ciągu smoka.

Testowanie funkcji

Do przetestowania napisanej funkcji można skorzystać z poniższego fragmentu programu:

  1. static void Main(string[] args)
  2. {
  3. Console.Write("Ile wyrazów wypisać?\n k = ");
  4. int k = Convert.ToInt32(Console.ReadLine());
  5. string teraz = "";
  6. for (int i = 0; i < k; i++)
  7. {
  8. teraz = KrzywaSmokaNastepny(teraz);
  9. Console.WriteLine(teraz);
  10. }
  11. Console.ReadKey();
  12. }