อัลกอริทึมเพื่อดูว่าสอง voxels เชื่อมต่อกันหรือไม่


11

ฉันกำลังมองหาอัลกอริทึมที่ดีสำหรับปัญหาต่อไปนี้: กำหนดตาราง voxels แบบ 3 มิติ (ซึ่งอาจว่างเปล่าหรือเติมเต็ม) ถ้าฉันเลือก voxels ที่ไม่ติดกันสองตัวฉันต้องการทราบว่าพวกมันเชื่อมต่อกันด้วยหรือไม่ voxels อื่น ๆ

ตัวอย่างเช่น (เพื่อแสดงให้เห็นถึงสถานการณ์ใน 2D) โดยที่ # เป็นสี่เหลี่ยมจัตุรัสที่กรอก:

  1 2 3
a # # #
b # #
c # # #

หากฉันเลือก a3 และ c3 ฉันต้องการตรวจสอบโดยเร็วที่สุดหากพวกเขาเชื่อมต่ออยู่ หากมีเส้นทางระหว่าง a3 และ c3 ถึงพิกเซลที่เติม (สถานการณ์จริงอยู่ในตาราง voxel 3D แน่นอน)

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

ฉันควรใช้อัลกอริทึมใด

แก้ไข: ตามความคิดเห็นฉันคิดว่าควรเพิ่มสิ่งต่อไปนี้: เนื้อหาของ voxels ไม่เป็นที่รู้จักล่วงหน้าและขั้นตอนวิธีจำเป็นในการตรวจสอบว่าการกำจัด (การล้าง) ของ voxel จะทำให้กลุ่ม voxel แตกหรือไม่ เป็นกลุ่มเล็ก ๆ สองกลุ่มขึ้นไป


ในตัวอย่างของเส้นทางที่ถูกต้องจาก a3 เพื่อ c3 จะเป็นต่อไปนี้c3->c2->b2->a2->a3?

ถูกต้องแล้ว
Bram Vaessen

คำตอบ:


12

A *ใช้ได้ดี การค้นหาเส้นทางคือสิ่งที่คุณต้องการการค้นหาเส้นทางที่สั้นที่สุดนั้นรวดเร็ว (หรือเร็วกว่า) กว่าการค้นหาเส้นทางใด ๆ เลย ในสถานการณ์นี้ A * น่าจะเหมาะสมที่สุดเนื่องจากคุณมีจุดเริ่มต้นและจุดสิ้นสุด ซึ่งหมายความว่าคุณมีฮิวริสติกที่เพิ่มเข้ามาเพื่อเพิ่มความเร็วในการค้นหา

ด้วย A * โดยทั่วไปเส้นทางแรกที่คุณค้นหานั้นสั้นที่สุดดังนั้นจึงไม่ได้ทำงานพิเศษหลังจากพบเส้นทางแล้ว

ป้อนคำอธิบายรูปภาพที่นี่

สำหรับการเพิ่มประสิทธิภาพบางส่วนตรวจสอบของฉันคำตอบที่นี่


ดูเหมือนว่ามันจะ
พุ่ง

1
@ GameDev-er ใช่นั่นเป็นเพราะฮิวริสติก หากไม่มีสิ่งกีดขวางมันจะเป็นการค้นหาที่รวดเร็วมากเกือบเป็นเส้นตรง
MichaelHouse

ด้วยการเรียงลำดับโหนดที่ดีขึ้นสิ่งนี้จะขยายเส้นทางที่อยู่ใกล้กับโหนดสุดท้ายก่อน หากคุณมีโครงสร้างข้อมูลที่รวดเร็วสำหรับการสั่งซื้อโหนดให้เรียงลำดับตามระยะทางไปยังเป้าหมายสำหรับเส้นทางที่ตรงที่สุด
MichaelHouse

9

หากคุณเตรียมที่จะทำการประมวลผลล่วงหน้าและกินค่าใช้จ่ายในการจัดเก็บแล้วแบ่ง voxels เป็นกลุ่มที่เชื่อมต่อ ณ เวลาที่สร้างให้คำตอบที่ชัดเจนเพื่อ 'มีเส้นทางที่ทุกคน' มีเส้นทางระหว่างสอง voxels หากพวกมันอยู่ในกลุ่มเดียวกัน ปัญหาที่เห็นได้ชัดคือคุณต้องเก็บข้อมูลกลุ่มไว้ที่ใดที่หนึ่งและขึ้นอยู่กับการจัดวางข้อมูลของคุณ หากคุณกำลังจัดเก็บรายการง่าย ๆ คุณสามารถแบ่งมันออกเป็นหลายรายการหนึ่งรายการสำหรับแต่ละกลุ่มที่เชื่อมโยงเชิงพื้นที่ หากคุณกำลังจัดการกับ BVH บางประเภทคุณอาจจะได้รับประสิทธิภาพที่ดีพอสมควรถ้าคุณสามารถพูดว่า "voxels ทั้งหมดในโหนดนี้และด้านล่างเป็นของกลุ่ม X"

