Chciałbym wiedzieć, jak najlepiej zarządzać współrzędnymi w grze 3D, której celem jest realistyczne modelowanie całego układu słonecznego, a jednocześnie być w stanie poradzić sobie z najmniejszymi ruchami na „statku” (tj. Być może możemy uznać, że 1 cm jest najmniejszy dopuszczalny ruch ramy). Czy 64-bitowe podwójne (lub 64-bitowe długie) to obsługują, czy też występują problemy z przepełnieniem? Jeśli nie, to czy należy zastosować długi lub podwójny, a jeśli tak, to jakie alternatywne podejście według ciebie jest najbardziej odpowiednie do modelowania pozycji w Układzie Słonecznym w grze 3D? (tj .: trzymanie tylko części systemu na wyświetlaczu w czasie zależnym od odległości do statku lub posiadanie systemu w jakiś sposób reprezentowanej w innej przestrzeni współrzędnych itp.)
15
long
.long long
. Ale tak, cokolwiek, nazwij to dręczeniem, jeśli chcesz.Odpowiedzi:
Jest już dobra odpowiedź na temat liczb całkowitych, ale wydaje mi się, że zmiennoprzecinkowe nie powinny być eliminowane. W swojej odpowiedzi Byte56 wybrał maksymalną orbitę Plutona, prawdopodobnie pobraną z tego arkusza programu Excel , więc pozostanę przy tym.
To stawia granice Układu Słonecznego w:
7 376 000 000 km = 7,376x10 ^ 9 km = 7,376x10 ^ 14 cm ≈ 7,4x10 ^ 14 cm
Double oferty dokładnością maksymalnie 15 znaczących miejsc po przecinku. Więc masz szczęście: jeśli twoje pochodzenie znajduje się w centrum Słońca i używasz pozycji wokół Plutona, możesz reprezentować wszystkie centymetry, np. W C ++:
Więc jeśli możesz ograniczyć grę do orbity Plutona, gratulacje! Masz wystarczającą precyzję z podwójnymi, aby to reprezentować.
Uważaj jednak, że to wystarczy do reprezentowania go w symulacji , ale nie należy się spodziewać, aby uczynić to bezboleśnie. Będziesz musiał przekonwertować na 32-bitowe zmiennoprzecinkowe, może zmienić pochodzenie, aby uzyskać wystarczającą precyzję na bliskich obiektach i prawdopodobnie będziesz musiał polegać na buforze Z i sztuczce aparatu, aby uzyskać to wszystko, aby poprawnie renderować .
Teraz, jeśli chcesz, aby astronauci odwiedzili odległe komety w chmurze Oort , która jest znacznie większa, to koniec. Około 10 ^ 16 cm zaczyna tracić dokładność:
I oczywiście dalej się pogarsza.
Jeśli tak jest, możesz wypróbować bardziej zaawansowane rozwiązania. Proponuję rzucić okiem na artykuł Petera Freeze'a w Gems Programming Game 4: „2.3 Rozwiązywanie problemów z dokładnością współrzędnych dużego świata”. IIRC, sugeruje system, który może pasować do twoich potrzeb, to rzeczywiście coś w rodzaju wielu różnych współrzędnych przestrzeni.
To tylko kilka wskazówek, prawdopodobnie będziesz musiał użyć własnego przepisu, aby uruchomić to. Ktoś, kto już zaimplementował tego rodzaju rzeczy, może ci pomóc. Dlaczego na przykład nie wysłać e-maila do facetów programu kosmicznego Kerbal ?
Powodzenia w grze!
źródło
Zakładając, że Pluton jest „krawędzią” Układu Słonecznego (choć niektórzy twierdzą, że jest on oddalony nawet o 3 lata świetlne). Pluton, na maksymalnej orbicie, znajduje się około 7 376 000 000 kilometrów od Słońca. To 7.37600 × 10 ^ 14 centymetrów. Podwój to, aby uzyskać średnicę, a otrzymasz 1 475 200 000 000 000 centymetrów. To mieści się w maksymalnym rozmiarze 64 bitów. Ponieważ wysokość Układu Słonecznego jest nieznaczna w porównaniu do jego średnicy, możemy to zignorować.
Więc tak, możesz użyć długiej, aby przedstawić swoją pozycję w Układzie Słonecznym. W rzeczywistości możesz mieć pozycje do 9,75 lat świetlnych z podpisaną długością (podwójna dla niepodpisanego).
Pamiętaj, że nie dotyczy to określania odległości. Maksymalna odległość, jaką możesz znaleźć, to pierwiastek kwadratowy maksymalnej odległości, którą możesz przebyć. Można temu zaradzić, stosując system szczegółowego określania odległości. Możesz wykonać kilka prostych sprawdzeń, aby odgadnąć, jak daleko są odległości (porównaj ich wartości xi wartości y), a następnie użyj przyrostów 1 000 000 km dla dużych odległości do przyrostów centymetrowych dla małych odległości.
Oczywiście jest pytanie, czy naprawdę chcesz? 99,999% Układu Słonecznego to zupełnie nieciekawa pusta przestrzeń. Jeśli dokładnie reprezentujesz Układ Słoneczny, mam nadzieję, że nie reprezentujesz dokładnie fizyki. Obejście Układu Słonecznego zajmuje dużo czasu. Zbyt długo, aby większość ludzi była zainteresowana.
A dlaczego nawet mieć tak dokładną dokładność, chyba że zamierzasz również modelować obiekty w Układzie Słonecznym z tą dokładnością? Tam wpadniesz w kłopoty. Objętość Słońca wynosi 1,40900 × 10 ^ 18 kilometrów sześciennych. W skali centymetra sześciennego użycie pojedynczego bitu, który oznacza, że przestrzeń jest „zajęta”, zajmuje 1,4 × 10 ^ 33 bitów lub 1,6 × 10 ^ 23 gigabajtów. Myślę, że nie masz tyle pamięci RAM.
źródło
Możesz używać
BigInteger
, jakkolwiek nazywa to Twój język programowania. Jest to liczba całkowita nieograniczona; dobrze się skaluje - ogólnie używająclog(n)
pamięci dla liczby całkowitejn
.Java i C # mają to; Jestem pewien, że robią to inne języki. Jeśli nie, możesz go dekompilować i ponownie wdrożyć bez nadmiernych trudności.
źródło