นี่จะต้องใช้การคำนวณจำนวนมากโดยเฉพาะอย่างยิ่งหากคุณต้องการประมวลผลมากถึง 2000 คะแนน ฉันแน่ใจว่ามีคำตอบที่เหมาะสมที่สุดสำหรับการจับคู่รูปแบบนี้แล้ว แต่คุณต้องทราบว่ามันถูกเรียกเพื่อค้นหามัน
เนื่องจากคุณกำลังพูดถึงคลาวด์แบบจุด (ข้อมูลที่กระจัดกระจาย) แทนที่จะเป็นรูปแบบวิธีการข้ามสหสัมพันธ์ของฉันไม่ได้ใช้จริง ๆ (และจะยิ่งคำนวณได้แย่ลง) บางอย่างเช่น RANSAC อาจพบการแข่งขันได้อย่างรวดเร็ว แต่ฉันไม่รู้อะไรเกี่ยวกับมันมากนัก
ความพยายามของฉันในการแก้ปัญหา:
สมมติฐาน:
- คุณต้องการค้นหาคู่ที่ดีที่สุดไม่ใช่แค่การจับคู่ที่หลวมหรือ "อาจถูกต้อง"
- การจับคู่จะมีข้อผิดพลาดเล็กน้อยเนื่องจากเสียงรบกวนในการวัดหรือการคำนวณ
- จุดที่มาคือ coplanar
- แหล่งที่มาทั้งหมดต้องมีอยู่ในเป้าหมาย (= จุดที่ไม่ตรงกันใด ๆนั้นไม่ตรงกันสำหรับโปรไฟล์ทั้งหมด)
ดังนั้นคุณควรใช้ทางลัดจำนวนมากโดยตัดสิทธิ์สิ่งต่าง ๆ และลดเวลาในการคำนวณ ในระยะสั้น:
- เลือกสามจุดจากแหล่งที่มา
- ค้นหาผ่านจุดเป้าหมายค้นหาชุด 3 คะแนนด้วยรูปร่างเดียวกัน
- เมื่อพบการแข่งขัน 3 คะแนนให้ตรวจสอบจุดอื่น ๆ ทั้งหมดในระนาบที่พวกเขากำหนดเพื่อดูว่าพวกเขากำลังแข่งขันกันหรือไม่
- หากพบการแข่งขันมากกว่าหนึ่งจุดในทุกจุดให้เลือกรายการที่มีข้อผิดพลาดระยะทาง 3 มิติ
รายละเอียดเพิ่มเติม:
pick a point from the source for testing s1 = (x1, y1)
Find nearest point in source s2 = (x2, y2)
d12 = (x1-x2)^2 + (y1-y2)^2
Find second nearest point in source s3 = (x3, y3)
d13 = (x1-x3)^2 + (y1-y3)^2
d23 = (x2-x3)^2 + (y2-y3)^2
for all (x,y,z) test points t1 in target:
# imagine s1 and t1 are coincident
for all other points t2 in target:
if distance from test point > d12:
break out of loop and try another t2 point
if distance ≈ d12:
# imagine source is now rotated so that s1 and s2 are collinear with t1 and t2
for all other points t3 in target:
if distance from t1 > d13 or from t2 > d23:
break and try another t3
if distance from t1 ≈ d13 and from t2 ≈ d23:
# Now you've found matching triangles in source and target
# align source so that s1, s2, s3 are coplanar with t1, t2, t3
project all source points onto this target plane
for all other points in source:
find nearest point in target
measure distance from source point to target point
if it's not within a threshold:
break and try a new t3
else:
sum errors of all matched points for this configuration (defined by t1, t2, t3)
การกำหนดค่าใดก็ตามที่มีข้อผิดพลาดกำลังสองน้อยที่สุดสำหรับจุดอื่น ๆ ทั้งหมดจะเป็นการจับคู่ที่ดีที่สุด
เนื่องจากเราทำงานกับจุดทดสอบเพื่อนบ้านที่ใกล้ที่สุด 3 จุดการจับคู่เป้าหมายสามารถทำได้ง่ายขึ้นโดยการตรวจสอบว่าอยู่ในรัศมีหรือไม่ ตัวอย่างเช่นหากค้นหารัศมี 1 จาก (0, 0) เราสามารถตัดสิทธิ์ (2, 0) โดยยึดตาม x1 - x2 โดยไม่คำนวณระยะทางแบบยุคลิดจริงเพื่อเพิ่มความเร็วสักเล็กน้อย นี่ถือว่าการลบนั้นเร็วกว่าการคูณ มีการค้นหาที่ปรับให้เหมาะสมที่สุดตามรัศมีที่กำหนดโดยพลการมากขึ้นเช่นกัน
function is_closer_than(x1, y1, z1, x2, y2, z2, distance):
if abs(x1 - x2) or abs(y1 - y2) or abs(z1 - z2) > distance:
return False
return (x1 - x2)^2 + (y1 - y2)^2 + (z1 - z2)^2 > distance^2 # sqrt is slow
d= ( x1- x2)2+ ( y1- y2)2+ ( z1- z2)2----------------------------√
(พ.ศ. 2543)2)
ที่จริงแล้วเนื่องจากคุณจะต้องคำนวณสิ่งเหล่านี้ทั้งหมดไม่ว่าคุณจะพบการจับคู่หรือไม่และเนื่องจากคุณสนใจเฉพาะเพื่อนบ้านที่ใกล้ที่สุดสำหรับขั้นตอนนี้หากคุณมีหน่วยความจำมันอาจจะดีกว่าในการคำนวณค่าเหล่านี้ล่วงหน้า . บางสิ่งบางอย่างเช่น DelaunayหรือPitteway triangulationที่ทุกจุดในเป้าหมายเชื่อมต่อกับเพื่อนบ้านที่ใกล้ที่สุด จัดเก็บสิ่งเหล่านั้นไว้ในตารางจากนั้นค้นหาพวกมันในแต่ละจุดเมื่อพยายามปรับสามเหลี่ยมแหล่งที่มาให้ตรงกับหนึ่งในรูปสามเหลี่ยมเป้าหมาย
มีการคำนวณจำนวนมากที่เกี่ยวข้อง แต่มันควรจะค่อนข้างเร็วเนื่องจากมันใช้งานกับข้อมูลเพียงอย่างเดียวซึ่งเบาบางแทนที่จะเป็นศูนย์ที่ไม่มีความหมายจำนวนมากคูณเข้าด้วยกันเช่นการเชื่อมโยงข้ามของข้อมูลเชิงปริมาตร แนวคิดเดียวกันนี้จะใช้กับกรณี 2D หากคุณพบจุดศูนย์กลางของจุดก่อนและเก็บไว้เป็นชุดของพิกัด