Güneş sistemi iki kat (veya uzun) kullanılarak 3B alanda doğru bir şekilde temsil edilebilir mi?


15

Amacı tüm güneş sistemini gerçekçi bir şekilde modellemek, ancak bir "gemideki" en küçük hareketleri ele almak olan bir 3D oyunda koordinatları en iyi nasıl yöneteceğimizi bilmek istiyorum (örneğin: belki 1 cm'yi en küçük olarak düşünebiliriz) çerçeve için kabul edilebilir hareket). 64 bit çiftler (veya 64 bit uzunluğunda) bunu destekliyor mu yoksa taşma sorunlarıyla mı karşılaşıyoruz? Değilse, uzun veya iki kat kullanılmalı veya eğer öyleyse, bir 3D oyunda güneş sistemindeki pozisyonları modellemek için en uygun yaklaşımın hangisi olduğunu düşünüyorsunuz? (yani: gemiye olan uzaklığa bağlı olarak bir anda ekranda sadece bir miktar sistemin tutulması veya sistemin bir şekilde farklı bir koordinat alanında temsil edilmesi vb.)


Hangi dili hedefliyorsunuz: C / C ++? Java? Başka bir şey?
Laurent Couvidou

4
@lorancou: Alakasız, açıkça boyutunu belirtti long.
DeadMG

@DeadMG C / C ++ 'da 32 bit olabilir. 64-bit daha çok bir long long. Ama evet, her neyse, isterseniz nitpicking deyin.
Laurent Couvidou

Sadece BigInteger kullanın. Çoğu dilde bazı varyantlar vardır - sınırsız boyutta bir tamsayı değeri (kullanım O (log (n)))
ashes999 23:03

Oyunun bilgi işlem konusunda çok ağır olmaması koşuluyla bu bir cevap olabilir.
Laurent Couvidou

Yanıtlar:


11

Tamsayılar hakkında zaten iyi bir cevap var, ama kayan noktaların ortadan kaldırılmaması gerektiğini hissediyorum. Cevabında Byte56, muhtemelen bu excel sayfasından alınan Plüton'un maksimum yörüngesine gitme seçeneğini aldı, bu yüzden buna bağlı kalacağım.

Güneş sistemi sınırlarını şu şekilde yerleştirir:

7.376.000.000 km = 7.376x10 ^ 9 km = 7.376x10 ^ 14 cm ≈ 7.4x10 ^ 14 cm

Çift Hassas kayan nokta formatı teklifler 15 önemli ondalık maksimum hassasiyet. Şanslısınız: Eğer kaynağınız Güneş'in merkezinde ise ve Pluto çevresinde bir konum kullanıyorsanız, tüm santimetreleri temsil edebilirsiniz , örneğin C ++:

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

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

Eğer oyununuzu Plüton yörüngesiyle sınırlayabilirseniz, tebrikler! Bunu temsil etmek için iki katına çıkacak kadar hassasiyetiniz var.

Bir de temsil edecek yeterli olduğunu ama dikkatli olun simülasyon , ancak beklemeyin hale acısız bu. 32 bit şamandıralara dönüştürmeniz gerekecek, belki başlangıç ​​noktanızı değiştireceksiniz, böylece yakın nesnelerde yeterince hassasiyet elde edeceksiniz ve muhtemelen tüm bunları düzgün bir şekilde işlemek için bazı Z-tampon ve kamera frustum hilelerine güvenmeniz gerekecek. .

Şimdi, astronotlarınızın Oort bulutundaki çok uzak kuyruklu yıldızları ziyaret etmesini istiyorsanız , bu çok daha büyük, o zaman bitti. Yaklaşık 10 ^ 16 cm, doğruluk kaybına başlarsınız:

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

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

Ve elbette daha da kötüleşiyor.

Bu durumda, daha gelişmiş çözümler denemek isteyebilirsiniz. Peter Freeze'nin Game Programming Gems 4: "2.3 Büyük Dünya Koordinatlarında Doğruluk Sorunlarını Çözme" başlıklı makalesine göz atmanızı öneririm . IIRC, ihtiyaçlarınızı karşılayabilecek bir sistem öneriyor, aslında bir çeşit çoklu farklı koordinat alanı.

Bu sadece bazı ipuçları, muhtemelen bunu çalıştırmak için kendi tarifinizi kullanmanız gerekecek. Bu tür şeyleri zaten uygulayan biri size daha fazla yardımcı olabilir. Örneğin Kerbal Uzay Programının arkasındaki çocuklara neden bir e-posta atmıyorsunuz ?

Oyununuzda iyi şanslar!


1
Bu cevap iyidir, çünkü OpenGL ve DirectX'in kullandığı 3B kayan nokta alanına daha kolay eşlenir ve iyi referanslara sahiptir. Bu nedenle, cevap olarak işaretledim :)
Nicholas Hill,

Harika :) Bir bonus olarak, bunların hepsi yaklaşık olarak, Bruce Dawson'un blogunda yüzenlerle ilgili daha ayrıntılı bilgiler bulacaksınız: randomascii.wordpress.com/2012/05/20/… .
Laurent Couvidou

