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