อัลกอริทึม Jump Jump สามารถแยกกันได้หรือไม่


10

JFA (อัลกอริทึมที่อธิบายไว้ที่นี่: http://www.comp.nus.edu.sg/~tants/jfa/i3d06.pdf ) สามารถใช้เพื่อรับการประมาณของแผนภาพ Voronoi หรือการแปลงระยะทาง มันทำเช่นนั้นในเวลาลอการิทึมตามขนาดของภาพผลลัพธ์ไม่ใช่จำนวนเมล็ด

คุณจะทำอย่างไรถ้าภาพของคุณมีขนาดไม่เท่ากันในแต่ละแกน

หากมีขนาดใกล้เคียงกันฉันแน่ใจว่าคุณสามารถปล่อยให้แกนที่สั้นกว่ามีขั้นตอน JFA พิเศษขนาด 1 ในขณะที่แกนขนาดใหญ่ทำงานให้เสร็จ (เช่นมีขนาดภาพ 512 x 256) สำหรับขนาดแกนที่แตกต่างกันมากขนาดนี้อาจจะไม่มีประสิทธิภาพมากกว่านี้มาก - กล่าวว่าคุณมีพื้นผิวปริมาณที่ 512 x 512 x 4

เป็นไปได้หรือไม่ที่จะเรียกใช้ JFA ในแต่ละแกนแยกจากกันและยังได้ผลลัพธ์ที่ดี?

หรือ ณ จุดนั้นเป็นอัลกอริทึมที่แตกต่างกันเหมาะสมกว่าที่จะใช้? ถ้าเป็นเช่นนั้นอัลกอริทึมแบบนั้นอาจเป็นอะไร?

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

คำตอบ:


7

คำตอบอย่างรวดเร็วสำหรับคำถามส่วนตัวของคุณ

คุณจะทำอย่างไรถ้าภาพของคุณมีขนาดไม่เท่ากันในแต่ละแกน

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

เราสามารถสรุปได้ว่า n คือพลังของ 2

นั่นคือสมมติฐานนี้ไม่จำเป็นต้องใช้เพื่อให้อัลกอริทึมในการทำงาน

เป็นไปได้หรือไม่ที่จะเรียกใช้ JFA ในแต่ละแกนแยกจากกันและยังได้ผลลัพธ์ที่ดี?

การวิ่งบนแต่ละแกนแยกกันมีแนวโน้มที่จะให้ผลลัพธ์พิกเซลที่ไม่ถูกต้องมากขึ้นและใช้เวลานานกว่าในกรณีส่วนใหญ่ ในกรณีที่รุนแรงที่สุดที่ความยาวด้านหนึ่งของภาพน้อยกว่า 8 (จำนวนทิศทางการกระโดด) มันอาจเร็วกว่าเมื่ออัลกอริทึมปฏิบัติกับ 8 ทิศทางเหล่านั้นตามลำดับ แต่สำหรับภาพที่กว้างขึ้นการแยกแกนสูญเสียข้อดีของการรักษา ในแบบคู่ขนาน.

ในสถานการณ์ของฉันฉันกำลังมองหาที่จะสนับสนุนทั้งเมล็ดจุดเดียวเช่นเดียวกับเมล็ดรูปทรงโดยพลการ

กระดาษกล่าวถึงเมล็ดที่มีรูปร่างตามอำเภอใจในส่วนที่ 6 ภายใต้หัวข้อย่อย "แผนภาพ Voronoi ทั่วไป":

... อัลกอริทึมของเราปฏิบัติต่อเมล็ดพันธุ์ทั่วไปเช่นชุดของเมล็ดจุดและคาดว่าจะสืบทอดประสิทธิภาพที่ดีที่ได้รับสำหรับเมล็ดพันธุ์จุด

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

อาจมีน้ำหนักเมล็ดที่ระยะห่างจากเมล็ดถูกปรับโดยตัวคูณและ / หรือแอดเดอร์เพื่อให้มีอิทธิพลมากขึ้นหรือน้อยลง

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

อัลกอริทึมปัจจุบันผ่าน<s, position(s)>ไปเพื่อระบุเมล็ดและตำแหน่งของมันและมีเพียงหนึ่งเมล็ดจะถูกเก็บไว้ต่อพิกเซลในเวลาใดก็ได้ การขยายส่วนนี้เพื่อจัดเก็บ<s, position(s), weight(s)>ข้อมูลทั้งหมดที่จำเป็นต่อการชั่งน้ำหนักฟังก์ชั่นระยะทางและคำนวณว่าเมล็ดพันธุ์ใหม่ที่ส่งผ่านไปยังพิกเซลนั้นอยู่ใกล้กับพิกเซลมากกว่าที่เป็นอยู่ในปัจจุบันหรือไม่

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

<s, position(s), multiplicative(s), additive(s)>

และอัลกอริทึมปัจจุบันจะเทียบเท่ากับอัลกอริทึมใหม่นี้โดยใช้

<s, position(s), 1, 0>


คำอธิบายโดยละเอียดว่าทำไม

เช่นเดียวกับในกระดาษการใช้ทั้งหมดของ เข้าสู่ระบบ() อ้างถึงลอการิทึมฐาน 2

อัลกอริทึมไม่จำเป็นต้องปรับให้เหมาะกับความยาวด้านที่แตกต่างกัน

หากความยาวด้านไม่เท่ากันและไม่ใช่พลังของ 2 ไม่จำเป็นต้องปรับเปลี่ยนอัลกอริทึม มันเกี่ยวข้องกับพิกเซลที่ขอบของรูปภาพซึ่งทิศทางการข้ามบางอย่างนำไปสู่นอกรูปภาพ เนื่องจากอัลกอริทึมได้ละเว้นข้อมูลเมล็ดพันธุ์สำหรับเส้นทางที่นำไปสู่นอกภาพความกว้างหรือความสูงที่ไม่ใช่กำลัง 2 จะไม่เป็นปัญหา สำหรับภาพความกว้าง W และความสูง H ขนาดการกระโดดสูงสุดที่ต้องการจะเป็น

2เข้าสู่ระบบ(สูงสุด(W,H))-1

สำหรับกรณีที่มีความกว้างและความสูงเท่ากัน N จะลดลง

2เข้าสู่ระบบ(ยังไม่มีข้อความ)-1

ในกรณีที่มีความยาวด้าน N ซึ่งเป็นกำลัง 2 มันจะลดลง

2เข้าสู่ระบบ(ยังไม่มีข้อความ)-1=ยังไม่มีข้อความ/2

ตามที่ใช้ในกระดาษ

ในแง่ง่ายยิ่งขึ้นให้ปัดความยาวด้านสูงสุดขึ้นเป็นกำลังสองถัดไปจากนั้นลดครึ่งหนึ่งเพื่อให้ได้ขนาดกระโดดสูงสุด

ซึ่งเพียงพอที่จะครอบคลุมทุกพิกเซลในภาพจากทุกพิกเซลในภาพเนื่องจากออฟเซ็ตไปยังพิกเซลใด ๆ จะอยู่ในช่วง 0 ถึง N-1 หากความยาวด้านที่ยาวที่สุดคือ N การรวมกันของ 2 0 ถึง N / 2 จะครอบคลุมจำนวนเต็มทุกค่าสูงสุดถึง N-1 ถ้า N เป็นกำลัง 2 และถ้า N ไม่ใช่พลัง 2 ช่วงครอบคลุมจะใหญ่กว่าที่ต้องการได้เพียงเนื่องจากเพดานของลอการิทึม ( การปัดเศษขึ้นเป็นกำลังต่อไปของ 2)

รูปภาพที่มีด้านข้างไม่ใช่กำลัง 2 จะไม่ลดลงอย่างมาก

จำนวนของการกระโดดขึ้นอยู่กับความยาวของด้านที่ยาวที่สุดพูดลิตรถ้า L เป็นอำนาจของ 2 แล้วจำนวนกระโดดเป็น(L) ถ้า L ไม่ได้เป็นอำนาจของ 2 แล้วจำนวนกระโดดเป็น\สำหรับภาพที่มีขนาดใหญ่พอสมควรจะไม่แตกต่างกันมากเข้าสู่ระบบ(L)เข้าสู่ระบบ(L)

ตัวอย่างเช่นภาพ 1024 x 1024 จะต้องมีการกระโดดซ้ำ 10 ครั้ง รูปภาพขนาด 512 x 512 จะต้องมีการวนซ้ำ 9 ครั้ง สิ่งใดระหว่างสองขนาดจะต้องมีการซ้ำ 10 ครั้ง แม้ในกรณีที่เลวร้ายที่สุดของภาพเพียงแค่กำลัง 2 เท่านั้นเช่น 513 x 513 ภาพมันจะต้องใช้การวนซ้ำเพิ่มอีก 1 ครั้งเท่านั้นซึ่งในระดับนี้จะเพิ่มขึ้นประมาณ 11% (10 แทนที่จะเป็น 9)

รูปภาพที่ไม่ใช่รูปสี่เหลี่ยมจัตุรัสมีประสิทธิภาพต่อพื้นที่น้อยกว่า

เนื่องจากจำนวนการวนซ้ำที่ต้องการนั้นถูกกำหนดโดยความยาวด้านที่ยาวที่สุดเวลาที่ใช้สำหรับ 1024 ถึง 1024 ภาพจะเท่ากับสำหรับ 1024 ถึง 16 ภาพ ภาพสี่เหลี่ยมจัตุรัสอนุญาตให้ครอบคลุมพื้นที่ขนาดใหญ่กว่าในจำนวนการวนซ้ำที่เท่ากัน

แกนแยกมีแนวโน้มที่จะลดคุณภาพ

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

มีเพียงหนึ่งพา ธ ที่ต้องมีอยู่ซึ่งไม่ได้ฆ่าเมล็ดเพื่อให้ผลลัพธ์สุดท้ายถูกต้อง สีที่ไม่ถูกต้องเกิดขึ้นเฉพาะเมื่อเส้นทางทั้งหมดจากเมล็ดที่ถูกต้องไปยังพิกเซลที่กำหนดจะถูกบล็อก

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

การแยกแกนจะทำให้อัลกอริทึมใช้เวลานานขึ้น

ประสิทธิภาพอาจจะลดลงโดยการแยกแกนเนื่องจากน้ำท่วมจะไม่ทำแบบขนานอีกต่อไป แต่จะทำซ้ำสำหรับแต่ละแกนแทน สำหรับ 2D สิ่งนี้น่าจะใช้เวลาประมาณสองเท่าและสำหรับ 3D ประมาณ 3 เท่านาน

นี่อาจลดลงบ้างจากการกระโดดข้ามเส้นทแยงมุม แต่ฉันก็ยังคาดหวังว่าประสิทธิภาพโดยรวมจะลดลง


1
ฉันเริ่มทำการทดลองกับสิ่งนี้แล้ว ฉันพบว่าการสุ่มตัวอย่างในเครื่องหมาย + (อ่าน 5 ครั้ง) แทนที่จะเป็นแบบเต็ม 9 แสดงว่าไม่มีความแตกต่างในการทดสอบของฉัน แต่ฉันแน่ใจว่าในสถานการณ์ที่ซับซ้อนมากขึ้นจะมีความแตกต่าง การทำ x jfa แบบเต็มและ y jfa แบบเต็มจะทำให้เกิดข้อผิดพลาดมากมาย ฉันจะสนใจที่จะได้ยินรายละเอียดเพิ่มเติม / ข้อมูลถ้าคุณมี แต่ยอมรับคำตอบของคุณ: P
Alan Wolfe

1
ลืมนี่คือลิงค์ไปยังหนึ่งในการทดลองของฉัน: shadertoy.com/view/Mdy3D3
Alan Wolfe

น่าสนใจว่ามันใช้งานได้ดีเช่นกันกับการอ่านเพียง 5 ครั้งโดยเฉพาะอย่างยิ่งเนื่องจากไม่สามารถเทียบเคียงได้ เนื่องจากกระดาษแสดงรายการกรณีที่นำไปสู่ข้อผิดพลาดบางทีคุณอาจตั้งค่าเหล่านี้อย่างจงใจและดูว่า 5 ทิศทางการกระโดดยังคงดีอยู่หรือไม่
trichoplax

ดูเหมือนว่าคุณพร้อมที่จะโพสต์คำตอบของคุณเอง ...
trichoplax

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