Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从线列表中形成面_C++ - Fatal编程技术网

C++ 从线列表中形成面

C++ 从线列表中形成面,c++,C++,我得到了一个使用每个点的索引开始的线列表 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)

我得到了一个使用每个点的索引开始的线列表

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);
        }
    }
}
更清楚地说明我要实现的目标: figuur.faces.push_backaddface应将一个面推到figuur.faces。一个面的起点和终点至少应为1条直线的两点,只要下一条直线的起点等于最后一条直线的终点,则下一条直线的终点索引应添加到该面上

For循环问题 或者使用迭代器循环:

for(lineIterator = beginendLines.begin(); 
    lineIterator != beginendLines.end(); 
    lineIterator++)
如果您可以访问C++11,那么您应该能够执行基于范围的for循环。不过,我不确定这对于这种情况是否是个好主意:

 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循环中使用的逻辑。主要是您试图实现的目标,是否需要过程以及是否需要我!=需要beginendLines.size-2

关于每次迭代创建对象的说明
如果您有一个面向量,并且希望在每次循环迭代时将一个面推送到该向量,那么很自然,您必须在每次循环迭代时创建一个面。如果您不将addface推送到向量,那么我很确定它超出了范围并被破坏,因此您不必担心每次循环迭代时所有这些面都会填满堆。

什么是面类型,它是如何定义的?我看不出这个相当简单的代码是如何产生一张任何类型的可识别的脸的。我建议你更新你的问题标题,以表明你指的是图形脸或任何你真正指的脸。人们会认为你在尝试做人脸识别。人脸是一个类,包含一个向量——如果你真的发布了这个类而不是描述它,这不会有什么坏处。那么问题到底是什么呢?您在此处声明了一个局部面:Face addface;在每次迭代中都会被破坏。此外,该代码无法编译,因为addface在if块内是本地的。但除此之外,你的问题还不清楚你在完成什么方面遇到了困难。
 for (const Line& line : beginendLines)
if (progress == 0){
    Face addface;
    addface.point_indexes.push_back(beginendLines[i]);
}
else{
    addface.point_indexes.push_back(beginendLines[i+1]); // HOW?
    progress = 0;
}
for (int i = 0; i< beginendLines.size()-1; i+=2) 
{
    Face addface;
    Other stuff;
}