python - मैं 2 डी बिंदु क्लाउड के अल्फा आकृति(अवतल पतवार) को कैसे प्राप्त करूं?



linux ubuntu (1)

मैं एक कार्यान्वयन की तलाश कर रहा हूं जो दो आयामों में अल्फा आकृतियों की गणना करता है। मैं उबुंटू चला रहा हूँ मैं इस कार्य के लिए एक कमांड लाइन उपयोगिता पसंद करता हूं, लेकिन एक अजगर लाइब्रेरी के साथ भी ठीक होगा।

Google में मुझे कई कार्यान्वयन मिले हैं जो अल्फा आकृतियों की गणना करते हैं। लेकिन इनमें से कोई भी नहीं जो मुझे चाहिए इनपुट के रूप में मेरे पास दो आयामी बिंदुओं की एक सूची है (उदाहरण के लिए, एक पंक्ति में प्रति पंक्ति एक जोड़ी एक टेक्स्ट फ़ाइल में है) उत्पादन के रूप में मुझे एक ही पैमाने के साथ दो आयामी बिंदुओं की एक और सूची चाहिए।

मैंने cgal के नवीनतम अजगर बाइंडिंग स्थापित करने का प्रयास किया है , लेकिन ये थोड़ी देर में समर्थित नहीं हैं और अब इसे उबंटू 11.04 पर संकलित नहीं किया गया है (मैं भी उबंटु 10.04 पर कोशिश कर रहा था और कोई भाग्य नहीं था)। क्लस्टर , एर्रॉन स्ट्रैप कॉप द्वारा फ़्लिकर पर विकसित एक प्रोजेक्ट भी उबंटू 11.04 पर संकलित नहीं होगा (संभवत: क्योंकि यह पुराने सीजीएल पुस्तकालयों से भी जुड़ा हुआ है)।

मैंने घंटी प्रयोगशालाओं में केन क्लार्कसन से इस कार्यान्वयन की भी कोशिश की। यह जो मुझे चाहिए, वह लगभग उत्पादन करता है, आउटपुट दूसरे पैमाने में लगता है और इसे ints में बदल जाता है।

मैंने डायोनिसस के अजगर बाइंडिंग की भी कोशिश की। ये संकलित है, लेकिन जब मैंने अपनी सूची के साथ fill_alpha2D_complex(points, f) समारोह को खिलाया, तो आउटपुट मुझे उम्मीद नहीं थी यह दो आयामी बिंदुओं की सूची नहीं थी, बल्कि एक "दृढ़ आरेख" लगता है मुझे नहीं पता कि इसका अर्थ क्या है।

किसी को भी इस समस्या का एक सरल समाधान पता है?

अद्यतनः मैं अल्फा आकृति से संबंधित अंक मुद्रित करना चाहता हूं जहां यह अब और नहीं जोड़ा जा रहा है। मुझे लगता है कि इसका मतलब है "मुझे छोटी अल्फा मान से जुड़े अंक दें, जैसे आकार जुड़ा हुआ है।"

अद्यतित मुझे अब पता चला है कि कैन क्लार्कसन के कार्यान्वयन से मैं क्या चाहता हूं और डायनोसस कार्यान्वयन से (अधिक या कम मुझे क्या चाहिए) क्लार्कसन का कार्यान्वयन सही काम कर रहा था, यह केवल बिंदुओं (डायनोसस के साथ एक ही कहानी) के बजाय अंक के सूचकांक को आउटपुट करता था, और मुझे कुछ वैकल्पिक झंडे सही करने की आवश्यकता थी आवरण जो मैंने लिखा है वह नीचे है यह समाधान आदर्श है क्योंकि यह एक अल्फा आकृति का उत्पादन करता है जो दोनों जुड़ा हुआ है और छेद नहीं है। अल्फा स्वचालित रूप से सेट है दूसरी ओर, डाइनाइसस, अल्फा के इन मूल्यों को स्वचालित रूप से नहीं खोजता है। प्लस क्लार्कसन के कार्यान्वयन को आकार की एक पीएस छवि (-एफ़एक्स फ्लैग के साथ) में आउटपुट करने के लिए सेट किया जा सकता है। जीसीसी के गैर-प्राचीन संस्करण को संकलित करने के लिए क्लार्कसन का कोड प्राप्त करने के लिए, आपको यहां उल्लिखित चरण का पालन करना होगा। निम्न कोड का प्रयोग पुस्तकालय के रूप में या अकेले खड़े आवरण के रूप में किया जा सकता है:

#!/usr/bin/python -O

import sys, os
import subprocess
import tempfile

hull_path = "./hull.exe"

def get_alpha_shape(points):
    # Write points to tempfile
    tmpfile = tempfile.NamedTemporaryFile(delete=False)
    for point in points:
        tmpfile.write("%0.7f %0.7f\n" % point)
    tmpfile.close()

    # Run hull
    command = "%s -A -m1000000 -oN < %s" % (hull_path, tmpfile.name)
    print >> sys.stderr, "Running command: %s" % command
    retcode = subprocess.call(command, shell=True)
    if retcode != 0:
        print >> sys.stderr, "Warning: bad retcode returned by hull.  Retcode value:" % retcode
    os.remove(tmpfile.name)

    # Parse results
    results_file = open("hout-alf")
    results_file.next() # skip header
    results_indices = [[int(i) for i in line.rstrip().split()] for line in results_file]
#    print "results length = %d" % len(results_indices)
    results_file.close()
    os.remove(results_file.name)

    return [(points[i], points[j]) for i,j in results_indices]

if __name__ == "__main__":
    points = [tuple([float(i) for i in line.rstrip().split()]) for line in sys.stdin]
    for point_i, point_j in get_alpha_shape(points):
        sys.stdout.write("%0.7f,%0.7f\t%0.7f,%0.7f\n" % (point_i[0], point_i[1], point_j[0], point_j[1]))
    sys.exit(0)

मैं इसे डायोनिसस डॉक्स में मिला जो आपको अल्फा आकार दे सकता है:

complex = Filtration()
fill_alpha2D_complex(points, complex)
alphashape = [s for s in complex if s.data[0] <= .5]

फिर मेरा विश्वास है कि आपको कुछ करना चाहिए:

for simplex in alphashape:
    print [v for v in simplex.vertices]




computational-geometry