Tom*_*Tom 2 c++ rotation spline splice
我有一个std::vector
保持一个Point struct
(X,Y,Z和其他一些非指针类型).
这些点是绘制bspline曲线的控制点.我在绘制曲线时没有遇到任何问题,但是当我必须关闭曲线时会出现复杂情况,其中包括以特定顺序添加控制点(在容器内存在的alredy).
例如,如果我有5个控制点
A B C D E
Run Code Online (Sandbox Code Playgroud)
我必须得到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
Run Code Online (Sandbox Code Playgroud)
最初,我去了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
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?我知道我可以使用许多嵌套for循环实现它,但我试图避免这种情况,寻找更优雅的东西(如果这个词适合).
提前致谢.
小智 5
如果您愿意使用更多空间,则可以先将lpoints附加到自身,然后在需要时使用subseq增加迭代器.这也适合你的'5个不同的向量或一个长的向量',因为你可以使用双向量的迭代器,而不是创建新的向量.
请原谅,我还没有写过一段时间的C++,所以这里的C++就像伪代码一样
void
rotate(lpoints& points)
{
pointsDouble = Append(points,points); // Do your own implementation
// if points is A B C D E
// pointsDouble is A B C D E A B C D E
pointsDouble::iterator beg = lista.begin();
pointsDouble::iterator dernier=lista.begin()+4;
for (unsigned int i =0;i<5;i++){
lpoints subseq(beg,dernier); //4 points in subseq
//do stuff with subseq
++beg; ++dernier;
}
}
Run Code Online (Sandbox Code Playgroud)
for循环也许可以更好地编写,在开始和结束(或dernier)而不是循环变量i.
对于追加,你可以使用std :: copy(警告:我在C++中生锈).
lpoints pointsDouble(points);
std::copy(points.begin(), points.end(), std::back_inserter(pointsDouble));
Run Code Online (Sandbox Code Playgroud)
(Luc建议的back_inserter)