⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 offprocess.h

📁 去除3维面片OFF格式文件中的无效点
💻 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 + -