Чи може Сонячна система бути точно представлена ​​в 3d-просторі, використовуючи подвійні (або довгі)?


15

Я хотів би знати, як найкраще керувати координатами в 3D-грі, метою якої є реалістичне моделювання всієї Сонячної системи, але в змозі обробити найменші рухи на «кораблі» (тобто: можливо, ми можемо вважати 1 см найменшим прийнятний рух для кадру). Чи підтримують це 64-розрядні парні (або 64-бітні), чи ми стикаємося з проблемами переповнення? Якщо ні, то чи слід використовувати довгі чи парні чи якщо так, то який альтернативний підхід, на вашу думку, є найбільш розумним для моделювання позицій у Сонячній системі в 3D-грі? (тобто: лише утримуючи трохи системи в дисплеї за час, залежно від відстані до відправки, або якщо система якось представлена ​​в іншому просторі координат тощо)


На яку мову ви орієнтуєтесь: C / C ++? Java? Щось ще?
Лоран Кувіду

4
@lorancou: Неважливо, він прямо вказав розмір long.
DeadMG

@DeadMG Який може бути 32-розрядний в C / C ++. 64-бітний - це більше long long. Але так, як би там не було, називайте це прищепленням, якщо хочете.
Лоран Кувіду

Просто використовуйте BigInteger. Більшість мов мають певний його варіант - ціле число необмеженого розміру (використання є O (log (n)))
ashes999

Це може бути відповіддю, якщо гра не надто важка для обчислень.
Лоран Кувіду

Відповіді:


11

Про цілі числа вже є хороша відповідь, але я вважаю, що плаваючі точки не повинні бути усунені. У своїй відповіді Byte56 взяв можливість піти на максимальну орбіту Плутона, ймовірно, взяту з цього листа excel , тому я дотримуюся цього.

Це встановлює межі Сонячної системи на:

7,376,000,000 км = 7,376x10 ^ 9 км = 7,376x10 ^ 14 см ≈ 7,4x10 ^ 14 см

Формат з плаваючою комою подвійної точності пропонує максимальну точність до 15 значних десятків. Тож вам пощастило: якщо ваше походження знаходиться в центрі Сонця і ви використовуєте положення навколо Плутона, ви можете зобразити всі сантиметри, наприклад, у C ++:

printf("%.0Lf\n", 7.4e14);
printf("%.0Lf\n", 7.4e14 + 1.0);
printf("%.0Lf\n", 7.4e14 + 2.0);

Output:
-------
740000000000000
740000000000001
740000000000002

Тож якщо ви можете обмежити свою гру на орбіті Плутона, то вітайте! У вас є достатня точність з подвоєннями, щоб представляти це.

Але будьте обережні, цього достатньо, щоб представити це в симуляції , але не сподівайтесь, що це буде безболісно. Вам доведеться перетворити на 32-розрядні поплавці, можливо, змінити своє походження, щоб ви отримали достатню точність на близьких об'єктах, і вам, мабуть, доведеться покластися на деякі хитрості Z-буфера та камери фрустум-хитрість, щоб все це правильно відобразити .

Тепер, якщо ви хочете, щоб ваші космонавти відвідали якісь далекі комети в хмарі Оорта , який набагато більший, тоді все закінчилося. Приблизно 10 ^ 16 см, ви починаєте втрачати точність:

printf("%.0Lf\n", 1.0e16);
printf("%.0Lf\n", 1.0e16 + 1.0);
printf("%.0Lf\n", 1.0e16 + 2.0);

Output:
-------
10000000000000000
10000000000000000 <-- oops
10000000000000002

І далі, звичайно, стає гірше.

Тож якщо ви в цьому випадку, ви можете спробувати кілька більш просунутих рішень. Пропоную поглянути на статтю Пітера Фрізе в Ігрових програмуючих дорогоцінних каменях 4: «2.3 Розв’язання задач на точність у великих світових координатах». IIRC, він пропонує систему, яка може відповідати вашим потребам, це справді якесь безліч різних проміжків координат.

Це лише деякі підказки, ймовірно, вам доведеться скористатись власним рецептом, щоб розпочати це. Хтось, хто вже реалізував подібні речі, може допомогти вам більше. Чому, наприклад, не запустити електронний лист хлопцям, що стоять за космічною програмою Kerbal ?

