私は(x、y、zおよび他のいくつかの非ポインター型)std::vector
を保持するを持っています。Point struct
これらの点は、bスプライン曲線を描くための制御点です。曲線を描くのに問題はありませんが、曲線を閉じる必要がある場合に問題が発生します。これには、特定の順序でコントロールポイント(コンテナ内にすでに存在する)を追加する必要があります。
たとえば、5つのコントロールポイントがある場合
A B C D E
次のような5つのシーケンスを取得する必要があります。
A B C D //curve is drawn from B to C
B C D E //curve is drawn from C to D
C D E A //curve is drawn from D to E
D E A B //curve is drawn from E to A
E A B C //curve is drawn from A to B
最初はと一緒に行きましstd::rotate
たが、それが私が探していたものではないことに気づきました。
これを実装するのに問題があります。私が得た最高のものは、C ++で動作しないバージョンです(これが失敗する理由は問題ではありません。ここにスニペットがあります)。
static char letters = 'A';
typedef struct Point{
float x,y,z;
char name;
Point(float x,float y,float z=0):name(letters++){}
}Point;
typedef std::vector<Point> lpoints;
void
rotate(lpoints& points)
{
for (unsigned int i =0;i<5;i++){
lpoints::iterator beg = lista.begin() + (i%5);
lpoints::iterator dernier=lista.begin()+(4+i)%6;
lpoints subseq(beg,dernier); //4 points in subseq
//do stuff with subseq
}
}
これを行う方法はありますか?多くのネストされたforループを使用して実装できることはわかっていますが、それを避けて、よりエレガントなものを探しています(単語が適合する場合)。
前もって感謝します。