📄 finfo.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 + -