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

📄 ibg2.cxx

📁 Delaunay三角形的网格剖分程序
💻 CXX
📖 第 1 页 / 共 5 页
字号:
/*static const int ibg2ColBackground        = 0;static const int ibg2ColError		 = 1;static const int ibg2ColForeground        = 2;static const int ibg2ColDefaultNode	 = 3;static const int ibg2ColDefaultEdge	 = 4;static const int ibg2ColDefaultFace	 = 5;static const int ibg2ColDefaultBCondition = 5;	/* 6,7,8 for std. BC static const int ibg2ColDefaultRegion	 = 9;static const int ibg2ColDefaultMaterial	 = 9;static const int ibg2FileModNone  	= 0;static const int ibg2FileModSimplex	= 1;extern	wzGrid		*ibg2gCurrent;extern  int	 (*(ibg2FileOutput[ibg2FileModMAX]))(wzGrid *g, FILE *file);int ibg2ToSimplex(wzGrid *gg, FILE *file);wzGrid *ibg2OtSimplex(FILE *file);void  ibg2OutputInit();void  ibg2Output(wzGrid*);*/wzGrid*		ibg2NoGrid=0;wzName		ibg2NoName=0;wzPoints       ibg2gExternaePoints;  /*int		ibg2gFace;int		ibg2gEdge;int		ibg2gNode;wzFloat	ibg2gDmin[wzPointDim];wzFloat	ibg2gBLWait,ibg2gBLHalf,ibg2gBLObtuse,ibg2gBctg;wzFloat	ibg2gOref,ibg2gOinv,ibg2gOref2,ibg2gOmax;wzFloat	ibg2gBV;wzFloat	ibg2gPref;int   		ibg2gPrefL;*/static wzPoint p0;/*void	ibgOldOutput(wzGrid* grid, char* file){  wzNameFile = file;  ibg2Output(grid);  fflush(stdout);}*/int ibg2OtSimplex(wzGrid* gg, FILE *file);wzGrid *ibg2OtSimplex(FILE *file){  wzGrid* gg=(wzGrid*) malloc(sizeof(wzGrid));  ibg2OtSimplex(gg,file);  return gg;}#define buflen 200int ibg2OtSimplex(wzGrid* gg, FILE *file){  return 0;  /*int ccn,ccs,cc,cb,c,cl,cr,u,ul,ur,n,nn,rc,i,j,k; int points,rpoints,fpoints,cells,rcells,fcells; int t,cpoints,csides,num[9],gdim,xdim,fcellsguess; wzCellType ftyp,rtyp; float x,y,z; wzFloat xmin = big1,xmax = -big1; wzFloat ymin = big1,ymax = -big1; wzFloat zmin = big1,zmax = -big1; wzPoint *point; char buffer[buflen]; fgets(buffer,buflen,file); if(!strcmp(buffer,"SimplexGrid 2.0")) return ibg2Error; fgets(buffer,buflen,file); while(buffer[0]=='#') fgets(buffer,buflen,file); if(!strcmp(buffer,"DIMENSION")) return ibg2Error; fgets(buffer,buflen,file); rc = sscanf(buffer,"%d",&gdim);	// the grid dimension  if(rc != 1) return ibg2Error; fgets(buffer,buflen,file); if(!strcmp(buffer,"NODES")) return ibg2Error; fgets(buffer,buflen,file); xdim = wzPointDim; rc = sscanf(buffer,"%d %d",&points,&xdim);	// the number of points  if(rc <= 1) return ibg2Error; gg->xdim()  	= wzPointDim; gg->gdim()      = gdim; gg->maxPoint 	= gg->lastPoint	= points; gg->Point	= (wzPoint*)malloc(sizeof(wzPoint)*(gg->maxPoint+10)); gg->firstRegion= gg->firstCell	= gg->firstPoint	= 1; for(n=1;n<=points;n++){	fgets(buffer,buflen,file);	if(wzGridGDIM(*gg)==1){	    	rc = sscanf(buffer,"%f",&x); y=0; z=0;		if(rc != 1) goto readerror;	}else if(wzGridGDIM(*gg)==2){	    	rc = sscanf(buffer,"%f %f",&x,&y); z=0;		if(rc != 2) goto readerror;	}else if(wzGridGDIM(*gg)==3){	    	rc = sscanf(buffer,"%f %f %f",&x,&y,&z);		if(rc != 3) goto readerror;	}	point = &wzGridPoint(*gg,n);	if(x<xmin)	xmin = x;	if(y<ymin)	ymin = y;	if(z<zmin)	zmin = z;	if(x>xmax)	xmax = x;	if(y>ymax)	ymax = y;	if(z>zmax)	zmax = z;	ibg2pX(*point)[0] = x;	ibg2pX(*point)[1] = y;	ibg2pX(*point)[2] = z; } wzGridXMin(*gg,0) = xmin; wzGridXMin(*gg,1) = ymin; wzGridXMin(*gg,2) = zmin; wzGridXMax(*gg,0) = xmax; wzGridXMax(*gg,1) = ymax; wzGridXMax(*gg,2) = zmax; fgets(buffer,buflen,file); if(!strcmp(buffer,"CELLS")) return ibg2Error; fgets(buffer,buflen,file); rc = sscanf(buffer,"%d",&rcells);	// the number of region cells  if(rc != 1) return ibg2Error; fcells = fcellsguess = rcells/2+30; gg->lastRegion	= rcells; gg->firstFace	= rcells+1; gg->lastFace	= gg->cells.last()	= gg->maxCell	= cells = rcells+fcells; gg->firstEdge	= gg->firstNode	= 1; gg->lastEdge	= gg->lastNode	= 0; if(wzGridGDIM(*gg)==1){       	cpoints = 2*rcells + 1;	csides = 2*rcells + 2*fcells + 1;	rtyp = wzCellType1Line;	rpoints = 2;	ftyp = wzCellType1Node;	fpoints = 1; }else if(wzGridGDIM(*gg)==2){	cpoints = 3*rcells + 2*fcells + 1;	csides = 3*rcells + 4*fcells + 1;	rtyp = wzCellType2Triangle;	rpoints = 3;	ftyp = wzCellType2Line;	fpoints = 2; }else if(wzGridGDIM(*gg)==3){	cpoints = 4*rcells + 3*fcells + 1;	csides = 4*rcells + 5*fcells + 1;	rtyp = wzCellType3Tetrahedron;rpoints = 4;     	ftyp = wzCellType3Triangle;	fpoints = 3; }		      gg->maxCPoint	= cpoints; gg->maxCSide	= csides; gg->CellType	= (wzCellType*)malloc((cells+1)*sizeof(wzCellType)); gg->CellSegment = (ibg2Segment*)malloc((cells+1)*sizeof(ibg2Segment)); gg->CPointFirst = (int*)malloc((cells+1)*sizeof(int)); gg->CSideFirst = (int*)malloc((cells+1)*sizeof(int)); gg->CPoint	= (int*)malloc((cpoints+1)*sizeof(int)); gg->CSide	= (int*)malloc((csides+1)*sizeof(int)); gg->lastCOut	= gg->maxCOut = 0; ccn=0; ccs=0; for(c=1;c<=rcells;c++){	// at first the rcells region cells: 	fgets(buffer,buflen,file);	rc = sscanf(buffer,"%d %d %d %d %d %d %d %d %d ",		&num[0],&num[1],&num[2],&num[3],		&num[4],&num[5],&num[6],&num[7],&num[8]);	wzGridCellType(*gg,c) = rtyp;	gg->CPointFirst[c] = ccn;	gg->CSideFirst[c] = ccs;	for(i=0;i<rpoints;i++){		gg->CPoint[ccn++] = num[i];	// at first the points 	}	wzGridCellSegment(*gg,c) = num[i++];	// now the segment 	for(j=0;j<rpoints;i++,j++){		// now the neighbour cells: 		if(num[i]>0)		gg->CSide[ccs++] = num[i];		else if(num[i]<0)	gg->CSide[ccs++] = rcells - num[i];		else 			gg->CSide[ccs++] = 0;	} } fgets(buffer,buflen,file); if(!strcmp(buffer,"FACES")) return ibg2Error; fgets(buffer,buflen,file); rc = sscanf(buffer,"%d",&fcells);	// the number of boundary face cells  if(rc != 1) return ibg2Error; gg->lastFace	= gg->cells.last()	= gg->maxCell	= cells = rcells+fcells; gg->firstEdge	= gg->firstNode	= 1; gg->lastEdge	= gg->lastNode	= 0; if(wzGridGDIM(*gg)==1){       	cpoints = 2*rcells + 1;	csides = 2*rcells + 2*fcells + 1; }else if(wzGridGDIM(*gg)==2){	cpoints = 3*rcells + 2*fcells + 1;	csides = 3*rcells + 4*fcells + 1; }else if(wzGridGDIM(*gg)==3){	cpoints = 4*rcells + 3*fcells + 1;	csides = 4*rcells + 5*fcells + 1; }		      gg->freeCPoint	= cpoints-1; gg->freeCSide	= csides-1; wzAssert(fcells<=fcellsguess);  wenn das fehlschlaegt, reallocieren: gg->maxCPoint	= cpoints; gg->maxCSide	= csides; gg->CellType	= (wzCellType*)malloc((cells+1)*sizeof(wzCellType)); gg->CellSegment = (ibg2Segment*)malloc((cells+1)*sizeof(ibg2Segment)); gg->CPointFirst = (int*)malloc((cells+1)*sizeof(int)); gg->CSideFirst = (int*)malloc((cells+1)*sizeof(int)); gg->CPoint	= (int*)malloc((cpoints+1)*sizeof(int)); gg->CSide	= (int*)malloc((csides+1)*sizeof(int));  -------- for(cb=1;cb<=fcells;c++,cb++){	for(i=0;i<9;i++) num[i]=0;	fgets(buffer,buflen,file);	rc = sscanf(buffer,"%d %d %d %d %d %d %d %d %d ",		&num[0],&num[1],&num[2],&num[3],		&num[4],&num[5],&num[6],&num[7],&num[8]);	gg->CellType[c] = ftyp;	wzAssert(gg->CellType[c] == ftyp);	gg->CPointFirst[c] = ccn;	// begin of point list 	gg->CSideFirst[c] = ccs;	// begin of neighbour list 	for(i=0;i<fpoints;i++){	    	gg->CPoint[ccn++] = num[i];	}	u  = num[i++];		// segment  number 	cl = num[i++];		// left  neighbour (cell or segment number) 	cr = num[i++];		// right neighbour (cell or segment number) 	for(j=0;j<fpoints;j++){		gg->CSide[ccs++] = rcells+num[i++];	}	gg->CSide[ccs++] = cl;	gg->CSide[ccs++] = cr;	if(u==0){ // automatical generation of boundary face segment number 	    if(cl>0) ul = wzGridCellSegment(*gg,cl);	    else     ul = -cl;	    if(cr>0) ur = wzGridCellSegment(*gg,cr);	    else     ur = -cr;	    u = ibg2DefaultFaceNr(ul,ur);	}	wzGridCellSegment(*gg,c) = u; } return ibg2Success;readerror: wzGridFree(gg); return ibg2Error;*/}void wzGridInit(){wzCellTypeInit();}wzName		ibg2OSNoName=0;/*wzGrid		ibg2g;int ibg2g2find(wzFloat *xx, int c0);*/  /*int wzGridNRealloc(wzGrid *g){  wzAssert(0);  return 0; if(g->lastPoint<g->maxPoint)	return 1; ibg2g = *g; max=3*lastPoint/2 + 100; if((adr=realloc(Point,max*sizeof(wzPoint)))==ibg2NULL){goto noverflow;} Point = (wzPoint *) adr; if(PointCell!=ibg2NULL){ 	if((adr=realloc(PointCell,max*sizeof(int)))==ibg2NULL)	 	{goto noverflow;} 	PointCell = (int*)adr; } if(wzGridHasPointData(*this)){	if((adr=realloc(PointData,max*(NDataSize)))==ibg2NULL)	 	{goto noverflow;}	PointData = adr; } maxPoint=max-10; *g = ibg2g; return 1;noverflow: return 0;} */static int er1,er2;/*int wzDelaunayGenerator::gceleFace(int c, ibg2Segment m0, ibg2Segment m1){ int i,*cnn=ccn(c),b0,b1,first=1; wzCellType t=cct(c); wzPoint *n; b0 = ibg2DefaultFaceNr(m0,m1); if(m1==ibg2_OutsideRegionNr) return b0; for(i=0;i<wzCellTypePoints(t);i++){      	n = &(wzGridPoint(*this,cnn[i]));	if(ibg2pType(*n)==ibg2SRegion){		er1++; 		return ibg2Error;	}else if(ibg2pType(*n)==ibg2SFace){		if((b1=ibg2pSegment(*n))!=b0){			if(first==0) {			 	er2++;				return ibg2Error;			}			if(b1>=ibg2SMAX){			 	er2++;				return ibg2Error;			}			b0=b1;			first=0; continue;		}	} } return b0; return 0;} *//*int wzDelaunayGenerator::gcellSetFace(int c, ibg2Segment m0, ibg2Segment m1){wzCellType t=cct(c); return	ibg2DefaultFaceNr(m0,m1);}void wzDelaunayGenerator::MaklFaces(cogeometry g){int c0,cl0,cs,cn,m,m1,s,i,b0; int *cn0,*css,*csn,*cnn; wzCellType t,ts,tn; ibg2Geom = ibg2dCogeometry(g); if(gdim()<1){ 	Grid.firstFace=1; Grid.lastFace=0;	return; } er1 = er2 = 0; Grid.firstFace= Grid.cells.last()+1; cl0=Grid.cells.last(); for(c0=1;c0<=cl0;c0++) if(ccdef(c0)){	if((m=ccu(c0))<=0) continue;	t=cct(c0);	for(s=0;s<wzCellTypeSides(t);s++){		cs=ccs(c0)[s];		if(ccout(cs)) m1=ibg2_OutsideRegionNr; /* Au"senrand 		else if(wzCellTypeCODIM(cct(cs))!=ibg2SRegion)	continue;		else if(m<=(m1=ccu(cs)))		continue;		switch(wzCellTypeSSize(ts=cct(cs),s)){			case 1:	tn=wzCellType1Node;		break;			case 2:	tn=wzCellType2Line;		break;			case 3: tn=wzCellType3Triangle;	break;			case 4: tn=wzCellType3Rectangle;	break;		}		wzAssert(wzCellTypePoints(tn)==wzCellTypeSSize(t,s));		cn = createCell(tn); 		cct(cn)=tn;		cnn=ccn(cn); csn=ccs(cn); css=ccs(cs); cn0=ccn(c0);		for(i=0;i<wzCellTypePoints(tn);i++){		      	cnn[i] = cn0[wzCellTypeSPoint1(t,s,i)];		}		for(i=0;i<wzCellTypeSides(tn);i++) csn[i]=0;		cnn[wzCellTypeSExtR(tn)]=c0;		cnn[wzCellTypeSExtL(tn)]=cs;		ccs(c0)[s]=cn;		for(i=0;i<wzCellTypeSides(ts);i++) if(css[i]==c0) {css[i]=cn; break;}		b0 = gceleFace(cn,m,m1);		if(b0<0){ccu(cn)=b0=gcellSetFace(cn,m,m1);}		else ccu(cn)=b0;	} } Grid.lastFace = Grid.cells.last();}void wzDelaunayGenerator::MakeEdges(cogeometry g){int c0,co,c1,c2,cl,m0,ni,n0,i; int *cn0,*cno,*cn1,*cln,*cso,bs0,bs1,bso; wzCellType tl,t0,t1,t2; int s0,s1,s2,p1,p2,first; if(gdim()<2){	Grid.firstFace=1; Grid.lastFace=0;	return; } ibg2Geom = ibg2dCogeometry(g); Grid.firstEdge=Grid.cells.last()+1; for(c0=Grid.firstFace;c0<=Grid.lastFace;c0++){t0=cct(c0);   for(s0=0;s0<wzCellTypeSides(t0);s0++){	if((ccs(c0))[s0]!=0) continue;	n0=(cn0=ccn(c0))[wzCellTypeSPoint1(t0,s0,0)];/* search of the first (after c0) ibg2SFace-element c1: 	co=c0; c1=cn0[wzCellTypeSExtR(t0)];	while(wzCellTypeCODIM(t1=cct(c1))==ibg2SRegion){		cso=ccs(c1);cno=ccn(c1);	 	for(s1=0;s1<wzCellTypeSides(t1);s1++) if(cso[s1]==co) break;		wzAssert(s1<wzCellTypeSides(t1));		for(p1=0;p1<wzCellTypeSSize(t1,s1);p1++)			if(cno[wzCellTypeSPoint1(t1,s1,p1)]==n0) break;	    	co=c1;c1=cso[wzCellTypeSSide(t1,s1,p1)];	}/* search of orientation in c1 	if(co==(cn1=ccn(c1))[wzCellTypeSExtL(t1)]){		for(s1=0;s1<wzCellTypeSides(t1);s1++)			if(cn1[wzCellTypeSPoint1(t1,s1,0)]==n0) break;		wzAssert(s1<wzCellTypeSides(t1));		co=c1;c2=cn1[wzCellTypeSExtR(t1)];	}else if(co==cn1[wzCellTypeSExtR(t1)]){		for(s1=0;s1<wzCellTypeSides(t1);s1++)			if(ccn(c1)[wzCellTypeSPoint1(t1,s1,1)]==n0) break;		wzAssert(s1<wzCellTypeSides(t1));	      	co=c1;c2=cn1[wzCellTypeSExtL(t1)];	}else wzAssert(0);	wzAssert(c0!=c1);	first=1;	do{/* search of the next ibg2SFace-element c2:     	    while(wzCellTypeCODIM(t2=cct(c2))==ibg2SRegion){

⌨️ 快捷键说明

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