मैं मानूंगा कि आपके पास अपने जहाज के लिए शारीरिक रूप से सही गति है, अन्यथा यह विश्लेषण आयोजित नहीं होगा। इस समस्या को ठीक से हल करने के लिए आपको दक्षता से कुछ अधिक मजबूत होना चाहिए।
प्रत्येक थ्रस्टर जहाज की गति पर दो प्रभाव पैदा करेगा: रैखिक और कोणीय। इन्हें स्वतंत्र रूप से माना जा सकता है। यदि थ्रस्टर f
एक दिशा में एक बल पैदा करता है dir
, और एक वेक्टर द्वारा द्रव्यमान के केंद्र से ऑफसेट होता है r
(ज्यामितीय केंद्र या स्प्राइट के केंद्र पर नहीं!), तो रैखिक घटक पर प्रभाव होता है:
t = f * dir // f is a scalar, dir is unit length
कोणीय वेग का प्रभाव टोक़ द्वारा दिया जाता है:
tau = f * <dir.x, dir.y, 0> CROSS <r.x, r.y, 0> // cross product
t
एक बल वेक्टर है (यानी रैखिक जोर)। tau
एक हस्ताक्षरित अदिश राशि है, जो जड़ता के बड़े पैमाने पर विभाजित होने पर, कोणीय त्वरण देगा। यह महत्वपूर्ण है कि dir
और r
दोनों एक ही समन्वय स्थान में हैं, अर्थात दोनों स्थानीय निर्देशांक में या दोनों विश्व निर्देशांक में।
जहाज के समग्र रैखिक त्वरण t
को जहाज के द्रव्यमान द्वारा विभाजित प्रत्येक थ्रस्टर के योग द्वारा दिया जाता है । इसी तरह, कोणीय त्वरण सिर्फ जड़ता के द्रव्यमान क्षण (जो एक और अदिश राशि है) द्वारा विभाजित टोरों का योग है। यदि कुल टोक़ शून्य है तो जहाज चालू नहीं होगा। इसी तरह, यह नहीं चलेगा अगर कुल जोर शून्य है। रिकॉल टॉर्क एक स्केलर है, लेकिन थ्रस्ट ( t
'एस' का योग 2 डी वेक्टर है।
इस प्रदर्शनी की बात यह है कि अब हम अपनी समस्या को रैखिक कार्यक्रम के रूप में लिख सकते हैं । कहते हैं पहले हम अपने जहाज करना चाहते हैं बारी के बिना आगे बढ़ । हमारे पास प्रत्येक थ्रस्टर के लिए एक चर है, $ x_1, x_2, ... $, जो कि थ्रस्ट प्रदान करेगा की राशि है। बाधाओं का एक सेट है:
0 <= x_i < fmax_i //for each i
fmax
उस थ्रस्टर के लिए अधिकतम बल कहां है (यह हमें मजबूत या कमजोर बनाता है)। आगे, हम कहते हैं कि दोनों समानताएँ:
0 = Sum_i x_i * dir_i.x
0 = Sum_i x_i * dir_i.y
यह बाधा को बताता है कि हम एक रैखिक त्वरण लागू नहीं करेंगे, यह कहकर कि कुल जोर शून्य है (जोर एक वेक्टर है, इसलिए हम कहते हैं कि प्रत्येक भाग शून्य है)।
अब हम चाहते हैं कि हमारा जहाज पलट जाए। संभवतः हम जितनी जल्दी हो सके ऐसा करना चाहते हैं, इसलिए हम चाहते हैं:
max (Sum_i x_i * c_i)
where c_i = <dir_i.x, dir_i.y, 0> CROSS <r_i.x, r_i.y, 0>
के लिए सुलझाने x_i
की, इसके बाद के संस्करण असमानताओं और समानताओं को संतोषजनक जबकि जबकि ऊपर योग को अधिकतम, हमें वांछित जोर दे देंगे। अधिकांश प्रोग्रामिंग भाषाओं में उनके लिए एलपी लाइब्रेरी उपलब्ध है। बस उपरोक्त समस्या को इसमें डालें और यह आपके उत्तर का उत्पादन करेगा।
इसी तरह की समस्या हमें बिना रुके आगे बढ़ने देगी। कहें कि हम अपनी समस्या को एक समन्वय प्रणाली में फिर से लिखते हैं जिसमें हम सकारात्मक x दिशा में बढ़ना चाहते हैं। फिर अड़चनें हैं:
0 <= x_i < fmax_i //for each i
max Sum_i x_i * dir_i.x
0 = Sum_i x_i * dir_i.y
0 = (Sum_i x_i * c_i)
where c_i = <dir_i.x, dir_i.y, 0> CROSS <r_i.x, r_i.y, 0> // as before
बाधा के साथ कि थ्रस्टर्स केवल एक ही दिशा में जोर का उत्पादन कर सकते हैं, इस तरह के घुमाव और रैखिक वेग की सीमाएं होने जा रही हैं जिन्हें आप प्राप्त करने में सक्षम होंगे। यह समाधान होने के रूप में प्रकट होगा 0 = x_1 = x_2 = ... = x_n
, जिसका अर्थ है कि आप कभी भी कहीं भी नहीं मिलेगा। इसे कम करने के लिए, मैं सुझाव देता हूं कि प्रत्येक खिलाड़ी के लिए छोटे, कमजोर (5%, या 10%) के जोड़े को जोड़कर दोनों तरफ 45 डिग्री पर थ्रस्टर रखा जाए। यह समाधान को अधिक लचीलापन देगा, क्योंकि इनका उपयोग मुख्य थ्रस्टर्स के कमजोर माध्यमिक प्रभावों का मुकाबला करने के लिए किया जा सकता है।
अंत में, शायद 100 थ्रस्टर्स के माध्यम से, एलपी का समाधान प्रति फ्रेम करने के लिए पर्याप्त तेज़ है। हालाँकि, क्योंकि समाधान स्थान या वर्तमान स्थिति पर निर्भर नहीं करता है, आप प्रत्येक उचित नियंत्रक इनपुट संयोजन के लिए समाधान को पूर्ववर्ती कर सकते हैं जब भी आकार बदलता है (इसमें गैर-थ्रस्टर्स को जोड़ना शामिल है जो जड़ता या जहाज के द्रव्यमान को बदल देता है, क्योंकि तब थ्रस्टर्स द्रव्यमान के केंद्र के सापेक्ष एक अलग स्थान पर होते हैं!)। यह 24 संभावनाएं हैं (यानी 8 दिशाओं का समय {बाएं स्पिन, कोई रोटेशन नहीं, दाएं स्पिन})।