Projekt Universe

Wersja w Ruście dogoniła wersję w C

Trochę to zajęło, ale Rustowa wersja kodu generującego położenia galaktyk w końcu osiągnęła poziom funkcjonalności wersji w C. Przy okazji zebrałem sporo ciekawych doświadczeń, którymi się teraz podzielę.

Rust vs inne języki

Programowanie w Ruście zupełnie nie przypomina programowania w innych językach, z którymi do tej pory miałem styczność (czyli zasadniczo rodzina C i Python). Jedyne, co trochę je przypominało, to eksperymentowanie z Haskellem, ale to głównie pod względem kompletnego niedopasowania mojej intuicji do języka (choć Rust ma sporo elementów funkcyjnych, ale jak będzie wspomniane później, nie należy z nimi przesadzać...).

(więcej…)

Postępy w projekcie Universe

W ciągu ostatnich kilku dni poczyniłem trochę postępów w przepisywaniu projektu Universe w języku Rust.

Przed zabraniem się za właściwy projekt musiałem przygotować pod niego trochę gruntu. Ze względu na wielkość liczb pojawiających się w programie, korzystałem z bibliotek GMP i MPFR, pozwalających na wykonywanie obliczeń na dowolnie dużych liczbach. Oprócz tego, korzystałem z algorytmu xxhash. Problem? Wszystkie 3 elementy były napisane w języku C.

Problem nie był szczególnie trudny do pokonania, gdyż jedną z zalet Rusta jest łatwość łączenia go z bibliotekami napisanymi w C. Konieczne było jedynie znalezienie lub stworzenie modułów, które ułatwią takie połączenie. Podjąłem więc poszukiwania.

Najpierw skupiłem się na GMP i MPFR. Do biblioteki GMP znalazłem 2 moduły, do MPFR - jeden (stworzony przez autora jednego z modułów do GMP). Po przyjrzeniu się im, uznałem, że łatwiejszy w użyciu będzie moduł GMP nie mający odpowiednika do MPFR, co zostawiło mnie z zadaniem napisania własnego. Ponadto moduł GMP był stary i nie kompilował się w najnowszej wersji języka.

Zabrałem się więc do pracy. Naprawienie modułu GMP okazało się żmudne, ale nie przedstawiające sobą większych trudności. Stworzenie modułu do MPFR podobnie, choć tutaj żmudności było jeszcze więcej (pisanie wielu podobnych funkcji, których jedynym zadaniem jest wywołanie ich odpowiedników z C...). Oba moduły są na GitHubie (klik, klik). Poprawioną bibliotekę GMP podesłałem autorowi oryginału, jednak okazał się on nie być zainteresowany dalszym utrzymywaniem jej kodu.

Potem przyszła kolej na xxhash. Tu, podobnie jak w przypadku GMP, moduł istniał, lecz się nie kompilował. Chwila pracy pozwoliła poprawić błędy i otrzymać działającą wersję biblioteki.

Mam w tej chwili zatem działające moduły, od których projekt jest zależny. Zacząłem również przepisywać kod samego projektu, jednak na razie gotowy jest tylko niewielki jego fragment. Wiadomości o dalszych postępach - (oby) wkrótce.

Generowanie struktury wszechświata

Struktura przestrzeni

Tworzenie wszechświata trzeba od czegoś zacząć. Dobrym początkiem będzie określenie jego kształtu.

Najwygodniejszym i chyba najbardziej oczywistym kształtem jest sześcian. Wówczas każda z trzech współrzędnych będzie liczbą z tego samego zakresu, a dodatkowo bardzo łatwo jest sprawić, aby wszechświat nie miał granic - wystarczy dodać warunek, że opuszczenie sześcianu z jednej strony jest równoznaczne z wejściem do sześcianu z drugiej strony. Przypomina to sytuację znaną z gry w węża, w której wąż opuszczający ekran z prawej strony wracał znowu z lewej - tylko w trzech wymiarach.

Mamy zatem sześcienną przestrzeń, w której każdy punkt może być opisany trzema liczbami: x,\; y,\; z\; \in (a,b). Pojawia się pytanie: jakiego typu danych użyć do reprezentowania współrzędnych punktu? Nie uda się na nie odpowiedzieć bez wcześniejszego sprawdzenia, z jak dużymi liczbami mamy do czynienia.
(więcej…)

Projekt Universe

Projekt, który tymczasowo nazywam po prostu "Universe" (lepsza nazwa by się przydała, ale nie jest priorytetem), ma na celu stworzenie interaktywnego wszechświata w realistycznej skali - tj., zawierającego miliardy galaktyk, złożonych z miliardów gwiazd, z których część ma planety, część tworzy układy wielokrotne itd., itp.

Inspiracja pochodzi z kilku źródeł:

  • Space Engine - program pozwalający na zwiedzanie realistycznego Wszechświata
  • Minecraft - gra dająca niemal nieograniczone możliwości budowania i interakcji ze światem
  • Wurm Online - gra w pewnych aspektach podobna do Minecrafta, dająca również ogromne możliwości kształtowania świata

W skrócie - celem byłoby osiągnięcie możliwości interakcji ze światem podobnych do tych z Minecrafta lub Wurma, lecz we wszechświecie o skali Space Engine.

Oczywiście, skala przedsięwzięcia jest ogromna, dlatego projekt będzie zapewne ciągnął się latami i jego ukończenie stoi pod znakiem zapytania. Zamierzam jednak małymi kroczkami popychać go do przodu, aż może kiedyś nabierze interesującego kształtu, a postępy prac opisywać tutaj, w kategorii "Projekt Universe".