繁体   English   中英

3维向量的索引不正确

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM