多角形は 2 つのリストで表されます。リストxs
には x 座標が降順で含まれます。各 x 値について、list 内の対応する要素regions
はスライスのリストです。各スライスは、ポリゴンの内部に属する範囲を示します。x 値ごとに、スライスは昇順で並べ替えられます。
fill
Matplotlib の関数を使用して、塗りつぶされたポリゴンを描画したいと考えています。この関数では、ポイントからポイントへの移動がポリゴンの輪郭を表すように、ポイントを順序付けする必要があります。データ セット内のポイントを並べ替えて正しいポリゴンを取得するにはどうすればよいですか?
これは私が持っているデータの種類の例です。
xs = range(10, 0, -1)
regions = [[slice(0, 3)],
[slice(0, 4), slice(5.2, 5.8)],
[slice(1, 5), slice(5.4, 5.8)],
[slice(1.3, 6)],
[slice(1.8, 6)],
[slice(1.9, 3), slice(3.1, 6.1)],
[slice(2, 2.9), slice(3.2, 5), slice(6, 6.2)],
[slice(2.1, 2.7), slice(3.4, 5.1), slice(5.9, 6.3)],
[slice(3.5, 5.2), slice(5.7, 6.4)],
[slice(3.8, 5.3), slice(5.8, 6.1)]]
ポイントの正しい並べ方は次のとおりです。
xx = [10, 9, 8, 7, 6, 5, 4, 3, 3, 4, 5, 5, 4, 3, 2, 1,
1, 2, 3, 4, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8,
9, 9, 8, 8, 9, 10]
yy = [0, 0, 1, 1.3, 1.8, 1.9, 2, 2.1, 2.7, 2.9, 3, 3.1,
3.2, 3.4, 3.5, 3.8, 5.3, 5.2, 5.1, 5, 6, 5.9, 5.7,
5.8, 6.1, 6.4, 6.3, 6.2, 6.3, 6, 6, 5.8, 5.8, 5.2,
5.4, 5, 4, 3]
図はそのように見えるはずです
これまでのところ、ターニング ポイント、つまり輪郭が方向を変える x 値を定義してみました。numpy.diff
これは、各 x 値のスライス数を含む配列に適用することで実行できます。差がゼロでない場合、その x 値はターニング ポイントです。これはおそらく次のポイントを把握するために使用できます。難しいのは、次のスライスがどれであるか、およびスライスの開始または終了のどちらを使用するかを判断することです。
この質問は似ていますが、私の場合、ポリゴンははるかに複雑な形状をしています。一方、ポリゴンの内部にあるものについての情報はあります。
編集
述べられている問題には、常に独自の解決策があるとは限らないことに気付きました。たとえば、上記の例の点のセットも解を認めます。
xx = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 5,
4, 3, 3, 4, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8,
9, 9, 8, 8, 9, 10]
yy = [0, 0, 1, 1.3, 1.8, 1.9, 2, 2.1, 3.5, 3.8, 5.3, 5.2,
2.7, 2.9, 3, 3.1, 3.2, 3.4, 5.1, 5, 6, 5.9, 5.7,
5.8, 6.1, 6.4, 6.3, 6.2, 6.1, 6, 6, 5.8, 5.8, 5.2,
5.4, 5, 4, 3]
私が探している解決策は、各エッジの勾配の絶対値を最小化するものです (垂直セグメントは別として)。上記の例では、これは最初のソリューションに対応します。