Guides / Commands & Data

พิกัดติดลบทำให้การคำนวณชังก์ผิดพลาด 2 จุด ไม่ใช่แค่ 1 จุด

การหารแบบตัดทศนิยมทำให้บล็อก -1 ไปอยู่ในชังก์ 0 แทนที่จะเป็น -1 และการใช้ % ธรรมดาทำให้ได้ค่าออฟเซ็ตในชังก์เป็น -1 แทนที่จะเป็น 15 ทั้งสองอย่างผิดพลาด และดูเหมือนจะถูกต้องจนกว่าคุณจะเดินทางไปทางตะวันตกของจุดเกิด

การคำนวณชังก์ทุกครั้งจะง่ายในควอดแรนต์บวกและผิดพลาดในอีกสามควอดแรนต์ที่เหลือ มีจุดที่ผิดพลาดอยู่สองจุดพอดี ซึ่งเป็นอิสระต่อกัน และทั้งสองจุดให้คำตอบที่ดูสมเหตุสมผล

การดำเนินการทั้งสอง

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

พิกัดภูมิภาค (Region coordinates) เป็นคู่เดียวกัน แต่เป็นระดับที่สูงขึ้น โดยใช้ 32 แทน 16:

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

ดังนั้นหนึ่งภูมิภาคคือ 32 × 32 ชังก์ ซึ่งเท่ากับ 512 × 512 บล็อก

จุดที่แต่ละส่วนผิดพลาด

การหาร (Division) ภาษาโปรแกรมส่วนใหญ่จะตัดทศนิยมเข้าหาศูนย์ (truncate toward zero) และ floor จะปัดเศษลงเข้าหาอนันต์ลบ (rounds toward negative infinity) ซึ่งจะตรงกันสำหรับค่าบวกและไม่ตรงกันสำหรับค่าลบทุกค่าที่ไม่ใช่พหุคูณที่แน่นอน:

  • บล็อก −1floor(−1/16) = −1 ✓, แต่ trunc(−1/16) = 0

บล็อก -1 อยู่ห่างจากจุดกำเนิดไปทางตะวันตกหนึ่งบล็อกและเป็นของชังก์ -1 การตัดทศนิยมทำให้มันอยู่ในชังก์ 0 เช่นเดียวกับบล็อก +1 ดัชนีชังก์ที่เป็นลบทุกค่าจะออกมาสูงเกินไปหนึ่งค่า

เศษเหลือ (Remainder) ใน JavaScript, Java, C และภาษาอื่นๆ ส่วนใหญ่ % จะคงเครื่องหมายของตัวถูกดำเนินการทางซ้ายไว้:

  • บล็อก −1 → ออฟเซ็ตที่ถูกต้อง 15, แต่ −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 บล็อก ซึ่งตรงกับสิ่งที่เศษเหลือที่แก้ไขแล้วส่งคืน

การแปลงเนเธอร์มีการสูญเสียข้อมูลในทิศทางเดียว

การแปลงจากโลกปกติ (Overworld) ไปยังเนเธอร์ (Nether) จะหารด้วย 8 และปัดเศษลงด้วย:

netherX = floor(overworldX / 8)

การกลับมาจะคูณด้วย 8 ซึ่ง ไม่ใช่ การเดินทางไปกลับ floor จะทิ้งเศษที่เหลือไป ดังนั้นการกลับมาจะทำให้คุณลงจอดที่ตำแหน่งที่เป็นพหุคูณของ 8:

  • โลกปกติ 1000 → เนเธอร์ 125 → กลับสู่ 1000
  • โลกปกติ 1007 → เนเธอร์ 125 → กลับสู่ 1000 ✗ — สั้นไปเจ็ดบล็อก

ข้อผิดพลาดคือ 0 ถึง 7 บล็อกต่อแกน ดังนั้นอาจผิดพลาดได้สูงสุด 7 บล็อกบนแกน X และ 7 บล็อกบนแกน Z พร้อมกัน นี่คือเหตุผลทั้งหมดที่การเชื่อมโยงพอร์ทัลที่แม่นยำจำเป็นต้องจดพิกัดเนเธอร์ไว้แทนที่จะคำนวณใหม่: เมื่อคุณหารแล้ว ตำแหน่งโลกปกติที่มันมาจากจะไม่สามารถกู้คืนได้อีกต่อไป

สำหรับศูนย์กลางเนเธอร์ (Nether hub) เรื่องนี้ไม่ค่อยสำคัญนัก — 7 บล็อกยังอยู่ในรัศมีการจับภาพของพอร์ทัลเอง สำหรับการเชื่อมโยงพอร์ทัลสองแห่งที่ต้องไม่แย่งการจราจรกัน เรื่องนี้สำคัญมาก

พิกัดโลกปกติที่เป็นลบทำให้สถานการณ์แย่ลงในลักษณะที่คุ้นเคย: โลกปกติ −1 ให้เนเธอร์ floor(−1/8) = −1 ในขณะที่การตัดทศนิยมให้ 0 และส่งคุณไปยังด้านที่ผิดของแกน

ชุดเครื่องมือพิกัด →

More guides

Browse all →

กำลังหาเครื่องมือ Minecraft อื่นอยู่ไหม

ชุดเครื่องมือสร้าง ดู และแปลงไฟล์ที่ทำงานในเบราว์เซอร์ ฟรีทั้งหมด