从一系列线条中形成面孔

时间:2018-03-15 02:02:00

标签: c++

我获得了一个行beginendLines列表(使用每个点的索引)

line0 = (0,1)
line1 = (1,2)
line2 = (2,3)
line3 = (3,0)
line4 = (4,5)
line5 = (5,6)
line6 = (6,7)
line7 = (7,4)
line8 = (0,4)
line9 = (1,5)
line10 = (2,6)
line11 = (3,7)
line12 = (0,5)
line13 = (0,8)
line14 = (1,8)
line15 = (5,8)
line16 = (1,9)
line17 = (2,9)
line18 = (6,9)
line19 = (5,9)
line20 = (4,10)
line21 = (5,11)
line22 = (6,12)
line23 = (7,13)
line24 = (10,11)
line25 = (11,12)
line26 = (12,13)
line27 = (13,10)

现在我需要找到一种方法来弄清楚如何用这些创建面孔。到目前为止我尝试了什么:

int progress = 0; 
for (int i = 0; i< beginendLines.size(); i+=2){
    if (progress == 0){
        Face addface;
        addface.point_indexes.push_back(beginendLines[i]);
    }
    else{
        addface.point_indexes.push_back(beginendLines[i+1]);
        progress = 0;
    }
    if (i != beginendLines.size - 2){   
        if (beginendLines[i+2] != beginendLines[i+1]){
            progress = 1;
            figuur.faces.push_back(addface);
        }
    }
}

这种方法的问题在于,对于每个for循环,将生成一个新面。另外由于if循环,还有很多东西超出了范围。谁可以帮助我采用不同的方法或重构我的代码?

Face是一个类,包含一个向量,该向量具有可以创建面的点的索引。 e.g. 0,1,2,3

class Face{
public: 
    vector<int> point_indexes;
};

我想要完成的事情更清楚一点: figuur.faces.push_back(addface)应该将一张脸推到figuur.faces。面应该是最小2点(开始和1行的终点),并且只要下一行的开始等于最后一行的结尾,下一行的结束索引就应该添加到面。

1 个答案:

答案 0 :(得分:1)

For Loop Issues

for (int i = 0; i< beginendLines.size(); i+=2)

这个问题是i == bigenendLines.size() - 1和。{ 当您尝试使用bigenendLines.size() % 2 == 0

访问i+1处的某个项目时,您beginendLines[i+1]会出界

这是一个可能的解决办法:

for (int i = 0; i< beginendLines.size()-1; i+=2)

或使用迭代器循环:

for(lineIterator = beginendLines.begin(); 
    lineIterator != beginendLines.end(); 
    lineIterator++)

如果您可以访问C ++ 11,那么您应该能够进行基于范围的循环(我不确定它对于这种情况是个好主意):

 for (const Line& line : beginendLines)

范围问题

您的下一个问题是您的addface没有适当的范围。您在if语句中定义它,然后在else语句中使用它(以及之后的if语句)。

if (progress == 0){
    Face addface;
    addface.point_indexes.push_back(beginendLines[i]);
}
else{
    addface.point_indexes.push_back(beginendLines[i+1]); // HOW?
    progress = 0;
}

您应该在if语句之前的for循环中定义addface,例如

for (int i = 0; i< beginendLines.size()-1; i+=2) 
{
    Face addface;
    Other stuff;
}

其他问题

我对您在for循环中使用的逻辑提出疑问。主要是您要实现的目标,是否需要process以及是否需要if (i != beginendLines.size - 2)

关于每次迭代创建对象的说明

如果你有一个面向量并期望在每次循环迭代时将一个面推到向量上,那么你每次循环迭代都必须创建一个面是很自然的。如果你没有将addface推向向量,那么我很确定它超出范围并被破坏,所以你不必担心所有这些面孔都会填满你的堆每次循环迭代。