สร้างรูปหลายเหลี่ยมจากชุดของเส้นที่ตัดกัน


10

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

ดังนั้นดังที่แสดงด้านล่างชุดของเส้นถูกแมป (พวกเขาถูกตัดทอนแล้ว BTW)
ขั้นตอนวิธีการ / ความคิดที่จะสร้างรูปหลายเหลี่ยม (เป็นคนสีแดงแสดง) ?

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


ขอบเขตด้านนอกของสี่เหลี่ยมเป็นที่รู้จักหรือถูกอ่านจากบรรทัดอินพุตด้วยหรือไม่
Devdatta Tengshe

คำตอบ:


5

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

ก่อนอื่นให้ดูผลลัพธ์ :
ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นสายการได้รับในรูปหลายเหลี่ยมที่สร้างขึ้นแสดงในleft middleเป็นรูปหลายเหลี่ยมจริงตามที่แสดงในright;)

สำหรับขั้นตอนวิธีรับด้านล่างที่เราใช้Shapelyแพคเกจในหลาม

  • เส้น ==> MultiLineString {:: M}
  • เพิ่มเล็ก ๆbufferพูดeps{:: MB}
  • ภูมิภาค ==> Polygon {:: P} (ภูมิภาคนี่คือจตุรัส)
  • P.difference(MB) {รูปหลายเหลี่ยมที่เกิดขึ้น}

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


4

JTS Topology Suiteมีคลาส Polygonizer ซึ่งค่อนข้างเป็นเช่นนี้

คุณสามารถดูซอร์สโค้ดได้ที่นี่และแปลงเป็น Python


ดังที่คำอธิบายรหัสบอกว่ามันจะไม่ทำงานอย่างที่คาดไว้โดยผู้เขียนคำถาม: "ขอบต้องได้รับการแก้ไขอย่างถูกต้องนั่นคือพวกเขาจะต้องพบกันที่จุดสิ้นสุดเท่านั้น Polygonizer จะทำงานบนอินพุตที่ไม่ถูกต้อง ขอบที่ไม่มีโค้ด "
Pablo

1
มีการดำเนินการภายใน JTS เพื่อแยกเส้นที่จุดยอดได้อย่างถูกต้อง บางที OP ก็สามารถดูได้เช่นกัน
Devdatta Tengshe

3

คุณอาจดูแพ็คเกจ Python Shapelyโดยเฉพาะรูปหลายเหลี่ยม ()


ทราบอย่างรวดเร็วว่าโพลิกอนในหุ่นดี ( from shapely.ops import polygonize) ใช้GEOS.PolygonizeจากGEOS ดังนั้นนี่คือลิงค์ที่มีลิงค์ไปยังลิงค์ ... : |
นักพัฒนา

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

2

นี่คือวิธีแก้ไขปัญหาอื่นที่เราสามารถหาได้

การใช้ DCELเราสามารถสร้างบล็อกจากเส้นที่สัมผัส

สำหรับงูหลามมีแพคเกจ{} ที่นี่ มันเป็นการนำไปปฏิบัติเล็ก ๆ ที่มีข้อบกพร่องบางอย่าง อย่างไรก็ตามด้วยความพยายามบางอย่างก็สามารถใช้สำหรับปัญหานี้ ยังทราบขั้นตอนต่อไปนี้:

ขั้นตอนการประมวลผลล่วงหน้าที่พบการแยกระหว่างบรรทัดทั้งหมด จากนั้นเส้นทั้งหมดจะถูกแบ่งออกเป็นส่วน ๆ ที่จุดปฏิสัมพันธ์ รายการจุดตัดและรายการของขอบที่เกี่ยวข้องเป็นสิ่งที่จำเป็นสำหรับ DCEL


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