Найти соседние лица выбранного лица - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь создать алгоритм для поиска соседних граней выбранного лица.

Это то, что у меня пока что не работает:

vector<Face *> Face::DeterminarFacesVizinhas(vector<Face *> Faces){
    vector<Face *> Lista = {};
    bool flag = false;
    //cout << "\n" << endl;
    for (size_t x = 0; x < ReturnVertices().size(); x++)
        for (size_t i = 0; i < Faces.size(); i++)
            for (size_t j = 0; j < Faces[i]->ReturnVertices().size(); j++){
                if (Utils::CompararVertice(Faces[i]->ReturnVertices()[j], ReturnVertices()[x])) {
                    for (size_t v = 0; v < Lista.size(); v++)
                        if(Lista[v]->FaceID==Faces[i]->FaceID)
                            flag=true;
                    if(!flag)
                        Lista.push_back(Faces[i]);
                }

            }

    return Lista;
}

Вывод для куба (четырехугольные грани вместо треугольников) мне нужно 4 в каждой грани, но по какой-то причине я получаю это (для l oop):

vector<Face *> ListaFacesVizinhas = ModeloSG->ReturnFaces()[i]->DeterminarFacesVizinhas(ModeloSG->ReturnFaces());

sizeof(ListaFacesVizinhas) = 3
sizeof(ListaFacesVizinhas) = 3
sizeof(ListaFacesVizinhas) = 4
sizeof(ListaFacesVizinhas) = 4
sizeof(ListaFacesVizinhas) = 4
sizeof(ListaFacesVizinhas) = 4

Я должен сравнить грани по вершинам (каждая грань имеет 4 вершины, каждая из которых используется 2 другими гранями). Если лицо уже есть в списке, оно не должно дублироваться.

В работе используются файлы .obj wavefront.

Это код, как он есть (он еще не закончен): https://github.com/Karbust/Processing-Models-Generated-on-Blender/

Может ли кто-нибудь указать мне правильное направление? Я не знаю, что еще делать ...

Минимальный воспроизводимый пример:

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <vector>
#include <list>

using namespace std;


class Vertice {
private:
    float VerticeX, VerticeY, VerticeZ;
public:
    Vertice(float VertexX, float VertexY, float VertexZ) {
        VerticeX = VertexX;
        VerticeY = VertexY;
        VerticeZ = VertexZ;
    }
    float ReturnVX() { return VerticeX; };
    float ReturnVY() { return VerticeY; };
    float ReturnVZ() { return VerticeZ; };
    float ProdInterno(Vertice *V) const { return (VerticeX * V->ReturnVX()) + (VerticeY * V->ReturnVY()) + (VerticeZ * V->ReturnVZ()); }
};

class Utils {
public:
    bool CompararVertice(Vertice * V1, Vertice * V2) {
        return V1->ReturnVX() == V2->ReturnVX() && V1->ReturnVY() == V2->ReturnVY() && V1->ReturnVZ() == V2->ReturnVZ();
    }
};

class Face {
private:
    int FaceID{};
    vector<int> VerticeID;
    vector<Vertice *> Vertices;
public:
    vector<Face *> DeterminarFacesVizinhas(const vector<Face *>& Faces){
        vector<Face *> Lista = {};
        bool flag = false;
        Utils *U;
        for (size_t x = 0; x < ReturnVertices().size(); x++)
            for (size_t i = 0; i < Faces.size(); i++)
                for (size_t j = 0; j < Faces[i]->ReturnVertices().size(); j++){
                    if (U->CompararVertice(Faces[i]->ReturnVertices()[j], ReturnVertices()[x])) {
                        for (size_t v = 0; v < Lista.size(); v++)
                            if(Lista[v]->FaceID==Faces[i]->FaceID)
                                flag=true;
                        if(!flag)
                            Lista.push_back(Faces[i]);
                    }

                }

        return Lista;
    }
    void Add(int fID, int vID, Vertice *V){
        FaceID = fID;
        VerticeID.push_back(vID);
        Vertices.push_back(V);
    }
    int ReturnfID() { return FaceID; };
    vector<int> ReturnvID() { return VerticeID; };
    vector<Vertice *> ReturnVertices() { return Vertices; };
};

class Modelo {
private:
    string Nome;
    vector<Vertice *> Vertices;
    vector<Face *> Faces;
    Face *FaceMaiorCurvatura;

    void AddValueVertices(float VertexX, float VertexY, float VertexZ) {
        Vertices.push_back(new Vertice(VertexX, VertexY, VertexZ));
    }
public:
    Modelo(const string &fich){
        ifstream objeto (fich);

        if(objeto.fail())
            throw exception();

        string line, temp, v;
        int i = 0, w = 1;
        float VertexX = 0.0f, VertexY = 0.0f, VertexZ = 0.0f;

        while(!objeto.eof()){
            getline (objeto,line);
            if (line[0] == 'v'){
                istringstream iss(line);
                iss >> v >> VertexX >> VertexY >> VertexZ;
                AddValueVertices(VertexX, VertexY, VertexZ);
            }
            else if(line[0] == 'f'){
                istringstream iss(line);
                Face *novaFace = new Face();
                i = 0;
                while(iss >> temp){
                    if(i != 0)
                        novaFace->Add(w, stoi(temp), Vertices[stoi(temp)-1]);
                    i++;
                }

                temp.clear();            

                Faces.push_back(novaFace);

                w++;
            }
        }

        Nome = fich;
    }
    string ReturnNome() { return Nome; };    
    vector<Vertice *> ReturnVertices() { return Vertices; };
    vector<Face *> ReturnFaces() { return Faces; };    
    Face *ReturnFaceMaiorCurvatura() { return FaceMaiorCurvatura; };
};

class SGestao {
private:
    Modelo *ModeloSG;
public:
    Face *FaceMaiorCurvatura() {

        for(size_t i = 0; i < ModeloSG->ReturnFaces().size(); i++){
            vector<Face *> ListaFacesVizinhas = ModeloSG->ReturnFaces()[i]->DeterminarFacesVizinhas(ModeloSG->ReturnFaces());
            cout << "ListaFacesVizinhas = " << ListaFacesVizinhas.size() << endl;
        }

        Face *temp = ModeloSG->ReturnFaceMaiorCurvatura();

        return ModeloSG->ReturnFaces()[1];
    }

    void Load(const string &fich){
        auto *newModelo = new Modelo(fich);
        ModeloSG = newModelo;
    }
};


int main()
{
    auto *SG = new SGestao();
    SG->Load("cubo.obj");

    SG->FaceMaiorCurvatura();
}

cubo.obj:

# Blender v2.66 (sub 1) OBJ File: ''
# www.blender.org
mtllib cubo.mtl
o Cube.001
v -2.798875 4.114415 -0.012605
v -2.798875 4.114417 -8.241435
v 5.429955 4.114417 -8.241435
v 5.429954 4.114415 -0.012604
v -2.798877 -4.114415 -0.012609
v 5.429955 -4.114415 -0.012607
v 5.429956 -4.114414 -8.241436
v -2.798873 -4.114414 -8.241440
usemtl Material.001
s off
f 1 2 3 4
f 5 6 7 8
f 1 5 8 2
f 2 8 7 3
f 3 7 6 4
f 5 1 4 6

Спасибо

...