版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
}