web-dev-qa-db-ja.com

Python凹紙hull Polygon)

私はpython環境の船体問題の実装を探しています。私の問題は、一連の点を持っていませんが、結果の凹んちんがラインに沿っておおよそバインドされている一連の行があります。 Left: Input, Right: Output

私は単一の「正しい答え」がないことを理解しています。しかし、私のニーズにはいくつかの近似値が十分になります。 1つの可能な解決策は、各行を取り、それを20ポイント20ポイントと言う範囲に補間し、作成されたすべてのポイントの凹んちんを見つけることです。それについてはわからない。

編集:

ラインは、hullがclearを作成し、見つけやすくすることができます。

たとえ行を使用しない場合でも、良いpython実装(ポイントリストから凹紙を見つけるだけ)も役立ちます。

7
user972014

これはあなたの亜Questionの答えです:

たとえ行を使用しない場合でも、良いpython実装(ポイントリストから凹紙を見つけるだけ)も役立ちます。

あなたは alphashape を使用することができます。トリッキーな部分はあなたのニーズに合ったalphaを選ぶことです。 Alphashape最適なアルファ値を見つける関数が付属しています。 基本的に それは_0_(=凸包で始まり)から始まり、ポイントが失われるまでアルファを増やします。この最適価値から、私たちは95%を取ります。これはもちろん恣意的な解決策ですが、多くの場合あなたに良い近似値を与えるでしょう。

_import alphashape
import matplotlib.pyplot as plt
from descartes import PolygonPatch

points = [(17, 158),(15, 135),(38, 183),(43, 19),(93, 88),(96, 140),(149, 163),(128, 248),(216, 265),(248, 210),(223, 167),(256, 151),(331, 214),(340, 187),(316, 53),(298, 35),(182, 0),(121, 42)]

alpha = 0.95 * alphashape.optimizealpha(points)
hull = alphashape.alphashape(points, alpha)
hull_pts = hull.exterior.coords.xy

fig, ax = plt.subplots()
ax.scatter(hull_pts[0], hull_pts[1], color='red')
ax.add_patch(PolygonPatch(hull, fill=False, color='green'))
_

enter image description here

1つの可能な解決策は、各行を取り、それを20ポイント20ポイントと言う範囲に補間し、作成されたすべてのポイントの凹んちんを見つけることです。

これはあなたに凹殻があなたに望ましい出力を与えません。凹殻はこれらの追加の(偽の)ポイントに従ってそれが元のポイントであることができるよりも凹面になるでしょう。
[。]私は、問題全体の最善の解決策は、optimizealphaから入手した最適なアルファのためのポイントの凹殻で始まり、それからあなたのhullがあなたのいずれも交差するまでそれを減らすことです。 @Sgillenによって提案された線。これは、テストany([polygon.crosses(line) for line in lines])のバイセクションループを使用して最適なアルファを見つけると同様に行うことができます。

2
Stef

これは、Pythonを使用している点のセットの凹んで覆われたhullを見つけるための Fine Blog Post (そして関連付け github repo )です。

あなたへの私の勧告は次のとおりです。各行のエンドポイントを使用して一連の点を作成します。次に、リンクにリンクされたコードを使用して、これらのポイントの凹ハルを生成します。これが完了すると、生成された船体がのいずれかと交差しているかどうかを確認できます。あなたはあなたが好きなら交差点と調整を確認することができます。

あなたのポイントにあなたの行の中点を追加することを試みることもできます、それはあなたが試す必要があるアルファスの数を減らすかもしれません。

2
sgillen