क्या युगल (या लॉन्ग) का उपयोग करके सौर मंडल को 3 डी स्पेस में सटीक रूप से दर्शाया जा सकता है?


15

मैं एक 3 डी गेम में निर्देशांक का सर्वोत्तम प्रबंधन कैसे करना चाहता हूं, जिसका उद्देश्य वास्तविक रूप से पूरे सौर मंडल का मॉडल बनाना है, फिर भी एक "जहाज" में सबसे छोटे आंदोलनों को संभालने में सक्षम हो (यानी: शायद हम 1 सेमी को सबसे छोटा मान सकते हैं एक फ्रेम के लिए स्वीकार्य आंदोलन)। क्या 64-बिट डबल्स (या 64-बिट लॉन्ग) इसका समर्थन करते हैं, या क्या हम अतिप्रवाह समस्याओं में भाग लेते हैं? यदि नहीं, तो लॉन्ग या डबल्स का उपयोग किया जाना चाहिए, या यदि ऐसा है, तो आपको लगता है कि 3 डी गेम में सौर प्रणाली में मॉडलिंग पदों के लिए कौन सा वैकल्पिक दृष्टिकोण है? (अर्थात: जहाज में दूरी के आधार पर एक समय में केवल थोड़ी सी प्रणाली को पकड़ना, या सिस्टम को किसी अलग-अलग कोऑर्डिनेट स्पेस आदि में दर्शाया गया होना)


आप किस भाषा को लक्षित कर रहे हैं: C / C ++? जावा? कुछ और?
लॉरेंट कौविदो

4
@lorancou: अप्रासंगिक, वह स्पष्ट रूप से आकार निर्दिष्ट करता है long
डेडएमजी

@DeadMG जो C / C ++ में 32-बिट हो सकता है। 64-बिट की अधिक है long long। लेकिन हाँ, जो भी हो, अगर आप चाहें तो इसे नाइटपैकिंग कहें।
लॉरेंट कौविदो

बस BigInteger का उपयोग करें। अधिकांश भाषाओं में इसके कुछ प्रकार होते हैं - एक असीमित आकार पूर्णांक मान (उपयोग हे (लॉग (n)))
ashes999

यह एक उत्तर हो सकता है, बशर्ते कि खेल कंप्यूटिंग पर भारी न हो।
लॉरेंट कौविदो

जवाबों:


11

पूर्णांक के बारे में पहले से ही एक अच्छा जवाब है, लेकिन मुझे लगता है कि फ्लोटिंग-पॉइंट्स को समाप्त नहीं किया जाना चाहिए। अपने जवाब में, बाइटे 56 ने प्लूटो की अधिकतम कक्षा के लिए जाने का विकल्प लिया, शायद इस एक्सेल शीट से लिया गया था , इसलिए मैं उससे चिपक जाऊंगा ।

सौर प्रणाली की सीमाएँ निम्नलिखित हैं:

7,376,000,000 किमी = 7.376x10 ^ 9 किमी = 7.376x10 ^ 14 सेमी x10 7.4x10 ^ 14 सेमी

डबल-प्रेसिजन फ्लोटिंग प्वाइंट प्रारूप प्रस्तावों 15 महत्वपूर्ण दशमलव की एक अधिकतम परिशुद्धता। तो आप भाग्यशाली हैं: यदि आपकी उत्पत्ति सूर्य के केंद्र में है और आप प्लूटो के चारों ओर एक स्थिति का उपयोग करते हैं, तो आप सभी सेंटीमीटर का प्रतिनिधित्व कर सकते हैं , जैसे सी ++ में:

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, वह एक प्रणाली का सुझाव देता है जो आपकी आवश्यकताओं के अनुरूप हो सकती है, यह वास्तव में कई प्रकार के कई अलग-अलग समन्वय स्थान हैं।

यह सिर्फ कुछ संकेत हैं, आपको शायद इसे चलाने के लिए खुद के कुछ नुस्खा का उपयोग करना होगा। किसी ने जो पहले से ही उस तरह के सामान को लागू किया है वह आपको अधिक मदद कर सकता है। उदाहरण के लिए, कर्बला स्पेस प्रोग्राम के पीछे लोगों को ईमेल फायरिंग क्यों नहीं ?

अपने खेल के साथ गुड लक!


1
यह उत्तर अच्छा है क्योंकि यह OpenGL और DirectX की पसंद से उपयोग किए जाने वाले 3D फ़्लोटिंग पॉइंट स्पेस में अधिक आसानी से मैप करता है, और इसमें अच्छे संदर्भ हैं। इसलिए, मैंने इसे उत्तर के रूप में चिह्नित किया है :)
निकोलस हिल

कूल :) एक बोनस के रूप में, यह सब बहुत अनुमानित है, आपको ब्रूस डावसन के ब्लॉग में फ़्लोट्स के बारे में कुछ और गहराई से जानकारी मिलेगी : randomascii.wordpress.com/2012/05/20/…
लॉरेंट कौविदो

17

