📄 offprocess.h
字号:
#include "iostream"
#include "fstream"
#include "vector"
using namespace std;
const int LINE_MAX = 4096;
vector<char *> words;
FILE *_file_ptr;
char _line_buffer[LINE_MAX];
int _vertex_num;
int _face_num;
void get_words(char *line, vector<char *> &words)
{
words.clear();
char *p;
for (p=line; *p!='\0'; p++)
{
if (*p == '\t') *p = ' ';
else if (*p == '\n') *p = ' ';
}
*p++ = ' ';
*p = '\0';
p = line;
while (*p != '\0')
{
while (*p==' ') p++;
if (*p=='\0') break;
words.push_back(p);
while (*p!=' ') p++;
*p++ = '\0';
}
}
bool str_iequal(const char *str1, const char *str2)
{
char s1, s2;
while (*str1 && *str2)
{
s1 = *str1;
s2 = *str2;
if (s1>='A' && s1<='Z') s1 -= 'A' - 'a';
if (s2>='A' && s2<='Z') s2 -= 'A' - 'a';
if (s1 != s2) return false;
str1 ++;
str2 ++;
}
if (!*str1 && !*str2) return true;
return false;
}
bool ReadHeader()
{
if (!_file_ptr) return false;
if(fseek(_file_ptr, 0, SEEK_SET))
{
return false;
}
if (!fgets(_line_buffer, LINE_MAX-1, _file_ptr))
{
return false;
}
get_words(_line_buffer, words);
if (words.size()==0 || !str_iequal(words[0], "off"))
{
return false;
}
while (fgets(_line_buffer, LINE_MAX-1, _file_ptr))
{
get_words(_line_buffer, words);
if (words.size()<=0) continue;
if (words.size() >= 2)
{
_vertex_num = atoi(words[0]);
_face_num = atoi(words[1]);
}
if ((_vertex_num != -1) && (_face_num != -1))
{
return true;
}
}
return false;
}
bool ReadVertexData(float *dst)
{
int i;
for (i=0; i<_vertex_num; ++i)
{
if (!fgets(_line_buffer, LINE_MAX-1, _file_ptr))
{
return false;
}
get_words(_line_buffer, words);
if (words.size() < 3)
{
return false;
}
*dst++ = (float)atof(words[0]);
*dst++ = (float)atof(words[1]);
*dst++ = (float)atof(words[2]);
dst += 3;
}
return true;
}
bool ReadFaceData(unsigned int *dst, int face_type)
{
int i;
for (i=0; i<_face_num; ++i)
{
if (!fgets(_line_buffer, LINE_MAX-1, _file_ptr))
{
return false;
}
get_words(_line_buffer, words);
if (((atoi(words[0]) == 3) && (words.size() > 4))
|| ((atoi(words[0]) == 4) && (words.size() > 5))
|| ((atoi(words[0]) != 3) && (atoi(words[0]) != 4))
|| (atoi(words[0]) != face_type))
{
return false;
}
if (atoi(words[0]) == 3)
{
*dst++ = atoi(words[1]);
*dst++ = atoi(words[2]);
*dst++ = atoi(words[3]);
}
else if (atoi(words[0]) == 4)
{
*dst++ = atoi(words[1]);
*dst++ = atoi(words[2]);
*dst++ = atoi(words[3]);
*dst++ = atoi(words[4]);
}
}
return true;
}
bool _OffProcess(char* _dest_path_ptr, char* _save_path_ptr,
int _num=0, bool _clear_invalid_point=false,
bool _add_num=false, int _face_type=3,
char* _used_num_path_ptr=NULL, bool _node_used_num=false)
{
int i, j, k, l;
int Vertex_num, Face_num;
int _new_Vertex_num;
_file_ptr = fopen(_dest_path_ptr, "r");
ReadHeader();
Vertex_num = _vertex_num;
Face_num = _face_num;
_new_Vertex_num = Vertex_num;
float *_vertex = new float [_vertex_num*6];
unsigned int *_face = new unsigned int [Face_num*_face_type];
float **vertex, **vertex_copy;
unsigned int **face, **face_copy;
vertex = new float *[Vertex_num];
vertex_copy = new float *[Vertex_num];
for (i=0; i<Vertex_num; i++)
{
vertex[i] = new float [3];
vertex_copy[i] = new float [3];
}
face = new unsigned int *[Face_num];
face_copy = new unsigned int *[Face_num];
for (i=0; i<Face_num; i++)
{
face[i] = new unsigned int [_face_type];
face_copy[i] = new unsigned int [_face_type];
}
if (!ReadVertexData(_vertex) || !ReadFaceData(_face, _face_type))
{
return false;
}
fclose(_file_ptr);
for (i=0; i<Vertex_num; i++)
{
for (j=0; j<3; j++)
{
vertex[i][j] = _vertex[6*i+j];
}
}
for (i=0; i<Face_num; i++)
{
for (j=0; j<_face_type; j++)
{
face[i][j] = _face[_face_type*i+j];
}
}
// for (i=0; i<Face_num; i++)
// {
// for (j=0; j<3; j++)
// {
// cout << face[i][j] << " ";
// }
// cout << " " << endl;
// }
//算法1:剔除掉面片列表中未使用到的点
if (_clear_invalid_point)
{
bool vertex_used = false;
k=0;
for (i=0; i<Vertex_num; i++)
{
for (j=0; j<Face_num; j++)
{
for (l=0; l<_face_type; l++)
{
if (i == face[j][l])
{
face_copy[j][l] = k;
if(!vertex_used)vertex_used = true;
}
}
}
if( vertex_used)
{
vertex_copy[k][0] = vertex[i][0];
vertex_copy[k][1] = vertex[i][1];
vertex_copy[k][2] = vertex[i][2];
vertex_used = false;
k++;
}
}
_new_Vertex_num = k;
}
//算法2:面片节点编号加n
if (_add_num)
{
for(i=0; i<Face_num; i++)
{
for(j=0; j<_face_type; j++)
{
face_copy[i][j] +=_num;
}
}
}
//算法3:计算每个节点被使用的次数
bool _b_node_used;
unsigned int *node_used;
_b_node_used = _node_used_num;
if (_b_node_used)
{
node_used = new unsigned int [_new_Vertex_num];
for (i=0; i<_new_Vertex_num; i++)
{
node_used[i] = 0;
}
for (i=0; i<_new_Vertex_num; i++)
{
for (j=0; j<Face_num; j++)
{
for (k=0; k<_face_type; k++)
{
if (i == face[j][k])
{
node_used[i]++;
}
}
}
}
}
if (_b_node_used)
{
int temp = 0;
_file_ptr = fopen(_used_num_path_ptr, "wb");
for (i=0; i<_new_Vertex_num; i++)
{
fprintf(_file_ptr, "%d %d \n", i, node_used[i]);
if (node_used[i] > 30)
{
temp += node_used[i];
}
}
fclose(_file_ptr);
}
// cout << "data process over" <<" " << endl;
// for (i=0; i<Face_num; i++)
// {
// for (j=0; j<3; j++)
// {
// cout << face_copy[i][j] << " ";
// }
// cout << " " << endl;
// }
if (_clear_invalid_point)
{
_file_ptr = fopen(_save_path_ptr, "wb");
fprintf(_file_ptr, "OFF\n");
fprintf(_file_ptr, "%d %d 0\n", _new_Vertex_num, Face_num);
for(i=0; i<_new_Vertex_num; i++)
{
fprintf(_file_ptr, "%f %f %f\n", vertex_copy[i][0], vertex_copy[i][1], vertex_copy[i][2]);
}
for(i=0; i<Face_num; i++)
{
fprintf(_file_ptr, "%d ", _face_type);
for (j=0; j<_face_type; j++)
{
fprintf(_file_ptr, "%d ", face_copy[i][j]);
}
fprintf(_file_ptr, "\n");
}
fclose(_file_ptr);
}
if (vertex != NULL)
{
for (i=0; i<Vertex_num; i++)
delete [] vertex[i];
delete [] vertex;
vertex = NULL;
}
if (vertex_copy != NULL)
{
for (i=0; i<Vertex_num; i++)
delete [] vertex_copy[i];
delete [] vertex_copy;
vertex_copy = NULL;
}
if (face != NULL)
{
for (i=0; i<Face_num; i++)
delete [] face[i];
delete [] vertex;
face = NULL;
}
if (face_copy != NULL)
{
for (i=0; i<Face_num; i++)
delete [] face_copy[i];
delete [] face_copy;
face_copy = NULL;
}
if (_vertex != NULL)
{
delete [] _vertex;
_vertex = NULL;
}
if (_face != NULL)
{
delete [] _face;
_face = NULL;
}
if (node_used != NULL)
{
delete [] node_used;
node_used = NULL;
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -