2016-07-11 73 views
0

這是我的功能。基本上它讀取一個文本文件並將數據組織成一堆不同的向量。三維矢量索引不當

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上面的塊是由於某種原因不吃奶在數據到矢量中。

+3

這聽起來像你可能需要學習如何使用調試器來遍歷代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:** [如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

回答

0

找出問題所在。

如果你有向量A,B和C. 如果將B推入A,然後將C推入B,則不能直接將數字推入C並通過A訪問它們,而是必須通過A處理所有內容:

所以問題是固定的,當我最初推控制點集,cpictrlpts然後改變:

cp1.push_back(x1); 

ctrlpts[i].push_back(xi);