Author Archive: ebvalaim

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.

Przemyślenia dotyczące zakrzywiania światła

Doznałem wczoraj oświecenia jak usunąć artefakt z symulatora czarnej dziury.

Problem

artifact

W obecnym symulatorze czarnej dziury istnieje jeden brzydki aspekt generowanego obrazu. Dokładnie 90 stopni od kierunku do czarnej dziury powstaje artefakt graficzny - rozmazany pasek błędnie obliczanych pikseli (patrz obrazek po prawej). Powód tkwi zaszyty głęboko w mechanizmie generowania obrazu.

W skrócie wygląda to tak - nie da się w rozsądnym czasie obliczyć koloru każdego piksela przez raytracing. Korzystając zatem z symetrii czarnej dziury Schwarzschilda, stworzyłem sobie gotową tabelę zakrzywień promieni. Dzięki symetrii, każdy promień mogę opisać jednym parametrem - w uproszczeniu, tym, w jakiej odległości mija on czarną dziurę w najbliższym punkcie toru (dokładniej: parametrem zderzenia). Do odchylenia potrzebuję jeszcze drugiego parametru, a mianowicie odległości od czarnej dziury, z której go wysyłam/odbieram - im większą część pełnej trasy promień ma do przebycia, tym większe odchylenie.

Tak stabelaryzowane dane trafiały do karty graficznej. Później, w trakcie rysowania, każdy piksel był przeliczany na kierunek wysyłania promienia, a ten na parametr zderzenia. Odległość była znana niezależnie od tego. Odpowiednie odchylenie było odczytywane z tabeli i właściwy kolor nadawany pikselowi.

W teorii wszystko jest fajnie, ale pojawił się jeden problem - parametry zderzenia promieni wysłanych w różne kierunki bliskie 90 stopni od czarnej dziury są prawie identyczne. To daje niemal identyczne wartości odchylenia, co przekłada się na ten sam kolor piksela. Powstaje brzydki pasek.

(więcej…)

Nowy artykuł i program

Dodałem dzisiaj dwie nowe rzeczy.

Pierwsza z nich to 3 część cyklu o teorii względności - tym razem opisywałem pojęcie metryki i jego różne zastosowania. Do przeczytania tutaj.

Druga to programik, pozwalający zniekształcać obrazy tak, jak byłyby zniekształcone przez czarną dziurę. Pełny opis wraz z linkiem do pobrania tutaj.

Miłej zabawy :)

Część 3 - metryka

metryka1Spis treści serii

Wspomnieliśmy już o czymś takim, jak długość wektora, jednak nic o tym, co to właściwie jest. Na płaszczyźnie sprawa jest prosta - gdy przesuniemy się o v_x w osi x i v_y w osi y, odległość między punktami początkowym i końcowym wynosi \sqrt{v_x^2 + v_y^2} (co można zobaczyć, rysując trójkąt prostokątny i korzystając z twierdzenia Pitagorasa - patrz rysunek). Nie zawsze jednak musi to tak wyglądać i tu wkracza metryka.

Metryka to sposób na uogólnienie twierdzenia Pitagorasa. Nie zawsze współrzędne odpowiadają odległościom wzdłuż prostopadłych osi i nie zawsze da się utworzyć takie współrzędne (ale nie uprzedzajmy faktów). Chcemy zatem mieć jakiś sposób liczenia odległości między punktami przesuniętymi o \Delta x^\mu, gdy x^\mu to współrzędne określone w jakiś bliżej niesprecyzowany sposób.

(więcej…)

Część 2 - współrzędne, wektory i konwencja sumacyjna

Spis treści serii

Podstawowym obiektem w OTW jest czasoprzestrzeń. Jako obiekt matematyczny formalnie jest to rozmaitość różniczkowa, ale na nasze potrzeby wystarczy fakt, że jest to pewien zbiór punktów, zwanych zdarzeniami, które można opisywać współrzędnymi. W przypadku OTW czasoprzestrzeń jest 4-wymiarowa, co oznacza, że potrzebne są 4 współrzędne - jedna czasowa i trzy przestrzenne.

Współrzędne można nazywać w zasadzie dowolnie (np. x, y, z, t), ale ponieważ wielokrotnie potrzebne będzie odwoływanie się do całej czwórki współrzędnych naraz, wygodnie jest oznaczyć je numerami. Przyjęło się oznaczać współrzędną czasową jako 0, a pozostałe 1, 2, 3. Współrzędną nr \mu będziemy zapisywać tak: x^\mu (uwaga: w tym przypadku to nie jest potęgowanie!). \mu w tym przypadku nazywane jest indeksem lub wskaźnikiem (tutaj: górnym). Konwencjonalnie, kiedy mamy na myśli jedną ze wszystkich 4 współrzędnych, używamy litery greckiej; jeśli chodzi o którąś ze współrzędnych przestrzennych, używamy liter łacińskich.

(więcej…)

Nowa kategoria - artykuły

Doszedłem do wniosku, że skoro już mam swój blog, to mogę go wykorzystać też do jednego z moich ulubionych zajęć - przekazywania wiedzy. Na pierwszy ogień poszedł mój ulubiony temat, czyli teoria względności i czarne dziury. Dziedzina ta uchodzi za matematycznie bardzo złożoną, i nie bez powodu, jednak ogólny obraz jest moim zdaniem do ogarnięcia przez osobę z licealnym wykształceniem (przy założeniu, oczywiście, że będzie zainteresowana zrozumieniem tematu).

Zacząłem więc cykl artykułów, mający na celu przybliżenie Czytelnikom tej fascynującej tematyki. Czy mi to wychodzi - przekonajcie się sami :)

Część 1 - pochodne cząstkowe

Spis treści serii

Jak wspomniałem we wstępie, zakładam, że Czytelnik zna pojęcie pochodnej funkcji. Jest to dobra podstawa, ale żeby wgłębić się w teorię względności, potrzebujemy to pojęcie nieco rozszerzyć. Zapoznamy się zatem z pochodną cząstkową. Cóż to takiego?

Przypomnijmy sobie najpierw zwykłą pochodną. Pochodną funkcji f(x) zapisujemy jako f'(x) lub \frac{df}{dx}. Oznacza ona, łopatologicznie mówiąc, tempo zmiany funkcji f w miarę zmieniania argumentu x. Przykładowo, gdy f(x) = x^2, \frac{df}{dx} = 2x.

Co jednak, gdy funkcja zależy od więcej niż jednej zmiennej? Np. możemy mieć funkcję f(x,y) = x^2 + y^2, która każdemu punktowi płaszczyzny przypisze kwadrat jego odległości od początku układu współrzędnych. Jak w ogóle określić pochodną takiej funkcji?

(więcej…)

Rozwój strony

Strona zaczyna osiągać stan, w którym nadaje się do pokazania komuś, zatem jeśli to czytasz, najwyraźniej już się na to zdecydowałem :)

Oprócz dwóch artykułów o projekcie dotyczącym generowania wszechświata, dodałem listę swoich projektów i zaczynam tworzyć ich opisy. Póki co opisałem symulator czarnej dziury i zastanawiam się, czy dodać w tym opisie część matematyczną (komentarze w tej kwestii będą mile widziane). Opisy pozostałych projektów dodam w najbliższych dniach.

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…)