2011-07-26 18 views
17

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

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

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

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

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

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

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

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

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

तो मैं आप की जरूरत का मानना ​​है:

#!/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) 
+1

अंक की केवल एक सूची अल्फा आकार का वर्णन नहीं कर सकती है, क्योंकि यह भी आवश्यक रूप से कनेक्ट नहीं है। –

+0

मैं बस एक बिंदु बादल की एक अच्छी सीमा चाहते हैं। लेकिन अगर यह विवरण सटीक नहीं है तो सवाल में मेरा अपडेट देखें। – conradlee

+0

एक कनेक्टेड अल्फा आकार अभी भी बहुत अच्छा नहीं हो सकता है, यानी छेद शामिल हैं। –

उत्तर

3

मैं Dionysus डॉक्स जो आप अल्फा आकार दे सकता है में this पाया: निम्नलिखित कोड एक पुस्तकालय के रूप में या एक अकेले खड़े आवरण के रूप में इस्तेमाल किया जा सकता कुछ ऐसा करने के लिए:

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

जो टुपल्स की एक लंबी सूची प्रिंट करता है। अधिकांश टुपल्स में एक सदस्य होता है, कुछ में दो या तीन होते हैं। इन tuples के लगभग पांच हजार हैं, भले ही मेरे मूल इनपुट में लगभग एक हजार अंक शामिल थे। इसके बजाय, मैं दो आयामी बिंदुओं की एक सूची की उम्मीद कर रहा था जिसमें इनपुट से कम सदस्य थे। – conradlee

+0

डायोनियस के लेखक से कुछ स्पष्टीकरण के बाद, मैंने निष्कर्ष निकाला है कि यह उत्तर सही है। प्रत्येक tuples में पूर्णांक अंक के सूचकांक हैं। दो सदस्यों के साथ tuples किनारों हैं, तीन के साथ त्रिकोण हैं। ".5" अल्फा का मान है। अल्फा के सबसे छोटे मूल्य को निर्धारित करने का एक तरीका है जिससे परिणामी आकार जुड़ा हुआ हो। यदि मेरे पास समय है, तो मैं इस कोड को प्रश्न में रखूंगा। – conradlee

+0

ठीक है, मैंने इसे पोस्ट किया है। अंत में मैं समाधान में उल्लिखित कारणों (जो मैंने प्रश्न में जोड़ा है) के कारण डायोनियस पर "हल" के लिए गया था। – conradlee

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^