การสั่งซื้อชุดของจุดที่ไม่มีการรวบรวมกันตามแนวโค้ง


9

ฉันมีชุดของคะแนน 3 มิติ (ซึ่งฉันกู้คืนจากห้องสมุดที่ดำเนินการ tessellation ของร่างกายที่เป็นของแข็ง) ที่เป็นของเส้นโค้ง (เช่นขอบของของแข็ง) นั่นหมายความว่าเส้นโค้งผ่านแต่ละจุดเหล่านี้อย่างแน่นอน

อย่างไรก็ตามชุดจุดไม่ได้เรียงลำดับดังนั้นฉันจำเป็นต้องเรียงลำดับเพื่อให้สามารถวาดเส้นโค้งนี้ได้อย่างถูกต้อง

มีวิธีใดที่ทราบสำหรับปัญหาประเภทนี้หรือไม่

ข้อมูลเพิ่มเติมบางส่วน:

  • เส้นโค้งเป็นพารามิเตอร์ทั่วไป (เส้นโค้ง / bezier ชิ้นวงกลม .. )
  • คะแนนจะได้รับเป็นพิกัดจุดลอย
  • คะแนนอัดแน่นมาก (แต่พวกมันอาจหนาแน่นได้ตามที่ฉันต้องการ) เพื่อให้ความคิดแก่คุณสำหรับเส้นโค้งที่มี 19 หน่วยใน x, 10 หน่วยใน x และ 5 หน่วยใน z ผมพูดลำดับของจุดในส่วนของเส้นโค้ง: (20.7622, ​​25.8676, 0) (20.6573, 25.856, 0) (20.5529, 25.8444, 0) (20.4489, 25.8329, 0) (20.3454, 25.8213, 0)

แม้ว่าเราจะรู้ว่าคำสั่งมีจนกระทั่งจำนวนของเส้นโค้งที่ไม่สิ้นสุดที่พอดีกับจุดราง แม้ว่าเราจะเพิ่มข้อ จำกัด เพิ่มเติมจุดสิ้นสุดที่เปิดนั้นเป็นปัญหาเนื่องจากการวางแนวสัมผัสของพวกมันอาจเป็นการกำหนดเองโดยพลการ ภาพที่นี่
joojaa

@joojaa ใช่คุณพูดถูก แต่เนื่องจากการบรรจุคะแนนมีความหนาแน่นสูงมากฉันจึงไม่คาดหวังว่ามันจะแน่นอน ถ้าฉันได้รับลำดับที่ถูกต้องฉันวางแผนที่จะเชื่อมต่อลำดับของคะแนนเป็นรูปหลายเหลี่ยม
andrea.al

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

@ MartinBüttnerใช่ฉันมีสิทธิ์เข้าถึงรูปแบบพารามิเตอร์ของเส้นโค้งหากจำเป็น
andrea.al

1
กรุณาแสดงชุดจุดทั่วไป!
Yves Daoust

คำตอบ:


6

คุณมีปัญหาที่เรียกว่าการสร้างเส้นโค้งใหม่จากจุดที่ไม่มีการรวบรวมกัน ตอนนี้คุณรู้แล้วว่าจะค้นหาอะไรคุณจะพบวิธีการมากมายเช่นเปลือกโลก NN-crust ฯลฯ นี่คือลิงค์ไม่กี่:

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


4

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

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

  • กำหนดเพื่อนบ้านที่ใกล้ที่สุดสองจุดแต่ละจุด นั่นคือO(nlogn)การทำงาน
  • คุณจะต้องทำการดูแลเป็นพิเศษสำหรับจุดสิ้นสุด เพื่อนบ้านสองคนที่ใกล้ที่สุดจะเป็นจุดสองจุดถัดไปตามโค้งแทนที่จะเป็นหนึ่งในแต่ละด้าน คุณสามารถตรวจจับฮิวริสติกเหล่านี้ได้หากอัตราส่วนของระยะทางต่อเพื่อนบ้านทั้งสองนั้นแตกต่างกันมากกว่าเกณฑ์บางอย่าง (1.5 พูดขึ้นอยู่กับความนุ่มนวลของเส้นโค้งของคุณและความหนาแน่นของจุดต่าง ๆ ) หรือคุณสามารถปฏิบัติต่อข้อมูลเพื่อนบ้านที่ใกล้ที่สุดของคุณเป็นกราฟซึ่งคุณจะพบว่าจุดสิ้นสุดของเพื่อนบ้านทั้งสองชี้ไปที่กันและกัน (ซึ่งไม่ควรเกิดขึ้นที่อื่นในกราฟ)
  • ตอนนี้คุณสามารถเลือกจุดสิ้นสุดหนึ่งจุดแล้วเดินไปตามเพื่อนบ้านที่ใกล้ที่สุด (เลือกจุดที่คุณไม่ได้เดินทางมา) เพื่อสำรวจจุดต่างๆตามโค้ง

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


3

เนื่องจากคุณได้รับคะแนนเป็นทศนิยมเท่านั้นจึงไม่รับประกันว่าสิ่งเหล่านี้จะยังคงอยู่บนเส้นโค้งเนื่องจากข้อผิดพลาดในการปัดเศษ ดังนั้นฉันคิดว่าวิธีการทั่วไปเพียงอย่างเดียวคือประมาณว่าอยู่บนเส้นโค้งโดยหาจุดที่ใกล้ที่สุดบนเส้นโค้งกับตัวอย่างของคุณ(X,Y,Z). เช่นถ้าเส้นโค้งตัวแปรของคุณเป็น(x(t),y(t),z(t)) จากนั้นคุณสามารถลองย่อเล็กสุด

(Xx(t))2+(Yy(t))2+(Zz(t))2

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

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

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