อีกวิธีหนึ่งคุณสามารถทำ pre-partioning เชิงพื้นที่และเก็บชุด 'voxels' ฮับ 'ที่มีขนาดเล็กลงสำหรับแต่ละกลุ่มที่เชื่อมต่อกัน จากนั้นคุณสามารถค้นหาพา ธ จากแหล่งต้นทางและเป้าหมาย voxels ไปยังฮับ voxel ที่ใกล้ที่สุดซึ่งควรสั้นกว่าหรือถูกกว่าเพื่อคำนวณเส้นทาง หากคุณสามารถหาเส้นทางจาก voxel ไปยังฮับ voxel จากนั้น voxel เป็นส่วนหนึ่งของกลุ่มของ voxel ฮับ ด้วยการเลือกอย่างชาญฉลาดของฮับ voxels เหล่านั้นคุณสามารถลดจำนวนเส้นทางการสัญจร เช่นทรงกลมอาจมีฮับ voxel เพียงฮับเดียวที่อยู่ตรงกลาง แต่กลุ่มที่มีความยาวบาง ๆ อาจมีฮับ voxel ทุก X Voxels ตามความยาว หากต้นกำเนิดและเป้าหมายของคุณอยู่ที่ปลายสุดของความยาวพวกเขาจะต้องไปที่ X voxels ส่วนใหญ่เพื่อค้นหาฮับและแม้ว่าอาจมีจำนวนมากของ voxels ระหว่างจุดเริ่มต้นและจุดสิ้นสุดของความยาว

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


1
นี่เป็นคำตอบที่ถูกต้อง แต่หากจะนำไปใช้อย่างมีประสิทธิภาพก็ไม่ควรจัดเก็บเป็นรายการ เพิ่มตัวชี้ไปยังแต่ละ voxel ที่ชี้ไปที่ "ตัวแทน voxel" ของมันซึ่งคุณตั้งค่าโดยใช้อัลกอริทึม Union-find นี่คือค่าใช้จ่ายในการจัดเก็บที่คงที่ต่อ voxel และเป็นเส้นตรงในจำนวนขอบสำหรับค่าใช้จ่ายในการคำนวณ
Neil G

แนวคิดที่น่าสนใจ แต่มีสองสิ่งที่อาจทำให้สถานการณ์ซับซ้อน อย่างแรกก็คือเนื้อหาของตาราง voxel ไม่เป็นที่รู้จักล่วงหน้าดังนั้นเพื่อที่จะสร้าง voxels แบบฮับฉันต้องมีอัลกอริทึมที่สามารถกำหนดว่า voxels ใดควรเป็นฮับ
Bram Vaessen

1
ปัญหาที่สองคือต้องใช้อัลกอริทึมทันทีหลังจากลบหนึ่ง voxel เพื่อตรวจสอบว่ากลุ่มมันเป็นส่วนหนึ่งถูกแบ่งออกเป็นกลุ่มเล็ก ๆ เนื่องจากการกำจัดของ voxel นั้น
Bram Vaessen

@BramVaessen หากคุณกำลังมองหาความสัมพันธ์ด้านการเชื่อมต่อระหว่างกันทั้งหมดโดยเฉพาะอย่างยิ่งไม่ว่าจะเป็นกลุ่ม 'เลิก' - นั่นเป็นเรื่องที่แตกต่างกว่าการเข้าถึงแบบง่าย ๆ ฉันขอแนะนำให้เพิ่มรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่คุณตั้งคำถามเดิมเนื่องจากอาจทำให้คำตอบที่ดีขึ้นสำหรับ 'ปัญหาที่อยู่เบื้องหลังคำถาม'
Steven Stadnicki

เพื่อให้มันสะอาดฉันได้ถามปัญหาเริ่มต้นของฉันในคำถามอื่นที่นี่gamedev.stackexchange.com/questions/50953/ …
Bram Vaessen

4

ฉันไม่คุ้นเคยกับ voxels แต่ฉันคิดว่าคุณจะได้ประสิทธิภาพที่ดีจากการใช้อัลกอริทึมการค้นหาที่ดีที่สุดเช่น A * ปัญหาของการใช้ A * ในกรณีนี้คือปกติแล้วฮิวริสติกที่ใช้จะถูกออกแบบมาเพื่อจัดลำดับความสำคัญในการค้นหาเส้นทางที่สั้นที่สุดและไม่ใช่แค่ 'เส้นทางใด ๆ ' โดยเร็วที่สุด

คุณอาจจะโชคดีในการใช้ฮิวริสติกสำรองซึ่งขยายโหนดให้น้อยลงเช่น

f (p) = g (p) + w (p) * h (p)

โดยที่ w> = 1. คุณลดค่าของ 'w' ยิ่งคุณเข้าใกล้เป้าหมายมากขึ้นเท่านั้นดังนั้นจึงให้ความสำคัญกับต้นทุนของเส้นทางที่สูงขึ้น 'g' ยิ่งคุณเข้าใกล้ voxel ที่คุณมองหามากขึ้นเท่านั้น

ฉันหวังว่านี่จะช่วยได้!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.