17

Güneş sisteminin "kenarı" için Plüton olduğu varsayılır (bazıları 3 ışık yılı kadar uzak olduğunu söylese de). Plüton, maksimum yörüngesinde güneşten yaklaşık 7.376.000.000 kilometredir. Bu 7.37600 × 10 ^ 14 santimetre. Çapı almak için bunu iki katına çıkarın ve 1.475.200.000.000.000 santimetre elde edeceksiniz . Bu, 64 bit uzunluğundaki maksimum boyutun içindedir. Güneş sisteminin yüksekliği çapına göre ihmal edilebilir olduğundan, bunu görmezden gelebiliriz.

Yani evet, güneş sistemindeki konumunuzu temsil etmek için uzun bir süre kullanabilirsiniz. Aslında, imzalanmış uzun (imzasız olanlar için iki kat) ile 9.75 ışık yılına kadar pozisyonlarınız olabilir.

Mesafeleri bulmak için durumun böyle olmadığını unutmayın. Bulabileceğiniz maksimum mesafe, gidebileceğiniz maksimum mesafenin kare köküdür. Bu, mesafeleri bulmak için bir detay sistemi kullanılarak aşılabilir. Mesafelerin ne kadar uzakta olduğunu tahmin etmek için bazı basit kontroller yapabilirsiniz (x değerlerini ve y değerlerini karşılaştırın), ardından küçük mesafeler için santimetrelik artışlara kadar büyük mesafeler için 1.000.000 kilometrelik artışlar kullanabilirsiniz.

Tabii ki sorusu var, gerçekten istiyor musun? Güneş sisteminin% 99,999'u tamamen ilginç olmayan boş alan. Güneş sistemini doğru bir şekilde temsil ediyorsanız, umarım fiziği doğru bir şekilde temsil etmiyorsunuzdur. Güneş sisteminde dolaşmak uzun zaman alıyor. Çoğu insanın ilgilenmesi için çok uzun.

Ve güneş sistemindeki nesneleri de bu doğrulukla modellemediğiniz sürece neden bu kadar hassas bir doğruluk elde edersiniz? Başın belada olacak. Güneşin hacmi 1.40900 × 10 ^ 18 kübik kilometredir. Kübik santimetre ölçeğinde, boşluğun "dolu" olduğunu göstermek için tek bir bit kullanılması, 1.4 × 10 ^ 33 bit veya 1.6 × 10 ^ 23 gigabayt alır. Sanırım o kadar RAM'in yok.


3
Oldukça yerinde. Kısa versiyon: Şamandıra doğruluğu endişelerinizin en azıdır.
aaaaaaaaaaaa

1
Sen olacak tamsayılar, hatta 64 bit ile taşmaları olsun. Uzay gemisi Plüton etrafında yörüngede. Uzaydan güneşe olan mesafeyi hesaplamaya çalışır. Kare alma. Boom.
Laurent Couvidou

3
Son paragraftaki iddiayı şiddetle kabul etmiyorum - OP'nin sorusu olduğu gibi mükemmel bir mantıklı ve kişinin pozisyonlarda 1 cm'lik bir doğruluk sağlamak için her (santimetre küp) bir öğeye sahip olmasını beklemesine gerek yok.
Steven Stadnicki

1
@StevenStadnicki Yeterince adil, ancak kilometre ölçeğinde bile, kilometre küp başına 1 bit için hala 164.029.188 gigabayt. Araba hız göstergenizde atom hassasiyeti istemek gibi. Bu, olması gerekenden çok daha doğru.
MichaelHouse

1
AU veya ışık yılı ölçeğine gitmek çok kesin değil. Güneş sisteminden bahsediyoruz. Işık yılları veya parsekler, büyük bir bulutsu gibi daha büyük bir şey için daha iyi olurdu.
MichaelHouse

2

BigIntegerProgramlama diliniz ne olursa olsun kullanabilirsiniz . Sınırsız boyutlu bir tamsayıdır; iyi ölçeklendirir - genellikle log(n)boyutu tamsayı için depolama alanı kullanır n.

Java ve C # var; Eminim diğer diller de öyle. Değilse, çok fazla zorluk çekmeden kodabilir ve yeniden uygulayabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.