2009-03-24 7 views
1

私は、頂点が0..n-1の(凸状の)ポリゴンを持っているとしましょう。私はこのポリゴンを、例えば頂点iとjの間で半分に分割したいと思っています。頂点iと頂点jは両方のポリゴンに現れます。STLベクトルを分割する

私が知る限り、2つのケースしかありません。 1つはi < j、またはi> jのときです。私はjと決して等しくない(それらは今までには隣接していない)。

私はvector<Point> polyのような頂点を保存しています。 Pointは、2つの倍数xyを持つ単なる基本的な構造体であり、ポイントはCCW順にインデックスされていると仮定できます。

の場合、iからj(両端を含む)の頂点を1つのベクトルにコピーし、次にjからn-1を加えて0からiを別のベクトルにコピーするだけです。あるいは、その逆の場合は、そうですか?

ここで(J == closestIndexを聞かせて)私が使用しているが、権利を動作するようには思えないコードです:

if (i < closestIndex) { 
    lowerPoly.insert(lowerPoly.end(), poly.begin() + i, poly.begin() + closestIndex + 1); 
    upperPoly.insert(upperPoly.end(), poly.begin() + closestIndex, poly.end()); 
    upperPoly.insert(upperPoly.end(), poly.begin(), poly.begin() + i + 1); 
} else { 
    lowerPoly.insert(lowerPoly.end(), poly.begin() + i, poly.end()); 
    lowerPoly.insert(lowerPoly.end(), poly.begin(), poly.begin() + closestIndex + 1); 
    upperPoly.insert(upperPoly.end(), poly.begin() + closestIndex, poly.begin() + i + 1); 
} 

答えて

2

補足として:

実際には2つのケースがありません。 i> jの場合は、iとjを入れ替えます。それから、あなたはいつも、私が< jで、i!= jと仮定します。

次のように私はおそらくそれをコーディングします。

if (i > closestIndex) 
    std::swap (i, closestIndex); 
assert(closestIndex - i > 1); 
// make sure i != closestIndex and i is not adjacent to closestIndex 

lowerPoly.insert(lowerPoly.end(), poly.begin() + i, poly.begin() + closestIndex + 1); 
upperPoly.insert(upperPoly.end(), poly.begin() + closestIndex, poly.end()); 
upperPoly.insert(upperPoly.end(), poly.begin(), poly.begin() + i + 1); 
+0

うわー。私は今日、本当に馬鹿だと感じる。それも考えなかった。ありがとう!! – mpen

4

私はあなたが私のほかに、含める必要があり、別の制限があると思うが、 jと決して等しくない。

iがi-1またはi + 1で分割していない開始点であることを確認する必要があります。辺が線形の場合、連続する点で分割するということは、分割線が単に辺であることを意味します。元のポリゴンと稜線は元に戻ってしまいます。

2つの配列xとyの代わりに、ポリゴンの周りに反時計回りの方向に連続して番号が付けられた2D点の単一の配列をお勧めします。

だから、2つのポリゴンは次のようになります。

ポリゴン1:、Iで始まる終点jに反復、およびバックiをjから辺で終了。

ポリゴン2:iで終了点jまで、次にj + 1、j + 2でiに戻る。

+0

を、私は、彼らがいずれかの隣接することはありませんことを言及している必要があります。そして、私はxとyの2つの配列を使用していません...その2D点のベクトルです(私はそれを書いた、私は?)。彼らは実際にCCW順序でも順番に番号が付けられています。ポリゴン1は理にかなっていますが、2番目のケースではj + 1、j + 2の意味がわかりません。 – mpen

+0

申し訳ありませんが、今あなたが本当に言ったあなたの記事を再読しました。最も簡単なケースは1,2,3,4という番号の四角です。(1,2,3,1)と(1,3,4,1)の2つの三角形に分割できます。 – duffymo

+0

ああああ。私は冗長な出発点は必要ありませんが、あなたが今言っていることが分かります。その背後にあるロジックは問題ありませんが、実装には問題があります。 0の周りのケースは私を乱しているようです。 – mpen

0

悪いです。上記のコードは正常ですが、私の表示ルーチンに問題がありました。私はスタックに多すぎるポリゴンを押し込んでいたので、間違っているように見えました。明白だったはずですが、私はそれを見つけませんでした。ヘルプduffymoをありがとう。

関連する問題