合并OFF文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/OOFFrankDura/article/details/81987823

说明

环境:
cgal
release
mac os
clion编译器

#include <fstream>
#include <iostream>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <vector>
using namespace std;
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Vector_3                                     Vector;
typedef K::Point_3 Point;
struct v_index {
    int a,b,c;
};

void  ReadOffFile(const char *filename,vector<Point>& vcon,vector<struct  v_index>& fcon)
{       /*
     函数说明: 对文件进行读取,读取的是off文件
     */
    int i;
    FILE *fp;                                         //开始读入文件
    if (!(fp = fopen(filename, "r"))) {
        cout << "无法打开文件" << endl;
        return ;
    }
    //进行读入文件的操作
    int vert_number = 0;                            //记录顶点个数
    int face_number = 0;                                    //记录面的个数
    int line_number = 0;                                   //记录边的个数
    int line_count = 0;                               //这个是我读入了几行
    char buffer[1024];
    int v_counter = 0,f_counter=0;
    while (fgets(buffer, 1023, fp)) {
        line_count++;
        char *bufferp = buffer;
        while (isspace(*bufferp)) bufferp++;
        if (*bufferp == '#') continue;
        if (*bufferp == '\0') continue;
        if (vert_number == 0) {
            if (!strstr(bufferp, "OFF")) {
                if ((sscanf(bufferp, "%d%d%d", &vert_number, &face_number, &line_number) != 3) || (vert_number == 0)) {
                    cout << "存在语法错误!"  << endl;
                    fclose(fp);
                    return ;
                }
                //存储顶点的信息
                cout << "[info]" << vert_number << "--" << "v_number" << endl;
                cout << "[info]" << face_number << "--" << "f_number" << endl;
                cout << "[info]" << line_number << "--" << "l_number" << endl;
                //如果头文件信息合适那么开辟内存空间
            }
        }
        else if (v_counter < vert_number) {

            v_counter++;
            double x,y,z;
            if (sscanf(bufferp, "%lf%lf%lf", &(x), &(y), &(z)) != 3) {
                cout << "点的信息中,数据量不足(3个)" << endl;
                fclose(fp);
                return ;
            }else{
                vcon.push_back(Point(x,y,z));
            }
        }
        else if (f_counter < face_number) {
            f_counter++;
            int the_vertex_face_con;
            bufferp = strtok(bufferp, " \t");
            if (bufferp){
                the_vertex_face_con = atoi(bufferp);
            }
            else {
                fclose(fp);
                return ;
            }
            struct v_index vd;
            for (i = 0; i < the_vertex_face_con; i++) {
                bufferp = strtok(NULL, " \t");
                if (bufferp) {
                    if(i==0){
                        vd.a =atoi(bufferp);
                    }else if(i==2){
                        vd.b =atoi(bufferp);
                    }else{
                        vd.c =atoi(bufferp);
                    }
                }
                else {
                    fprintf(stderr, "Syntax error with face on line %d in file %s\n", line_count, filename);
                    fclose(fp);
                    return ;
                }
            }
            fcon.push_back(vd);

        }
        else {
            cout << "格式存在错误!"  << endl;
            break;
        }
    }
    //判断实际的 面 的数目是否和要求数目一样!

    fclose(fp);
}

void reverse_face(vector<struct  v_index>& fcon){
    int mid;
    for (int j = 0; j < fcon.size(); ++j) {
        mid = (fcon[j].c);
        fcon[j].c = fcon[j].a;
        fcon[j].a = mid;
    }
}


int main(void){
    vector<Point> vcon;
    vector<struct  v_index> fcon;
    ReadOffFile("/Users/frankdura/Desktop/result4.off",vcon,fcon);
    vector<Point> vcon2;
    vector<struct  v_index> fcon2;
    ReadOffFile("/Users/frankdura/Desktop/kitten.off",vcon2,fcon2);


    for (int j = 0; j <fcon2.size() ; ++j) {
        v_index temp = fcon2[j] ;
        temp.a+=vcon.size();
        temp.b+=vcon.size();
        temp.c+=vcon.size();
        fcon.push_back(temp);
    }
    for (int j = 0; j <vcon2.size() ; ++j) {
        vcon.push_back(vcon2[j]);
    }


    ofstream out("/Users/frankdura/Desktop/print_1.off");
    out << "OFF"<< endl;
    out << vcon.size() <<" "<< fcon.size() <<" 0"<< endl;
    for (int j = 0; j <vcon.size() ; ++j) {
        out << (vcon[j])<< endl;
    }
    for (int j = 0; j <fcon.size() ; ++j) {
        out <<"3 " << (fcon[j].a) <<" " << fcon[j].c <<" " << fcon[j].b<< endl;
    }
    out.close();

}

猜你喜欢

转载自blog.csdn.net/OOFFrankDura/article/details/81987823