У меня есть std::vector
, который содержит Point struct
(x, y, z и некоторые другие типы без указателей).
Эти точки являются контрольными точками для рисования кривой bspline.У меня нет проблем с рисованием кривой, но возникают сложности, когда мне приходится закрывать кривую, что включает добавление контрольных точек (уже существующих внутри контейнера) в определенном порядке.
Например, если у меня есть 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
, но потом понял, что это не то, что я искалfor.
У меня проблемы с реализацией.Лучшее, что я получил, это нерабочая версия на 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
}
}
Есть ли способ сделать это?Я знаю, что могу реализовать это с помощью множества вложенных циклов, но я стараюсь избегать этого, ища что-то более элегантное (если слово подходит).
Заранее спасибо.