วิธีคำนวณการหมุนรูปได้อย่างมีประสิทธิภาพ


13

ภาพที่ 1 ภาพที่ 2

ฉันมีรูปที่แสดงผ่านเมทริกซ์ของไบต์ (เมทริกซ์บิตแมปเหมือน) ตัวอย่างรูปที่Picture 1ถูกแสดงบน

เป้าหมายคือการหามุมการหมุนที่ดีที่สุดของให้บางรูป เมื่อรูปถูกหมุนด้วยมุมที่ดีที่สุดสี่เหลี่ยมที่ขนานกับแกน X และ Y และจารึกรูปที่มีพื้นที่ที่เล็กที่สุด

รูปสี่เหลี่ยมที่จารึกรูปจะแสดงเป็นสีเทาอ่อนบนรูปภาพ ในการPicture 2, คุณจะเห็นว่าการหมุนในอุดมคติของรูปเป็นประมาณ 30 องศาตามเข็มนาฬิกา

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

  1. วนมุมจาก 0 ถึง 45
  2. สำหรับมุมปัจจุบันสำหรับทุกจุดตัวเลขให้คำนวณตำแหน่งใหม่หมุนได้
  3. ค้นหาขอบเขตของสี่เหลี่ยมผืนผ้าที่มีรูป (ต่ำสุดและสูงสุด x, y) และลงทะเบียนถ้ามันเป็นการจับคู่ที่ดีที่สุด
  4. มุมถัดไป

นี่เป็นวิธีการบังคับแบบเดรัจฉานและทำงานได้ดีและรวดเร็วสำหรับคนร่างเล็ก อย่างไรก็ตามฉันต้องทำงานกับตัวเลขที่มีมากถึง 10 ล้านคะแนนและอัลกอริทึมของฉันช้า

อัลกอริทึมที่ดีสำหรับปัญหานี้คืออะไร

คำตอบ:


20

ดูเหมือนว่าคุณสามารถหาชิดพลกล่อง bounding ขั้นต่ำโดยใช้เส้นเวลาหมุนขั้นตอนวิธีการวัดเส้นผ่าศูนย์กลาง

เมื่อคุณมีกล่องขอบคุณเพียงแค่ต้องกำหนดมุมของการหมุนโดยการคำนวณความชันของด้านใดด้านหนึ่ง


นี่เป็นทางออกที่ดีเยี่ยมดีมาก
InformedA

เยี่ยมมากเนื่องจากฉันได้เรียงคะแนนตาม x และ y แล้วฉันสามารถหาเปลือกนูนด้วยen.wikibooks.org/wiki/Algorithm_Implementation/Geometry/ …และใช้อัลกอริทึมที่มีอยู่กับคะแนนฮัลล์
Dusan

12

ขั้นตอนแรกของวิธีการของคุณนั้นมีข้อบกพร่อง - มีค่าจริงจำนวนไม่ จำกัดระหว่าง 0 ถึง 45 ดังนั้นจึงไม่มีเหตุผลที่จะ "วนซ้ำไปมา" อย่างไรก็ตามอัลกอริทึมของคุณสามารถซ่อมแซมได้:

  • หาตัวเรือนูนของรูปหลายเหลี่ยม

  • วนผ่านจำนวน จำกัด (!) ของมุมที่กำหนดโดยขอบด้านนอกของลำตัวนูน

  • ตอนนี้ใช้ขั้นตอนที่ 2 ถึง 4 โดยใช้มุมเหล่านี้

ใช้งานได้เพราะสามารถแสดงให้เห็นว่าสี่เหลี่ยมล้อมรอบต่ำสุดนั้นต้องแตะที่ขอบด้านนอกอันใดอันหนึ่งของฮัลล์นูน


ใช่นั่นคือสิ่งที่ฉันจะทำแล้วพบว่ามีความช่วยเหลือจากคำตอบของแดน ขอขอบคุณ.
Dusan

@Dusan: ฉันไม่แน่ใจว่าคำตอบอื่น ๆ อธิบายวิธีการเดียวกันดังนั้นฉันพยายามที่จะอธิบายวิธีการแก้ปัญหาในวิธีที่ง่ายกว่าหวังว่าจะชัดเจนขึ้นเล็กน้อย พบคำอธิบายได้ที่นี่: cgm.cs.mcgill.ca/~orm/maer.html
Doc Brown

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