0

画像から凹多角形(N> 3-ユーザーがこの値を入力するN点)を生成するアルゴリズムを探しています。

アルゴリズムに関する私の考え:

 // Every pixel in image is checked and a minimal orientated bounding box  is generated  (transparent pixels are ignored)
 boundingBox = createImageBoundingBox(image);
 curpoints = 4, A = 0, B = 1, tmppoints = curpoints;
 while(curpoints < maxNumberOfPoints)
 { 
    add a new point between point A and point B (A and B are points from the boundingBox)
    reposition points so that it will contain the minimal surface
    A++; B++;
    curpoints++;

    if(A == tmppoints) 
    { A = 0; B = 1; tmppoints=curpoints; }
 }  

私が直面している問題は、ポイントを最適に再配置する方法がわからないことです。これは他の方法で行うことができますか(より良い/より速い方法)。どんな考えでもいただければ幸いです。

ありがとう

編集:

画像は少なくとも10x10である必要があります。ユーザーが(最適化のために)使用されるポイントの数を調整できるように、Nポイントパラメーターが必要です。別の方法として、ポリゴンに必要な詳細(ポイント数)を示す係数(0-1)を設定します(0は4ポイント、> 0 5ポイント以上)。しかし、それを実装する方法がわかりません。

4

3 に答える 3

2

ドロネー三角形分割を使用して、平均エッジ長を取得できます。次に、平均よりも長いエッジを削除してみてください。コンセプトはアルファ形状からです。

于 2013-09-23T13:24:49.260 に答える
1

1.)正方形の画像の中央にある点を選択します。

2.)このポイントを中心からランダムにN回ジッターして、N個の新しいポイントを生成します。

3.)中心点からの最大角度に基づいてこれらの点を並べ替えます

4.)バウンディングボックス内の4つのポイントと中点を昇順で並べ替えて使用し、凹多角形の順序付きポイントリストを作成します。

上記の「極小曲面」の手順を理解しているかどうかはわかりませんが、このアルゴリズムは、画像を切り取って凹多角形を生成するために機能すると思います。これはあなたの上記よりも速いと思いますが、そのステップを完全に理解していないのでわかりません。

これにより、元の画像と同じ境界を持つ凹多角形が常に生成されます。これが不要な場合は、バウンディングボックスをジッターするステップ0.)を追加し、これに基づいて中点ジッターを変更します。これらのアイデアは両方とも、nサイズのポイントチャンクが取り出された境界四辺形になると思います。

  • これにはn>4が必要です(必要に応じてn> 3が必要な場合は、バウンディングボックスの2つを1つにまとめます)。
于 2012-04-27T19:28:15.943 に答える
1

凹面の船体はアルファ形状で構築できます。CGALリンク。

于 2012-04-28T02:57:39.533 に答える