📄 ibgdsplitl.c
字号:
/* last edit: Ilja Schmelzer -------------- 17-OCT-1994 19:20:32.33 */
/************************************************************************/
/* */
/* <<< 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") */
/* */
/************************************************************************/
/* <<< IBGDSplitLine >>> - Intersection-Based Geometry Definition
Splitting a Line
*/
#define const
#include "ibglib.h"
#include "ibgd.h"
#include "ibgi.h"
#include "ibgd0.h"
#include "ibgdefault.h"
typedef struct{
ibGeometryRec g;
ibGeometry gold;
ibgSegment lold,lnew,node;
ibgFloat (*func)(ibgPtObject fThis, ibgPoint *x);
ibgPtObject fThis;
ibgFloat epsilon;
}ibgSplitLineRec,*ibgSplitLine;
static int RegionOfPoint(ibGeometry geom, ibgPoint *nnew, ibgPoint *nold)
{ibgSplitLine splt= (ibgSplitLine)geom;
return ibgiRegionOfPoint(splt->gold,nnew,nold);
}
static int FaceWithEdge(ibGeometry g, ibgPoint *nint,
ibgPoint *n1, ibgPoint *n2)
{ibgSplitLine splt = (ibgSplitLine) g;
return ibgiFaceWithEdge(splt->gold,nint,n1,n2);
}
static int LineWithTriangle(ibGeometry g, ibgPoint *nint, ibgPoint *nface,
ibgPoint *n1, ibgPoint *n2, ibgPoint *n3)
{ibgSplitLine splt = (ibgSplitLine ) g;
int rc = ibgiLineWithTriangle(splt->gold,nint,nface,n1,n2,n3);
if(ibgpSegment(*nint) == splt->lold){
if(splt->func(splt->fThis,nint)>0){
ibgpSegment(*nint) = splt->lnew;
}
}
return rc;
}
static int Free(ibGeometry g)
{ibgSplitLine splt = (ibgSplitLine ) g;
ibgdFree(splt->gold);
return ibgSuccess;
}
static ibGeometryClassRec ibgSplitLineClass;
ibGeometry ibgdSplitLine(ibGeometry gold,
ibgSegment lnew,
ibgSegment lold,
ibgFloat (*func)(ibgPtObject fThis, ibgPoint *n),
ibgPtObject fThis,
ibgFloat Dfunc)
{ibgSplitLine splt=(ibgSplitLine) malloc(sizeof(ibgSplitLineRec));
ibgdInitialize((ibGeometry)splt,&ibgSplitLineClass);
ibgtCopy(&(splt->g.top),&(gold->top));
splt->gold=gold;
splt->lold=lold; splt->lnew=lnew;
splt->node=ibgDefaultNodeNr;
splt->func=func; splt->fThis=fThis;
splt->epsilon = 0.5*splt->g.Delta*Dfunc;
ibgSplitLineClass.RegionOfPoint = RegionOfPoint;
ibgSplitLineClass.FaceWithEdge = FaceWithEdge;
ibgSplitLineClass.LineWithTriangle = LineWithTriangle;
ibgSplitLineClass.Free = Free;
return (ibGeometry) splt;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -