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

📄 trimodel.c

📁 su 的源代码库
💻 C
📖 第 1 页 / 共 2 页
字号:
                ds = sqrt(dx*dx+dy*dy);                xou[i]=xs;                you[i]=ys;                agou[i]=90.-atan2(-dx,dy)*180/PI;                fprintf(xzfp,"%f %f\n",xs,ys);        }        /*output interface (x,z,angle)*/        fwrite(xou,sizeof(float),nrays,xfp);        fwrite(you,sizeof(float),nrays,zfp);        fwrite(agou,sizeof(float),nrays,afp);        } /* end of if */	/* free workspace */	free1float(uin);	free1float(u);	free1float((float*)xind);	free1float((float*)yind);	free1float((float*)sind);	/* set output parameters before returning */	*nout = n;  *xout = x;  *yout = y;  *sout = s;	*txout = tx;  *tyout = ty;  *cout = c;}static void smoothTwoSegments (float maxangle, int i,	int nd, float ud[], float xd[][4], float yd[][4],	int *n, float *u[], float *x[], float *y[])/* used by smoothLineSegments to smooth just two adjacent line segments */{	int no,inew,j;	float *uo,*xo,*yo,xm,ym,xp,yp,dot,ams,aps,cosa,angle;	/* input/output arrays describing line segments */	no = *n;  uo = *u;  xo = *x;  yo = *y;	/* if at endpoint, simply return */	if (i==0 || i==no-1) return;	/* line segments joined at vertex i */	xm = xo[i]-xo[i-1];  ym = yo[i]-yo[i-1];	xp = xo[i+1]-xo[i];  yp = yo[i+1]-yo[i];	/* angle between segments */	dot = xm*xp+ym*yp;	ams = xm*xm+ym*ym;	aps = xp*xp+yp*yp;	cosa = dot/sqrt(ams*aps);	cosa = MAX(-1.0,MIN(1.0,cosa));	angle = acos(cosa);	/* if angle is small enough, simply return */	if (angle<=maxangle) return;	/* make room for new vertex */	no++;	uo = erealloc1float(uo,no);	xo = erealloc1float(xo,no);	yo = erealloc1float(yo,no);	/* divide longest segment */	inew = (ams>aps)?i:i+1;	for (j=no-1; j>inew; --j) {		uo[j] = uo[j-1];		xo[j] = xo[j-1];		yo[j] = yo[j-1];	}	uo[inew] = 0.5*(uo[inew-1]+uo[inew+1]);	intcub(0,nd,ud,xd,1,&uo[inew],&xo[inew]);	intcub(0,nd,ud,yd,1,&uo[inew],&yo[inew]);	/* smooth line segments affected by new vertex */	smoothTwoSegments(maxangle,inew,nd,ud,xd,yd,&no,&uo,&xo,&yo);	smoothTwoSegments(maxangle,inew-1,nd,ud,xd,yd,&no,&uo,&xo,&yo);	smoothTwoSegments(maxangle,inew+1,nd,ud,xd,yd,&no,&uo,&xo,&yo);	/* set output parameters before returning */	*n = no;  *u = uo;  *x = xo;  *y = yo;}static Vertex *newVertex (Model *m, Vertex *vlast,	float x, float z, float s)/* make a new vertex */{	Vertex *v;	VertexAttributes *va;	v = addVertexToModel(m,z,x);	if (v==NULL) v = nearestVertexInModel(m,vlast,z,x);	if (v->va==NULL)		v->va = va = (VertexAttributes*)			ealloc1(1,sizeof(VertexAttributes));	else		va = v->va;	va->s = s;	return v;}static void setEdgeAttributes (Vertex *v1, Vertex *v2, int k)/* set edge attributes for fixed edge between two connected vertices */{	VertexUse *vu;	EdgeUse *eu;	EdgeAttributes *ea;	/* determine edge use from v1 to v2 */	vu = v1->vu;	do {		eu = vu->eu;		if (eu->euMate->vu->v==v2) break;		vu = vu->vuNext;	} while (vu!=v1->vu);	/* if v1 and v2 not connected, just return */	if (eu->euMate->vu->v!=v2) return;	/* set edge attributes for edge between v1 and v2 */	eu->e->ea = ea = (EdgeAttributes*) ealloc1(1,sizeof(EdgeAttributes));	ea->k = k;}static void setEdgeUseAttributes (Vertex *v1, Vertex *v2,	float tx1, float tz1, float c1, float tx2, float tz2, float c2)/* set edge-use attributes for fixed edge between two connected vertices */{	VertexUse *vu;	EdgeUse *eu;	EdgeUseAttributes *eua;	/* determine edge use from v1 to v2 */	vu = v1->vu;	do {		eu = vu->eu;		if (eu->euMate->vu->v==v2) break;		vu = vu->vuNext;	} while (vu!=v1->vu);	/* if v1 and v2 not connected, just return */	if (eu->euMate->vu->v!=v2) return;	/* set edge-use attributes for edge-use from v1 to v2 */	eu->eua = eua = (EdgeUseAttributes*)		ealloc1(1,sizeof(EdgeUseAttributes));	eua->tx = tx1;	eua->tz = tz1;	eua->c = c1;	/* set edge-use attributes for edge-use from v2 to v1 */	eu = eu->euMate;	eu->eua = eua = (EdgeUseAttributes*)		ealloc1(1,sizeof(EdgeUseAttributes));	eua->tx = tx2;	eua->tz = tz2;	eua->c = c2;}static void makeSlothForTri (Tri *t)/* make sloth function for triangle */{	FaceAttributes *fa;	VertexAttributes *va;	double x1,z1,x2,z2,x3,z3,s1,s2,s3,		x2mx1,z2mz1,s2ms1,x3mx1,z3mz1,s3ms1,		a,b,det,s00,dsdx,dsdz;		x1 = t->eu->vu->v->y;	z1 = t->eu->vu->v->x;	va = t->eu->vu->v->va;	s1 = va->s;	x2 = t->eu->euCW->vu->v->y;	z2 = t->eu->euCW->vu->v->x;	va = t->eu->euCW->vu->v->va;	s2 = va->s;	x3 = t->eu->euCCW->vu->v->y;	z3 = t->eu->euCCW->vu->v->x;	va = t->eu->euCCW->vu->v->va;	s3 = va->s;	x2mx1 = x2-x1;  z2mz1 = z2-z1;  s2ms1 = s2-s1;	x3mx1 = x3-x1;  z3mz1 = z3-z1;  s3ms1 = s3-s1;	det = z3mz1*x2mx1-z2mz1*x3mx1;	a = z3mz1*s2ms1-z2mz1*s3ms1;	b = s3ms1*x2mx1-s2ms1*x3mx1;	dsdx = a/det;	dsdz = b/det;	s00 = s2-dsdx*x2-dsdz*z2;	t->fa = fa = (FaceAttributes*) ealloc1(1,sizeof(FaceAttributes));	fa->s00 = s00;  fa->dsdx = dsdx;  fa->dsdz = dsdz;        fa->dens = FLT_MAX;  fa->qfac = FLT_MAX;}static void fillsloth (Model *m, int nr, float **sr)/* fill regions bounded by fixed edges with sloths */{	int ir;	float x,z,x0,z0,s00,dsdx,dsdz;	Tri *t;	/* loop over regions for which sloth function is specified */	for (ir=0; ir<nr; ++ir) {		/* determine parameters of sloth function */		x = sr[ir][0];  z = sr[ir][1];		x0 = sr[ir][2];  z0 = sr[ir][3];		s00 = sr[ir][4];  dsdx = sr[ir][5];  dsdz = sr[ir][6];		/* adjust v0 for x0 and z0 */		s00 -= x0*dsdx+z0*dsdz;		/* determine triangle containing point (x,z) */		t = insideTriInModel(m,NULL,z,x);		/* flood triangles in region */		setsloth(t,s00,dsdx,dsdz);	}}static void setsloth (Tri *t, float s00, float dsdx, float dsdz)/* recursively set sloth functions in triangles */{	EdgeUse *eu;	FaceAttributes *fa;	/* if sloth already set, then return */	if ((fa=t->fa)!=NULL)		if (fa->s00==s00 && fa->dsdx==dsdx && fa->dsdz==dsdz)			return;	/* if necessary, allocate space for attributes */	if (fa==NULL)		t->fa = fa = (FaceAttributes*)			ealloc1(1,sizeof(FaceAttributes));	/* set attributes */	fa->s00 = s00;	fa->dsdx = dsdx;	fa->dsdz = dsdz;	/* for each edge not fixed, set attributes in opposite triangle */	eu = t->eu;	do {		if (!eu->e->fixed) setsloth(eu->euMate->f,s00,dsdx,dsdz);		eu = eu->euCW;	} while (eu!=t->eu);}static void filldens (Model *m, int nd, float **dptr)/* fill regions bounded by fixed edges with density */{	int id, filled;	float x,z,dens;	Tri *t;	Face *f;	FaceAttributes *fa;	/* loop over regions for which a density is specified */	for (id=0; id<nd; ++id) {		/* determine parameters of density function */		x = dptr[id][0];  z = dptr[id][1];		dens = dptr[id][2];  		/* determine triangle containing point (x,z) */		t = insideTriInModel(m,NULL,z,x);		/* flood triangles in region */		setdens(t,dens);	}	/* loop over faces to check that density is specified everywhere */	f = m->f;	do {		fa = f->fa;		dens = fa->dens;		for (id=0,filled=0; id<nd; ++id) {			if (dens==dptr[id][2]) {				filled = 1;				break;			}		}		if(!filled)			err("WARNING!!\n"				"CHECK THAT ALL REGIONS ARE "				"FILLED WITH A DENSITY VALUE\n");		/* next face */		f = f->fNext;	} while (f!=m->f);}static void setdens (Tri *t, float dens)/* recursively set density values in triangles */{	EdgeUse *eu;	FaceAttributes *fa;	/* if dens already set, then return */	if ((fa=t->fa)!=NULL)		if (fa->dens==dens)			return;	/* if necessary, allocate space for attributes */	if (fa==NULL)		t->fa = fa = (FaceAttributes*)			ealloc1(1,sizeof(FaceAttributes));	/* set attribute */	fa->dens = dens;	/* for each edge not fixed, set attributes in opposite triangle */	eu = t->eu;	do {		if (!eu->e->fixed) setdens(eu->euMate->f,dens);		eu = eu->euCW;	} while (eu!=t->eu);}static void fillq (Model *m, int nq, float **qptr)/* fill regions bounded by fixed edges with a Q-factor */{	int iq, filled;	float x,z,qfac;	Tri *t;	Face *f;	FaceAttributes *fa;	/* loop over regions for which Q-factor is specified */	for (iq=0; iq<nq; ++iq) {		/* determine parameters of Q-function */		x = qptr[iq][0];  z = qptr[iq][1];		qfac = qptr[iq][2];  		/* determine triangle containing point (x,z) */		t = insideTriInModel(m,NULL,z,x);		/* flood triangles in region */		setq(t,qfac);	}	/* loop over faces to check that a Q-factor is specified everywhere */	f = m->f;	do {		fa = f->fa;		qfac = fa->qfac;		for (iq=0,filled=0; iq<nq; ++iq) {			if (qfac==qptr[iq][2]) {				filled = 1;				break;			}		}		if(!filled)			err("WARNING!!\n"				"CHECK THAT ALL REGIONS ARE "				"FILLED WITH A Q-FACTOR\n");		/* next face */		f = f->fNext;	} while (f!=m->f);}static void setq (Tri *t, float qfac)/* recursively set a Q-factor in triangles */{	EdgeUse *eu;	FaceAttributes *fa;	/* if Q-factor already set, then return */	if ((fa=t->fa)!=NULL)		if (fa->qfac==qfac)			return;	/* if necessary, allocate space for attributes */	if (fa==NULL)		t->fa = fa = (FaceAttributes*)			ealloc1(1,sizeof(FaceAttributes));	/* set attribute */	fa->qfac = qfac;	/* for each edge not fixed, set attributes in opposite triangle */	eu = t->eu;	do {		if (!eu->e->fixed) setq(eu->euMate->f,qfac);		eu = eu->euCW;	} while (eu!=t->eu);}

⌨️ 快捷键说明

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