The Best Resource for Minecraft
The Best Resource for Minecraft

ऋणात्मक निर्देशांक चंक के गणित को एक नहीं, दो जगहों पर बिगाड़ते हैं

ऋणात्मक निर्देशांक चंक के गणित को एक नहीं, दो जगहों पर बिगाड़ते हैं

ट्रंकेटिंग विभाजन ब्लॉक −1 को −1 के बजाय चंक 0 में रख देता है, और एक सामान्य % 15 के बजाय −1 का इन-चंक ऑफ़सेट देता है। दोनों गलत हैं, और दोनों तब तक सही लगते हैं जब तक आप स्पॉन के पश्चिम में नहीं जाते।

सकारात्मक चतुर्थांश में हर चंक की गणना आसान होती है और बाकी तीन में गलत होती है। यह ठीक दो जगहों पर गलत होती है, वे एक-दूसरे से स्वतंत्र हैं, और दोनों ऐसे उत्तर देती हैं जो सही लगते हैं।

दो ऑपरेशन

chunk  = floor(block / 16)          not  trunc(block / 16)
offset = ((block % 16) + 16) % 16   not  block % 16

रीजन के निर्देशांक वही जोड़ी हैं, एक स्तर ऊपर, 16 के बजाय 32 के साथ:

region     = floor(chunk / 32)   ->  r.<x>.<z>.mca
regionOff  = ((chunk % 32) + 32) % 32

तो एक रीजन 32 × 32 चंक का होता है, जो 512 × 512 ब्लॉक होते हैं।

गलती कहाँ असर करती है

विभाजन। ज़्यादातर भाषाएँ शून्य की ओर ट्रंकेट करती हैं, और floor rounds toward negative infinity. They agree for positives and disagree for every negative that is not an exact multiple:

  • ब्लॉक −1floor(−1/16) = −1 ✓, but trunc(−1/16) = 0

ब्लॉक −1 मूल बिंदु के पश्चिम में एक ब्लॉक है और चंक −1 का हिस्सा है। ट्रंकेशन इसे ब्लॉक +1 के साथ चंक 0 में रख देता है। प्रत्येक ऋणात्मक चंक इंडेक्स एक मान अधिक निकलता है।

शेषफल। JavaScript, Java, C और अधिकांश अन्य में, % keeps the sign of the left operand:

  • ब्लॉक −1 → correct offset 15, but −1 % 16 = −1

−1 का ऑफ़सेट 16-चौड़े चंक के अंदर की स्थिति बिल्कुल नहीं है। इसके साथ ब्लॉक ऐरे को इंडेक्स करने पर या तो गड़बड़ी आती है या यह गलत सेल को पढ़ लेता है।

एक हल किया गया उदाहरण

ब्लॉक −1290 एक अक्ष पर:

चरणसहीसामान्य
चंकfloor(−1290/16) = −81trunc = −80 ✗
चंक में ऑफ़सेट6−1290 % 16 = −10 ✗
रीजनfloor(−81/32) = −3trunc = −2 ✗
रीजन में ऑफ़सेट15−81 % 32 = −17 ✗

चार मान, चार गलत उत्तर, जिनमें से कोई भी इतना सीमा से बाहर नहीं है कि स्पष्ट रूप से टूटा हुआ दिखे। रीजन −3 चंक −96 से −65 तक फैला है, और चंक −81 इसकी शुरुआत से 15 अंदर है — जो कि सुधारे गए शेषफल द्वारा लौटाया गया सटीक मान है।

Nether रूपांतरण एक दिशा में विकृत होता है

Overworld से Nether में 8 से भाग होता है, और यह फ़्लोर भी करता है:

netherX = floor(overworldX / 8)

वापस आने पर 8 से गुणा होता है। यह नहीं है एक राउंड ट्रिप। floor throws away the remainder, so returning lands you on a multiple of 8:

  • Overworld 1000 → Nether 125 → back to 1000
  • Overworld 1007 → Nether 125 → back to 1000 ✗ — seven blocks short

त्रुटि प्रति अक्ष 0 से 7 ब्लॉक तक होती है, यानी X पर 7 और Z पर एक साथ 7 तक। यही मुख्य कारण है कि सटीक पोर्टल लिंकिंग के लिए Nether निर्देशांक को दोबारा निकालने के बजाय लिखकर रखने की आवश्यकता होती है: एक बार विभाजित करने के बाद, मूल Overworld स्थिति को फिर से प्राप्त नहीं किया जा सकता।

Nether हब के लिए इससे शायद ही कोई फ़र्क पड़ता है — 7 ब्लॉक पोर्टल के अपने कैप्चर रेडियस के अंदर होते हैं। लेकिन दो ऐसे पोर्टलों को जोड़ने के लिए जो एक-दूसरे के ट्रैफ़िक को न चुराएं, यह बहुत मायने रखता है।

ऋणात्मक Overworld निर्देशांक इसे जाने-पहचाने तरीके से और बिगाड़ देते हैं: Overworld −1 gives Nether floor(−1/8) = −1, while truncation gives 0 and sends you to the wrong side of the axis.

टूल आज़माएं: Coordinate Toolbox →