เรียงลำดับเมฆตามจุดที่เกี่ยวกับตาข่ายที่ไม่มีโครงสร้างของเซลล์ hexahedral


11

คำถาม

คุณจะจัดเรียงคะแนนเมฆอย่างไรเทียบกับตาข่ายที่ไม่มีโครงสร้างของเซลล์รูปหกเหลี่ยม?

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

ผล

ฉันได้ถามไปแล้วและค้นหาจากวรรณกรรม:

ถ้าตาข่ายเป็นรูปหกเหลี่ยมและไม่มีโครงสร้างปัญหาจะลดลงเป็นการค้นหาช่วงมุมฉาก เพื่อจุดประสงค์นี้ต้นไม้ kd มักจะใช้ หากมีการปรับปรุงตาข่ายตามโครงสร้างข้อมูลแปดตัวอัลกอริทึมการค้นหาช่วงสามารถสร้างขึ้นรอบ ๆ มัน เป้าหมายคือเพื่อหลีกเลี่ยงการจัดการกับเรขาคณิตตาข่ายโดยตรงและมุ่งเน้นไปที่จุดเมฆความสัมพันธ์เมฆ A - จุด B. เมฆจุด A: จุดสอบถามเมฆจุด B: ศูนย์เซลล์ตาข่าย


คุณสามารถอธิบายสิ่งที่คุณหมายถึงเมื่อพูดว่า "เรียงลำดับด้วยความเคารพตาข่าย (ชนิดใด ๆ )"? คุณกำลังมองหาอัลกอริทึม binning (มีกี่จุดในแต่ละเซลล์)
Szabolcs

ฉันไม่เข้าใจคำถามของคุณค่อนข้างชัดเจนเป้าหมายของการเรียงลำดับคะแนนคืออะไร ชอบทำตาข่ายให้เป็นปกติมากกว่าไหม?
Shuhao Cao

มีเมฆแยกจุดกระจายอยู่ทั่วทั้งตาข่ายเสียงที่ไม่มีโครงสร้าง ฉันต้องการสื่อสารข้อมูลจากศูนย์เซลล์ไปยังคลาวด์พอยต์และในทางกลับกัน
tmaric

1
@ tomislav-maric: คุณช่วยเขียนคำตอบของคุณเป็นคำตอบแล้วยอมรับคำตอบของคุณเองได้ไหม? โดยทั่วไปขั้นตอนนี้เป็นวิธีปฏิบัติที่ได้รับการยอมรับในการตอบคำถามของคุณอย่างมีประสิทธิภาพแทนที่จะเพิ่มแท็ก "[แก้ไข]" ในคำถาม นอกจากนี้ยังทำให้คุณได้รับชื่อเสียงมากขึ้นเนื่องจากผู้คนสามารถโหวตคำตอบของคุณได้
Geoff Oxberry

คำตอบ:


8

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


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

Mathematica เป็นสิ่งที่ฉันรู้ดังนั้นฉันจะแสดงวิธีทำใน Mathematica แต่วิธีนั้นสามารถส่งไปยังระบบอื่นได้ ความคิดคือโครงตาข่ายหกเหลี่ยมเป็นสองเท่าของสามเหลี่ยม: มันสามารถสร้างเป็นแผนภาพ Voronoi ของจุดในการจัดเรียงสามเหลี่ยม จุดจากคลาวด์นั้นเป็นของรูปหกเหลี่ยมที่กำหนดถ้ามันอยู่ใกล้กับจุดศูนย์กลางของรูปหกเหลี่ยมนั้นมากกว่าจุดศูนย์กลางของรูปหกเหลี่ยมอื่น ๆ

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


มาสร้างตาข่ายกัน นี่คือสามเหลี่ยมตาข่าย:

pts = Join @@ Table[{x, Sqrt[3] y}, {x, 0, 4}, {y, 0, 2}];

points = Join[pts, TranslationTransform[{1/2, Sqrt[3]/2}] /@ pts];

Needs["ComputationalGeometry`"]
PlanarGraphPlot[points, LabelPoints -> False]

กราฟิกทางคณิตศาสตร์

คู่ของมันคือหนึ่งในหกเหลี่ยมที่เราสนใจ:

DiagramPlot[points, LabelPoints -> False]

กราฟิกทางคณิตศาสตร์

สิ่งนี้จะสร้างฟังก์ชันnfซึ่งค้นหาดัชนีของจุดศูนย์กลางหกเหลี่ยมที่จุดคลาวด์บางจุดอยู่ใกล้ที่สุด มันเป็นกุญแจสำคัญในวิธีการ:

nf = Nearest[N[points] -> Range@Length[points]];

ตอนนี้เรามาสร้างคลาวด์ด้วยคะแนนสุ่ม 1,000 คะแนนแล้วเรียงลำดับด้วยnf:

cloud = RandomReal[{-1/2, 5}, {1000, 2}];

indices = First /@ nf /@ cloud;

indicesมีดัชนีของศูนย์ที่แต่ละจุดคลาวด์ใกล้เคียงที่สุด นี่คือข้อมูลที่เราต้องการ ตอนนี้เราสามารถสร้างฮิสโตแกรมได้จากพวกเขา ...

Histogram[indices]

กราฟิกทางคณิตศาสตร์

... หรือสีแต่ละสี ...

Show[
 DiagramPlot[points, LabelPoints -> False],
 Graphics@MapThread[{ColorData[3][#1], Point[#2]} &, {indices, cloud}],
 PlotRange -> All, AspectRatio -> Automatic
 ]

กราฟิกทางคณิตศาสตร์

... หรือการสร้างภาพข้อมูลที่เราต้องการ

tally = Tally[indices];

ListDensityPlot[Join[points, List /@ Sort[tally][[All, 2]], 2], 
 InterpolationOrder -> 0, 
 Epilog -> (Text[#2, points[[#1]]] & @@@ tally), 
 PlotRange -> {{-.5, 5}, {-.5, 5}}, Mesh -> All, 
 ColorFunction -> (ColorData["BeachColors"][1 - #] &)]

กราฟิกทางคณิตศาสตร์


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


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

k

อย่าลบทิ้งอย่างแน่นอนบางคนอาจพบว่ามีประโยชน์! :) มันอาจกลายเป็นมุ้ยเพื่อแก้ปัญหามันเป็นเพียงว่าฉันยังไม่สามารถยอมรับได้จนกว่าฉันจะอ่านเกี่ยวกับเรื่องนี้
tmaric

และขอบคุณสำหรับคำตอบอย่างละเอียดถ้าฉันทำได้ฉันจะให้คะแนนมากกว่านี้! :)
tmaric

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