Успіхів у вашій грі!


1
Ця відповідь хороша тим, що вона легше відображає тривимірний простір з плаваючою точкою, який використовується подібними OpenGL та DirectX, і має хороші посилання. Тому я позначив це як відповідь :)
Ніколас Гілл

Класно :) Як бонус, оскільки це все дуже приблизно, ви знайдете ще кілька поглиблених відомостей про поплавці у блозі Брюса Доусона: randomascii.wordpress.com/2012/05/20/… .
Лоран Кувіду

17

Якщо припустити, що Плутон є "краєм" Сонячної системи (хоча деякі кажуть, що це вже 3 світлових роки). Плутон, на його максимальній орбіті знаходиться близько 7 376 000 000 кілометрів від сонця. Це 7,37600 × 10 ^ 14 сантиметрів. Удвічі більше , щоб отримати діаметр, і ви отримаєте 1 475 200 000 000 сантиметрів. Це добре в межах максимального розміру в 64-бітну довжину. Оскільки висота Сонячної системи незначна порівняно з її діаметром, ми можемо це ігнорувати.

Так що так, ви можете використовувати довгий час, щоб представити своє становище в Сонячній системі. Насправді ви могли мати посади аж до 9,75 світлових років із довгим підписанням (подвійним для неподписаного).

Зауважте, що це не так для пошуку відстаней. Максимальна відстань, яку ви можете знайти, - це квадратний корінь максимальної відстані, яку ви можете проїхати. Це можна подолати, використовуючи систему деталізації рівня знаходження відстаней. Ви можете зробити кілька простих перевірок, щоб відгадати, наскільки далеко відстань (порівняйте їх значення x і y), а потім використовуйте кроки на 1 000 000 кілометрів на великих відстанях з кроком до сантиметра на невеликих відстанях.

Звичайно, виникає питання, чи ти цього дуже хочеш? 99,999% сонячної системи є абсолютно нецікавим порожнім простором. Якщо ви точно представляєте Сонячну систему, я сподіваюся, що ви точно не представляєте фізику. Щоб обійти Сонячну систему, потрібно багато часу. Шлях занадто довгий, щоб зацікавити більшість людей.

І навіщо навіть мати таку точну точність, якщо ви також не збираєтесь моделювати об'єкти в Сонячній системі з такою точністю? Ось де ви потрапите в біду. Об'єм Сонця - 1,4000 × 10 ^ 18 кубічних кілометрів. У кубічній сантиметровій шкалі, використовуючи один біт, щоб представити, що цей простір "зайнятий" займає 1,4 × 10 ^ 33 біт або 1,6 × 10 ^ 23 гігабайт. Я думаю, у вас не так багато оперативної пам’яті.


3
Гарне місце на. Коротка версія: Точність поплавка - це найменша стурбованість.
aaaaaaaaaaaa

1
Ви будете отримувати переповнюється з цілими числами, навіть 64-біт. Космічний корабель орбіти навколо Плутона. Намагається обчислити відстань від космічного корабля до сонця. Квадратування. Бум.
Лоран Кувіду

3
Я не погоджуюся з твердженням в останньому абзаці - питання ОП має досконалий сенс, як є, і не потрібно сподіватися, що насправді є елементи на кожному (кубічному) сантиметрі, щоб дбати про точність 1 см на позиціях.
Стівен Стадницький

1
@StevenStadnicki Ярмарок досить, але навіть у кілометровому масштабі це все ще 164,029,188 гігабайт за 1 біт на кубічний кілометр. Схоже з проханням про атомну точність у вашому спідометрі автомобіля. Це просто спосіб точніший, ніж це має бути.
MichaelHouse

1
Що ж, їхати до АС або на світловий рік занадто неточно. Оскільки ми говоримо про Сонячну систему. Світлові роки або парсеси краще для чогось більшого, як велика туманність.
MichaelHouse

2

Ви можете використовувати BigInteger, незалежно від того, як це називає ваша мова програмування. Це ціле число необмеженого розміру; вона добре масштабує - як правило, використовуючи log(n)сховище для цілого розміру n.

Java та C # мають це; Я впевнений, що й інші мови. Якщо ні, ви можете декомпілювати та повторно доповнити його без особливих труднощів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.