python長條圖 - python點圖



我怎樣才能找到二維點雲的α形(凹形)? (1)

我在dionysus docs中找到了這個可能會給你alpha形狀的東西:

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]

我正在尋找一個計算二維的alpha形狀的實現。 我正在運行的Ubuntu。 我更喜歡這個任務的命令行工具,但也可以用python庫。

在Google中,我發現了很多計算alpha形狀的實現。 但是他們沒有一個輸出我想要的。 作為輸入,我有一個二維點列表(例如,文本文件中每行一對浮點數)。 作為輸出,我想要有相同比例的二維點的另一個列表。

我已經嘗試安裝cgal的最新python綁定,但是這些在一段時間內不被支持,並且不再在Ubuntu 11.04上編譯(我也在Ubuntu 10.04上試過了,沒有運氣)。 Clustr ,由Aaron Straup Cope在flickr開發的一個項目也不能在Ubuntu 11.04上編譯(可能是因為它也與舊的CGAL庫綁定)。

我也在貝爾實驗室嘗試了Ken Clarkson的這個實現 。 它幾乎輸出我想要的,輸出似乎在另一個規模,它變成了整數。

我也嘗試了dionysus的python綁定。 這些編譯,但是當我用fill_alpha2D_complex(points, f)函數fill_alpha2D_complex(points, f)我的列表時,輸出結果並不是我所期望的。 這不是一個二維點的列表,而是似乎是一個“持久性圖”,我不知道這是什麼意思。

任何人都知道這個問題的簡單解決方案?

更新:我想打印出與Alpha形狀相關的點,它們處於不再連接的邊緣。 我認為這意味著“給我與最小的阿爾法值關聯的點,使形狀連接”。

更新我現在發現如何得到我想從肯克拉克森 的實現,以及(或多或少我想要的)從dionysus實現 。 Clarkson的實現是正確的,它只是輸出點的索引而不是點(與狄奧尼索斯相同的故事),我需要得到一些可選的標誌。 我寫的包裝是下面。 這個解決方案是理想的,因為它產生了一個連接的並且不包含孔的alpha形狀。 Alpha會自動設置。 另一方面,狄奧尼索斯不會自動發現這個alpha值。 另外,可以將Clarkson的實現設置為輸出形狀的ps圖像(使用-afps標誌)。 為了讓Clarkson的代碼能夠與GCC的非古代版本進行編譯,您需要按照此處列出的步驟進行操作。 以下代碼可以用作庫或獨立包裝器:

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




computational-geometry