這是我的功能。基本上它讀取一個文本文件並將數據組織成一堆不同的向量。三維矢量索引不當
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]
的錯誤出現。如果我叫knotvectors[0][0]
所以我不能確定我在做什麼錯在引用3維ctrlpts
向量的單個細胞
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();
}
一切正常。
關於我在做什麼的錯誤?也許它與我組裝這個三維矢量的方式有關?
編輯:沒有具體的錯誤信息。它只是崩潰。
編輯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。因此,我beleive上面的塊是由於某種原因不吃奶在數據到矢量中。
這聽起來像你可能需要學習如何使用調試器來遍歷代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:** [如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver