0

Pomysł na walentynki dla programisty

Walentynki programisty

Prawdziwy programista spędza walentynki przy komputerze. Jest to jednak czas, kiedy można szybko sklecić jakiś projekt niezwiązany z pracą czy naszą pasją, a po prostu będący mniej lub bardziej udanym nawiązaniem do obchodzonego święta. Moim pomysłem na ten dzień było narysowanie serduszka za pomocą tekstu 🙂

Rozwiązanie amatorskie

Oczywiście najprostszym rozwiązaniem na wyświetlenie serca jest wygenerowanie odpowiedniej macierzy z obrazu (tzw. ASCII art). Efekt można zobaczyć poniżej (dla wygody wklejam już obrazek, a nie sam tekst) :

Serce od Szalonego Peceta - ASCII ART

Serce od Szalonego Peceta – ASCII ART

Rozwiązanie trochę mniej amatorskie

Takie rozwiązanie jednak mnie nie satysfakcjonuje i postanowiłem napisać program (skrypt), który będzie potrafił wygenerować serce bez żadnego oszukiwania jak w powyższym przykładzie. Wybrałem język PHP w wersji 7.1… ponieważ akurat miałem go zainstalowanego na komputerze. Przy okazji większość znanych mi programów służących do rysowania grafik za pomocą tekstu powstała w językach C lub C++, więc chciałem spróbować innego podejścia niż większość osób.

Chcąc narysować serce przydałby się nam jakiś wzór matematyczny do opisania funkcji. Na całe szczęście jest on publicznie dostępny. Mając tę matematyczną pomoc rozwiązanie problemu nie jest już trudne i w zasadzie sprowadza się do utworzenia odpowiedniej macierzy z wartościami tych funkcji. Jako, że projekt jest bardzo mały i powstał tylko i wyłącznie w celach rozrywkowych zdecydowałem się na użycie programowania proceduralnego:

// pierwsza krzywa serca 
// wymagane PHP 7.1 
public function heart_one(float $x)
    {
        return sqrt(1 - pow((abs($x) - 1), 2)) * 10;
    }

// druga krzywa serca
    public function heart_two(float $x)
    {
        return (tan(abs($x) - 1) - 1.7) * 10;
    }

// główna funkcja
    public function compute()
    {
// zmienne
        $columns = 100;
        $rows = 70;
        $start = -2.;
        $step = 4 / $columns;
        $matrix = [];

// uzupełniamy macierz wartościami krzywych
        for ($i = 0; $i < $columns; $i++) {
            $start += $step;
            $matrix[$i][$this->heart_one($start)] = '*';
            $matrix[$i][$this->heart_two($start)] = '*';
        }

// w tym momencie nasza macierz jest dość pusta
// (drugi wymiar ma tylko jeden klucz)
// pora to naprawić!
        $newmatrix = [];

        for ($i = 0; $i < $columns; $i++) {
            for ($j = -$rows / 2; $j < $rows / 2; $j++) {
                if (array_key_exists($j, $matrix[$i])) {
                    $newmatrix[$i][$j + $rows / 2] = '*';
                } else {
                    $newmatrix[$i][$j + $rows / 2] = '&nbsp;&nbsp;';
                }
            }
        }

// serce jest obrócone o 90 stopni w lewo
// obracamy je więc w prawo
        $matrix = call_user_func_array(
            'array_map',
            array(-1 => null) + array_map('array_reverse', $newmatrix)
        );

// wypisujemy ostateczną macierz
        for ($i = 0; $i < $rows; $i++) {
            for ($j = 0; $j < $columns; $j++) {
                if ($matrix[$i][$j] == '*') {
                    echo "<span style='color: red;'>" . $matrix[$i][$j] . "</span>";
                } else {
                    echo $matrix[$i][$j];
                }
            }
            echo '<br />';
        }
    }

Co z tego wyszło?

Efekt powyższego kodu przedstawia się całkiem przyzwoicie – serce wygląda jak serce, a nawet jest narysowane na czerwono 🙂 Nie jest to szczyt umiejętności programistycznych czy designerskich, ale czasem taki widok może być całkiem miły, a przy okazji można sobie powtórzyć niektóre zagadnienia związane z programowaniem – po prostu jest to odskocznia od codziennych zajęć.

Szalony Pecet - serce w PHPie

Szalony Pecet – serce w PHPie

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *