त्रिकोण मैं इस पर समय के एक काफी राशि खर्च की है, मैं कैसे Voronoi पाने के लिए पर मेरे समाधान साझा करना चाहते हैं केवल किनारों के बजाय बहुभुज।
कोड https://gist.github.com/letmaik/8803860 पर है और tauran के समाधान पर विस्तारित है।
सबसे पहले, मैंने कोड को प्रतिबिंबित करने और सूचकांक (= किनारों) को अलग-अलग देने के लिए कोड बदल दिया, क्योंकि बिंदु निर्देशांक के बजाय सूचकांक पर काम करते समय कई गणनाओं को सरल बनाया जा सकता है।
फिर, voronoi_cell_lines
विधि में मैं निर्धारित करता हूं कि किन किनारों से संबंधित कोशिकाएं हैं। इसके लिए मैं संबंधित प्रश्न से Alink के प्रस्तावित समाधान का उपयोग करता हूं। यही है, प्रत्येक किनारे के लिए दो निकटतम इनपुट पॉइंट (= कक्ष) ढूंढते हैं और उस से मैपिंग बनाते हैं।
अंतिम चरण वास्तविक बहुभुज बनाने के लिए है (voronoi_polygons
विधि देखें)।सबसे पहले, किनारों को लटकने वाले बाहरी कोशिकाओं को बंद करने की आवश्यकता है। यह सभी किनारों को देखकर और यह जांचना जितना आसान है कि किसके पास केवल एक पड़ोसी किनारा है। या तो शून्य या दो ऐसे किनार हो सकते हैं। दो के मामले में, मैं फिर अतिरिक्त किनारे पेश करके इन्हें जोड़ता हूं।
अंत में, प्रत्येक सेल में अनियंत्रित किनारों को उनके द्वारा बहुभुज प्राप्त करने के लिए सही क्रम में रखा जाना चाहिए।
उपयोग है:
P = np.random.random((100,2))
fig = plt.figure(figsize=(4.5,4.5))
axes = plt.subplot(1,1,1)
plt.axis([-0.05,1.05,-0.05,1.05])
vertices, lineIndices = voronoi(P)
cells = voronoi_cell_lines(P, vertices, lineIndices)
polys = voronoi_polygons(cells)
for pIdx, polyIndices in polys.items():
poly = vertices[np.asarray(polyIndices)]
p = matplotlib.patches.Polygon(poly, facecolor=np.random.rand(3,1))
axes.add_patch(p)
X,Y = P[:,0],P[:,1]
plt.scatter(X, Y, marker='.', zorder=2)
plt.axis([-0.05,1.05,-0.05,1.05])
plt.show()
जो आउटपुट:
कोड शायद इनपुट अंक की बड़ी संख्या के लिए उपयुक्त नहीं है और कुछ क्षेत्रों में सुधार किया जा सकता। फिर भी, यह उन लोगों के लिए उपयोगी हो सकता है जिनके पास समान समस्याएं हैं।
बस इसे फिर से वापस आएं, एक शानदार जवाब, बहुत बहुत धन्यवाद! – EdwardAndo
+1। इस कोड के लिए धन्यवाद। 'ncross2' 'u' और' v' तर्क लेता है, लेकिन एक मान की गणना करता है जो केवल' ए 'और 'बी' पर निर्भर करता है। शायद 'ए' और' बी' को 'यू' और 'v' द्वारा प्रतिस्थापित किया जाना चाहिए? – unutbu
अनंतता के किनारों को ढूंढना convex_hull विशेषता का उपयोग करके बहुत आसान है। वांछित अगर मैं कोड पोस्ट कर सकते हैं। – meawoppl