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

📄 finfo.cpp

📁 3D模型变换的VC源程序
💻 CPP
字号:
// finfo.cpp: implementation of the finfo class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "f_open.h"
#include "finfo.h"
#include"math.h"

#define  n   1024

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

finfo::finfo()
{

}

finfo::~finfo()
{
	for(int ii = 0; ii < fNum; ii++)	// 撤消空间分配、删除指针
	delete[] faces[ii];
	delete[] faces;
	
	//////////////////////////////////////////////////////////////////////////
	
	for(int jj = 0; jj < pNum; jj++)	// 撤消空间分配、删除指针
	delete[] point[jj];
	delete[] point;

	////////////////////////////////////////////////////////////////////////////

    
	for(int ss = 0; ss < 3*fNum; ss++)	// 撤消空间分配、删除指针
	delete[] edges[ss];
	delete[] edges;

}


void finfo::Initialization(FILE *stream)
{
	int temp;         //定义面片规格变量,这里所有的面片都是三角形。
	
	fseek( stream, 0L, SEEK_SET );        //设定文件指针的位置,指在起始位置。
	char line[256];
	fgets(line, 256, stream);			// 由文件流stream至多读入255个字符到字符串数组line中,遇到换行符结束,最后放'\0'

	                                   //在这里是否可以省略一个fgets()函数?
	fgets(line, 256, stream);		  //
	sscanf(line, "%d %d %d ", &pNum, &fNum, &temp); //将line数组中的字符串按照%d的格式分别读入到pNum,fNum,temp中
	                                                   //即将OFF文件的第二行数据读入到三个变量中
	
	faces = new int*[fNum];				// 分配空间、初始化
	for(int ii = 0; ii < fNum; ii++)
	faces[ii]  = new int [3];		// faces[0][0] = 1;	在这里为什么等于1?		// 初始化
	

	
	point = new float *[pNum];
	for(int jj = 0; jj < pNum; jj++)
	point[jj]  = new float [3];	// 	point[0][0] = 1.0;			// 初始化



    edges = new float *[3*fNum];         //初始化数组
	for(int ss = 0;ss<3*fNum; ss++)      //存在问题
	edges[ss]  = new float [3];	
   // edges=new float **[][3];

	

	// 三角片数组、
	for( int i=0; i<pNum; i++ )
	{
		fgets(line, 256, stream);  
		sscanf(line, "%f %f %f ", &point[i][0], &point[i][1], &point[i][2]);
	}
	
	
	// 初始化顶点数组、
	for( int j=0; j<fNum; j++ )
	{
		fgets(line, 256, stream);  
		sscanf(line, "%d %d %d %d ", &temp, &faces[j][0], &faces[j][1], &faces[j][2]);		
		ASSERT(temp == 3);//ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。
		                  //在这里保证了当temp=3的时候,读入数据,即读入面片的定点标号。
	}
}

void finfo::distance()
{
		
	
	

}

void finfo::edgeSum(FILE *sstream)
{
	
	eNum=0;
    rr=1;
	int aa=0;
	int zz;
	
	
  /*  int *q;
	int *v;
	int qq=1;
	int vv=0;

	q=new int [pNum];
	v=new int [pNum];
	
	for(int a=0;a<fNum;a++)
	{	
		for(int b=0;b<3;b++)
		{
		    v[vv]=faces[a][b];
			if(b==2)
				qq=0;
			q[vv]=faces[a][qq];
			qq++;
		
		int e=vv;
		if(e!=0)
		{
			for(int aa=e-1;aa>0;aa--)
			{
				if((v[e]==v[aa])&&(q[e]==q[aa])||(v[e]=q[aa])&&(q[e]==v[aa]))
				vv--;

			}
		
		}
		if(vv==e)
			eNum++;
	//	TRACE("eNum=,%d\n",eNum);
		vv++;
		}
	//	delete [pNum]q;
	//	delete [pNum]v;
	
	
	}*/

	
	
		
	

	
	
//	edges = new float *[eNum];         //初始化数组
//	for(int jj = 0;jj<eNum; jj++)      //存在问题
//	edges[jj]  = new float [3];	

//	TRACE("eNum=%d\n",eNum);

   for(int i=0;i<fNum;i++)
	{	
		for(int j=0;j<3;j++)
		{
			k = faces[i][j];		//顶点序列号

			x1[j] = point[k][0];	//顶点坐标
			y1[j] = point[k][1];
			z1[j] = point[k][2];


			if(j==2)
				rr=0;
	
			
			m = faces[i][rr];		//顶点序列号
	
			x2[j] = point[m][0];	//顶点坐标
			y2[j] = point[m][1];
			z2[j] = point[m][2];
			
			TRACE("%f %f %f %f %f %f \n", x1[j], y1[j], z1[j], x2[j], y2[j], z2[j]);
							
		
			
			rr++;
           
			TRACE("k=%d, m=%d\n",k,m);
		//	TRACE("edges[aa][0]=%d,edges[aa][1]=%d,edges[aa][2]=%f\n\n", 
	//			edges[aa][0],edges[aa][1],edges[aa][2]);

			edges[aa][0]=float(k);	    //顶点信息
			edges[aa][1]=float(m);	    //顶点信息
			edges[aa][2]=float(sqrt((x1[j]-x2[j])*(x1[j]-x2[j]) 
							        +(y1[j]-y2[j])*(y1[j]-y2[j])
									+(z1[j]-z2[j])*(z1[j]-z2[j]))); //计算边长
     
			TRACE("aa=%d,k=%d, m=%d\n",aa,k, m);
							   
			 	
			//aa++;
			zz=aa;
			
			if(aa!=0)
			
			{
				int c = aa-1;
			
				for( int ii=c; ii>0; ii-- )
				{
					if( ( edges[aa][0]==edges[ii][0] ) &&
						( edges[aa][1]==edges[ii][1] ) ||
						( edges[aa][0]==edges[ii][1] ) &&
						( edges[aa][1]==edges[ii][0] ) )
						
						aa--;
				}
			}
		//	TRACE("edges[aa][2]=%f\n", edges[aa][2]);
			if(aa==zz)
			{
				TRACE("edges[aa][0]=%4.0f,edges[aa][1]=%4.0f,edges[aa][2]=%f\n", 
						edges[aa][0],edges[aa][1],edges[aa][2]);
		    	fprintf(sstream,"%-4.0f %-4.0f %-4f\n",edges[aa][0],edges[aa][1],edges[aa][2]);
				eNum++;
						
			}	
			aa++;
           
			
		}      // j

   }          // i
		
}
            
			




		

		




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -