📄 ibgt.c
字号:
/* last edit: Ilja Schmelzer -------------- 17-OCT-1994 19:09:59.45 */
/************************************************************************/
/* */
/* <<< I B G >>> - Intersection - Based Grid generation package */
/* */
/* Version 1.1 by Ilja Schmelzer schmelzer@iaas-berlin.d400.de */
/* */
/* to be distributed under IBG license conditions (see "readme.ibg") */
/* */
/************************************************************************/
/* <<< Topology >>>
Package for control of the status using only segment numbers:
*/
#include "ibg.h"
#include "ibgi.h"
#include "ibgd0.h"
#include "ibglib.h"
void ibgtNewFace(ibgTopology t, ibgSegment snew, ibgSegment old)
{ibgSegment u1,u2,*adr; int i,l;
if(snew>=ibgSMAX) ibgfatal;
if(snew<=0) ibgfatal;
if(old<=0) return;
if(old<ibgSMAX){
for(i=0;i<t->fregs;i++){
t->freg[i][snew] = t->freg[i][old];
} return;
}
u1 = old/ibgSMAX;
u2 = old%ibgSMAX;
if(u1==u2) l=1; else l=2;
while(t->fregs<l){
adr = (ibgSegment*)calloc(ibgSMAX,sizeof(int));
if(adr!=NULL){
t->freg[t->fregs] = adr;
t->fregs++;
}else {ibgmessage(ibgMEOverflow); return;}
}
t->freg[0][snew] = u1;
if(u1 != u2) t->freg[1][snew] = u2;
}
void ibgtAppendFRegion(ibgTopology t, ibgSegment face, ibgSegment reg)
{int i;ibgSegment *adr;
if(face>=ibgSMAX) ibgfatal;
if(face<=0) ibgfatal;
for(i=0;i<t->fregs;i++){
if(t->freg[i][face]) continue;
t->freg[i][face] = reg;
return;
}
if(t->fregs >= IBGTMAXFREGS){ibgmessage(ibgMEMaxFRegs); return;}
adr = (ibgSegment*)calloc(ibgSMAX,sizeof(int));
if(adr!=NULL){
t->freg[t->fregs] = adr;
t->freg[t->fregs][face] = reg;
t->fregs++;
}else {ibgmessage(ibgMEOverflow); return;}
}
int ibgtStatusRV(ibgTopology top, int u1, int u2){return ibgUnknown;}
int ibgtStatusFV(ibgTopology top, int u1, int u2){return ibgUnknown;}
int ibgtStatusLV(ibgTopology top, int u1, int u2){return ibgUnknown;}
int ibgtStatusVV(ibgTopology top, int u1, int u2){return ibgUnknown;}
int ibgtStatusRF(ibgTopology top, int u1, int u2)
{int i; ibgSegment r;
if(u2<ibgSMAX){
for(i=0;i<top->fregs;i++){
if(r=top->freg[i][u2]){
if(r==u1) return ibgCorrect;
}else return ibgIncorrect;
}
return ibgIncorrect;
}
if(u1 == u2/ibgSMAX) return ibgCorrect;
if(u1 == u2%ibgSMAX) return ibgCorrect;
return ibgIncorrect;
}
int ibgtStatusFF(ibgTopology top, int u1, int u2)
{int m11,m12,m21,m22;
if(u1<ibgSMAX) return ibgUnknown;
if(u2<ibgSMAX) return ibgUnknown;
m11 = u1/ibgSMAX;
if(m11==(m21 = u2/ibgSMAX)) return ibgCorrect;
if(m11==(m22 = u2%ibgSMAX)) return ibgCorrect;
m12 = u1%ibgSMAX;
if(m12==m21) return ibgCorrect;
if(m12==m22) return ibgCorrect;
return ibgIncorrect;
}
int ibgtStatusRL(ibgTopology top, int u1, int u2)
{int u3;
if((u3=u2/ibgSMAX)==0) return ibgUnknown;
if(u1 == u2%ibgSMAX) return ibgCorrect;
if(u1 == u3/ibgSMAX) return ibgCorrect;
if(u1 == u3%ibgSMAX) return ibgCorrect;
return ibgIncorrect;
}
int ibgtStatusFL(ibgTopology top, int u1, int u2)
{int m1,u3;
if(u1<ibgSMAX) return ibgUnknown;
if((u3=u2/ibgSMAX)==0) return ibgUnknown;
m1 = u1/ibgSMAX;
if(m1 == u2%ibgSMAX) return ibgCorrect;
if(m1 == u3/ibgSMAX) return ibgCorrect;
if(m1 == u3%ibgSMAX) return ibgCorrect;
m1 = u1%ibgSMAX;
if(m1 == u2%ibgSMAX) return ibgCorrect;
if(m1 == u3/ibgSMAX) return ibgCorrect;
if(m1 == u3%ibgSMAX) return ibgCorrect;
return ibgIncorrect;
}
int ibgtStatusLL(ibgTopology top, int u1, int u2)
{int m0,m1,u3;
if((m0=u1/ibgSMAX)==0) return ibgUnknown;
if((u3=u2/ibgSMAX)==0) return ibgUnknown;
m1 = m0%ibgSMAX;
if(m1 == u2%ibgSMAX) return ibgCorrect;
if(m1 == u3/ibgSMAX) return ibgCorrect;
if(m1 == u3%ibgSMAX) return ibgCorrect;
m1 = u1%ibgSMAX;
if(m1 == u2%ibgSMAX) return ibgCorrect;
if(m1 == u3/ibgSMAX) return ibgCorrect;
if(m1 == u3%ibgSMAX) return ibgCorrect;
m1 = m0/ibgSMAX;
if(m1 == 0) return ibgIncorrect;
if(m1 == u2%ibgSMAX) return ibgCorrect;
if(m1 == u3/ibgSMAX) return ibgCorrect;
if(m1 == u3%ibgSMAX) return ibgCorrect;
return ibgIncorrect;
}
/* test of compatibility of the segments of the points of an edge */
int ibgiStatusOfEdge(ibGeometry geom, ibgPoint *n1, ibgPoint *n2)
{ibgSegment m1=ibgpSegment(*n1),m2=ibgpSegment(*n2);
switch(ibgpType(*n1)){
case ibgSRegion:
switch(ibgpType(*n2)){
case ibgSRegion: if(m1==m2) return ibgCorrect;
else return ibgIncorrect;
case ibgSFace: return ibgtStatusRF(&geom->top,m1,m2);
case ibgSLine: return ibgtStatusRL(&geom->top,m1,m2);
case ibgSNode: return ibgtStatusRV(&geom->top,m1,m2);
}
case ibgSFace:
switch(ibgpType(*n2)){
case ibgSRegion: return ibgtStatusRF(&geom->top,m2,m1);
case ibgSFace: return ibgtStatusFF(&geom->top,m1,m2);
case ibgSLine: return ibgtStatusFL(&geom->top,m1,m2);
case ibgSNode: return ibgtStatusFV(&geom->top,m1,m2);
}
case ibgSLine:
switch(ibgpType(*n2)){
case ibgSRegion: return ibgtStatusRL(&geom->top,m2,m1);
case ibgSFace: return ibgtStatusFL(&geom->top,m2,m1);
case ibgSLine: return ibgtStatusLL(&geom->top,m1,m2);
case ibgSNode: return ibgtStatusLV(&geom->top,m1,m2);
}
case ibgSNode:
switch(ibgpType(*n2)){
case ibgSRegion: return ibgtStatusRV(&geom->top,m2,m1);
case ibgSFace: return ibgtStatusFV(&geom->top,m2,m1);
case ibgSLine: return ibgtStatusLV(&geom->top,m2,m1);
case ibgSNode: return ibgtStatusVV(&geom->top,m1,m2);
}
}
}
void ibgtInit(ibgTopology t)
{
t->fregs = 0;
}
void ibgtCopy(ibgTopology tnew, ibgTopology told)
{
*tnew = *told;
}
void ibgtFree(ibgTopology t)
{
;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -