[英]Should I always use a 1D vector with my own indexing, or is a multi-dimensional vector ok?
[英]Improper indexing of 3 dimensional vector
这是我的功能。 基本上,它读取文本文件并将数据组织成一堆不同的向量。
ctrlpts
是3维向量。 第一层存储不同组的控制点(cp1..cp3)。 第二层存储x,y,z,w坐标数组。 因此,第三级代表坐标数组中的条目。
在下面的函数中,我首先初始化所有向量。 然后,根据维数( int d
)和结矢量( int k
)的数量,我相应地构建多维矢量。 对于ctrlpts
我首先将适当的坐标矢量添加到适当的控制点集中。 (例如: cpl.push_back(x1)
)然后将这些坐标集推入ctrlpts
(例如: ctrlpts.push_back(cp1)
)
当我调用ctrlpts[0][0][0]
时出现错误。
void createNurb(string filename){
ifstream file;
file.open(filename.c_str());
if(file.fail()){
cout << "Cannot open " << filename << endl;
}
vector<float> knots1;
vector<float> knots2;
vector<float> knots3;
vector< vector<float> > knotvectors;
vector<float> x1;
vector<float> y1;
vector<float> z1;
vector<float> w1;
vector<float> x2;
vector<float> y2;
vector<float> z2;
vector<float> w2;
vector<float> x3;
vector<float> y3;
vector<float> z3;
vector<float> w3;
vector< vector<float> > cp1;
vector< vector<float> > cp2;
vector< vector<float> > cp3;
vector< vector< vector<float> > > ctrlpts;
string line;
getline(file,line);
int d = line[0] - 48;
getline(file,line);
int k= line[0] - 48;
if(k==1){
knotvectors.push_back(knots1);
if(d==1){
cp1.push_back(x1);
cp1.push_back(w1);
}else if(d==2){
cp1.push_back(x1);
cp1.push_back(y1);
cp1.push_back(w1);
}else{
cp1.push_back(x1);
cp1.push_back(y1);
cp1.push_back(z1);
cp1.push_back(w1);
}
ctrlpts.push_back(cp1);
}else if(k==2){
knotvectors.push_back(knots1);
knotvectors.push_back(knots2);
if(d==1){
cp1.push_back(x1);
cp1.push_back(w1);
cp2.push_back(x2);
cp2.push_back(w2);
}else if(d==2){
cp1.push_back(x1);
cp1.push_back(y1);
cp1.push_back(w1);
cp2.push_back(x2);
cp2.push_back(y2);
cp2.push_back(w2);
}else{
cp1.push_back(x1);
cp1.push_back(y1);
cp1.push_back(z1);
cp1.push_back(w1);
cp2.push_back(x2);
cp2.push_back(y2);
cp2.push_back(z2);
cp2.push_back(w2);
}
ctrlpts.push_back(cp1);
ctrlpts.push_back(cp2);
}else{
knotvectors.push_back(knots1);
knotvectors.push_back(knots2);
knotvectors.push_back(knots3);
if(d==1){
cp1.push_back(x1);
cp1.push_back(w1);
cp2.push_back(x2);
cp2.push_back(w2);
cp2.push_back(x3);
cp2.push_back(w3);
}else if(d==2){
cp1.push_back(x1);
cp1.push_back(y1);
cp1.push_back(w1);
cp2.push_back(x2);
cp2.push_back(y2);
cp2.push_back(w2);
cp3.push_back(x3);
cp3.push_back(y3);
cp3.push_back(w3);
}else{
cp1.push_back(x1);
cp1.push_back(y1);
cp1.push_back(z1);
cp1.push_back(w1);
cp2.push_back(x2);
cp2.push_back(y2);
cp2.push_back(z2);
cp2.push_back(w2);
cp3.push_back(x3);
cp3.push_back(y3);
cp3.push_back(z3);
cp3.push_back(w3);
}
ctrlpts.push_back(cp1);
ctrlpts.push_back(cp2);
ctrlpts.push_back(cp3);
}
for(int i=0; i<k; i++){
getline(file,line);
std::istringstream iss(line);
std::copy(std::istream_iterator<float>(iss),
std::istream_iterator<float>(),
std::back_inserter(knotvectors[i]));
for (int j=0; j<=d; j++){
getline(file,line);
std::copy(std::istream_iterator<float>(iss),
std::istream_iterator<float>(),
std::back_inserter(ctrlpts[i][j]));
}
}
cout<< ctrlpts[0][0][0] << endl;
file.close();
}
如果我调用knotvectors[0][0]
,一切都会正常,所以我不确定在引用3维ctrlpts
向量的单个单元格时我做错了什么。
关于我在做什么错的任何想法吗? 也许与我组装此3维矢量的方式有关?
编辑:没有特定的错误信息。 它只是崩溃。
编辑2:
我相信问题可能在这里:
for (int j=0; j<=d; j++){
getline(file,line);
std::copy(std::istream_iterator<float>(iss),
std::istream_iterator<float>(),
std::back_inserter(ctrlpts[i][j]));
如果我打印出来: ctrlpts[0][0].size()
则说为0。因此,我认为上面的块由于某种原因没有将数据输入向量中。
找出问题所在。
如果具有向量A,B和C。如果将B推入A,然后将C推入B,则不能直接将数字推入C并通过A来访问它们。相反,所有事情都必须通过A处理:
因此,当我最初将控制点集(将cpi
转换为ctrlpts
然后将其更改时,问题已解决:
cp1.push_back(x1);
至
ctrlpts[i].push_back(xi);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.