ค้นหาพิกัดพิกัดจากชุดพิกัดจุดที่กำหนดหรือไม่


18

ให้ชุดของพิกัดเราจะหาพิกัดขอบเขตได้อย่างไร
ชุดพิกัด <== รูปที่ 1
กำหนดพิกัดในชุดด้านบนฉันจะรับพิกัดบนขอบเขตสีแดงได้อย่างไร Boundary เป็นรูปหลายเหลี่ยมซึ่งเกิดจากพิกัดอินพุตสำหรับจุดยอดในลักษณะที่ทำให้พื้นที่นั้นขยายใหญ่สุด

ฉันทำงานในแอปซึ่งค้นหาคุณสมบัติภายในไมล์ 'x' ของเมือง สิ่งที่ฉันมีคือ:

  1. พิกัดของคุณสมบัติทั้งหมด
  2. ชุดของพิกัดสำหรับแต่ละเมือง (ฉันมีหนึ่งพิกัดสำหรับแต่ละ zip และเนื่องจากเมืองส่วนใหญ่มีมากกว่าหนึ่ง zip ทุกเมืองจะมีชุดของพิกัด)

เหตุผลที่ฉันขอพื้นที่สูงสุดคือเพื่อที่ฉันจะได้ไม่เกิดรูปหลายเหลี่ยมเหมือนที่อยู่ด้านล่าง:

รูปหลายเหลี่ยมคดเคี้ยว <== รูปที่ 2

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



4
ไม่ไม่ซ้ำกันนี่คือฮัลล์นูนไม่เว้า
Nicklas Avén

1
คุณกำลังมองหารหัสการอ้างอิงเชิงทฤษฎีหรือการแก้ปัญหาในสภาพแวดล้อมซอฟต์แวร์ที่มีอยู่เฉพาะหรือไม่?
WolfOdrade

1
@Khaja ไม่คุณไม่ต้องการเพิ่มพื้นที่ให้มากที่สุดคุณต้องการย่อให้เล็กที่สุดในบรรดารูปหลายเหลี่ยมนูนที่มีจุด (วิธีเดียวในการขยายพื้นที่ให้ใหญ่ที่สุดคือใช้ทั้งโลกเป็นรูปหลายเหลี่ยมที่มีอยู่)
whuber

1
@whuber ใช่ตอนนี้ฉันเห็นสิ่งที่คุณหมายถึงฉันต้องการรูปหลายเหลี่ยมนูนที่มีพื้นที่น้อยที่สุด เป้าหมายสูงสุดของฉันคือการค้นหาใกล้เคียง วิธีที่เราต้องการให้การค้นหาใกล้เคียงของเราทำงานคือ: ในเมืองที่ระบุ (ตัวเรือนูน) หากเราค้นหาบ้าน (แต่ละบ้านมีพิกัด) ภายใน "x" ไมล์มันควรให้บ้านทั้งหมดที่อยู่ภายใน ฮัลล์นูน หรือ อยู่ในระยะ orthogonal น้อยกว่า "x" ไมล์
Khaja Minhajuddin

คำตอบ:


21

มีอัลกอริทึมมากมายในการแก้ปัญหานี้ ( Wikipedia "Convex_hull_algorithms" ):

  • การห่อของขวัญอาคาจาร์วิสมีนาคม - O (nh):หนึ่งในอัลกอริทึมที่ง่ายที่สุด มันมีความซับซ้อนของเวลา O (nh) โดยที่ n คือจำนวนคะแนนในเซตและ h คือจำนวนคะแนนในตัวถัง ในกรณีที่เลวร้ายที่สุดความซับซ้อนคือ O (n2)
  • Graham scan - O (n log n):อัลกอริธึมที่ซับซ้อนกว่าเล็กน้อย แต่มีประสิทธิภาพมากกว่า หากคะแนนถูกเรียงตามพิกัดแล้วหรือตามมุมหนึ่งไปยังเวกเตอร์ที่ตายตัวแล้วอัลกอริทึมจะใช้เวลา O (n) [ หลอกรหัส ]
  • QuickHull:เช่นเดียวกับอัลกอริทึม quicksort มันมีความซับซ้อนของเวลาที่คาดหวังของ O (n log n) แต่อาจแย่ลงถึง O (nh) = O (n2) ในกรณีที่เลวร้ายที่สุด [ คำอธิบายภาพประกอบ ]
  • หารและพิชิต - O (n log n):อัลกอริทึมนี้สามารถใช้ได้กับกรณีสามมิติ
  • Monotone chain - O (n log n):ตัวแปรของการสแกน Graham ซึ่งเรียงลำดับคะแนนตามช่วงเวลา เมื่ออินพุตถูกเรียงลำดับแล้วอัลกอริทึมจะใช้เวลา O (n)
  • อัลกอริทึมฮัลล์นูนที่เพิ่มขึ้น - O (n log n)
  • การแต่งงานก่อนพิชิต - O (n log h):อัลกอริทึมที่ไวต่อการส่งออกที่เหมาะสมที่สุด
  • อัลกอริทึมของ Chan - O (n log h):อัลกอริทึมที่ไวต่อการส่งออกที่ดีที่สุดที่ง่ายขึ้น

ขอบคุณสำหรับรายชื่อ @underdark เหล่านี้ ... คุณเลือกอันไหน
Marin



3

สิ่งที่คุณต้องการคือตัวเรือนูน ใน PostGIS มีฟังก์ชั่น (ที่จริง GEOS) ที่ช่วยให้คุณเรือนูน, ST_ConvexHull (เรขาคณิต)

ที่วิกิพีเดียมีข้อมูลมากมายเกี่ยวกับตัวเรือเว้า


1

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

คุณจะสามารถเพิ่มความเร็วในการติดตามได้โดยการโยนเส้นตัดกันก่อน ขอบเขตภายนอกจะไม่มีทางแยก

btw - FME จะทำเช่นนี้กับหม้อแปลง ConvexHullAccumulator หรือ ConvexHullReplacer!


1

หากคุณสนใจที่จะดูอัลกอริทึมที่มีอยู่ที่ใช้ในโค้ด NetTopologySuite มีอัลกอริทึมในการทำเช่นนี้

ดูConvexHull.cs

อนึ่ง NTS และห้องสมุดอื่น ๆ ถูกรวมอยู่ในโครงการเจ๋ง ๆ ชื่อ DotSpatial ซึ่งอยู่ที่นี่

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