सौर प्रणाली के "किनारे" के लिए प्लूटो को मानते हुए (हालांकि कुछ का कहना है कि यह 3 प्रकाश वर्ष के रूप में दूर है)। प्लूटो, इसकी अधिकतम कक्षा सूर्य से लगभग 7,376,000,000 किलोमीटर है। वह 7.37600 × 10 ^ 14 सेंटीमीटर है। व्यास पाने के लिए डबल और आपको 1,475,200,000,000,000 सेंटीमीटर मिलेंगे । यह एक 64 बिट लंबे अधिकतम आकार के भीतर अच्छी तरह से है। चूंकि सौर प्रणाली की ऊंचाई इसके व्यास की तुलना में नगण्य है, इसलिए हम इसे अनदेखा कर सकते हैं।

तो हाँ, आप सौर मंडल में अपनी स्थिति का प्रतिनिधित्व करने के लिए एक लंबे समय का उपयोग कर सकते हैं। वास्तव में, आप एक हस्ताक्षरित लंबे (अहस्ताक्षरित के लिए डबल) के साथ 9.75 प्रकाश वर्ष तक के पदों को बाहर कर सकते हैं।

ध्यान दें कि यह दूरी खोजने के लिए मामला नहीं है। अधिकतम दूरी जिसे आप पा सकते हैं वह है अधिकतम दूरी का वर्गमूल जिसे आप यात्रा कर सकते हैं। दूरी खोजने के लिए विस्तार प्रणाली के स्तर का उपयोग करके इसे दूर किया जा सकता है। आप यह अनुमान लगाने के लिए कुछ सरल जांच कर सकते हैं कि दूरी कितनी दूर है (उनके x मान और y मान की तुलना करें), फिर छोटी दूरी के लिए सेंटीमीटर वेतन वृद्धि के लिए बड़ी दूरी के लिए 1,000,000 किलोमीटर वेतन वृद्धि का उपयोग करें।

बेशक वहाँ का सवाल है, क्या तुम सच में चाहते हो? सौर प्रणाली का 99.999% पूरी तरह से खाली स्थान है। यदि आप सौर प्रणाली का सही प्रतिनिधित्व कर रहे हैं, तो मुझे यकीन है कि आप भौतिकी का सही प्रतिनिधित्व नहीं कर रहे हैं। सौर मंडल के आसपास पहुंचने में लंबा समय लगता है। ज्यादातर लोगों की दिलचस्पी बने रहने के लिए बहुत लंबा रास्ता।

और यहां तक ​​कि ऐसी बारीक सटीकता भी क्यों है जब तक कि आप सौर प्रणाली में वस्तुओं को उस सटीकता के साथ मॉडल करने नहीं जा रहे हैं? यहीं से आप मुश्किल में पड़ जाएंगे। सूर्य का आयतन 1.40900 × 10 ^ 18 घन किलोमीटर है। क्यूबिक सेंटीमीटर पैमाने पर, एकल बिट का उपयोग करके यह दर्शाने के लिए कि उस स्थान पर "कब्जा" है, 1.4 × 10 ^ 33 बिट्स या 1.6 × 10 ^ 23 गीगाबाइट्स लेता है। मुझे लगता है कि आपके पास इतना रैम नहीं है।


3
पर सुंदर स्थान। लघु संस्करण: फ्लोट सटीकता आपकी चिंताओं का कम से कम है।
आआआआआआआआआआ आआआआआ

1
आप होगा पूर्णांकों, यहां तक कि 64-बिट के साथ अतिप्रवाह मिलता है। प्लूटो के चारों ओर अंतरिक्ष यान की परिक्रमा। अंतरिक्ष यान से सूरज की दूरी की गणना करने की कोशिश करता है। बराबरी। बूम।
लॉरेंट कौविदो

3
मैं पिछले पैराग्राफ में जोरदार तरीके से असहमत हूं - ओपी का सवाल सही अर्थों में है, और किसी को पदों पर 1 सेमी की सटीकता की देखभाल के लिए वास्तव में हर (घन) सेंटीमीटर में आइटम की उम्मीद करने की आवश्यकता नहीं है।
स्टीवन स्टैडनिक

1
@StevenStadnicki मेला पर्याप्त है, लेकिन किलोमीटर के स्तर पर भी यह अभी भी 164,029,188 गीगाबाइट 1 बिट प्रति क्यूबिक किलोमीटर है। यह आपकी कार स्पीडोमीटर में परमाणु सटीकता के लिए पूछने के समान है। यह ठीक उसी तरह से है, जिस तरह से इसे करने की आवश्यकता है।
MichaelHouse

1
ठीक है, एयू या प्रकाश वर्ष के पैमाने पर जाना बहुत ही असंभव है। चूंकि हम सौर मंडल के बारे में बात कर रहे हैं। बड़े नेबुला की तरह कुछ बड़े के लिए प्रकाश वर्ष या पारसेक बेहतर होगा।
MichaelHouse

2

आप उपयोग कर सकते हैं BigInteger, जो भी आपकी प्रोग्रामिंग भाषा इसे कॉल करती है। यह एक असीमित आकार का पूर्णांक है; यह अच्छी तरह से तराजू - आम तौर पर log(n)आकार के पूर्णांक के लिए भंडारण का उपयोग करता है n

जावा और सी # है; मुझे यकीन है कि अन्य भाषाएं करती हैं। यदि नहीं, तो आप बहुत अधिक कठिनाई के बिना इसे विघटित और पुन: कार्यान्वित कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.