📄 ibgd2d.c
字号:
/* last edit: Ilja Schmelzer -------------- 10-JUN-1994 15:04:57.96 */
/************************************************************************/
/* */
/* <<< 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") */
/* */
/************************************************************************/
/* <<< ibgD2D >>> - Intersection-Based Geometry - 2D intersection of 3D geom.
*/
#include "ibglib.h"
#include "ibgi.h"
#include "ibgd.h"
#include "ibg.h"
#include "ibgd0.h"
typedef struct{
ibGeometryRec g;
ibGeometry gold;
ibgFloat z;
}ibgD2DRec,*ibgD2D;
static int RegionOfPoint(ibGeometry g, ibgPoint *nint, ibgPoint *nold)
{ibgD2D gz = (ibgD2D )g;
ibgFloat z0,z1;
int rc;
z0 = ibgpX(*nint)[2];
ibgpX(*nint)[2] = gz->z;
if(nold){
z1 = ibgpX(*nold)[2];
ibgpX(*nold)[2] = gz->z;
}
rc = ibgiRegionOfPoint(gz->gold,nint,nold);
ibgpX(*nint)[2] = z0;
if(nold){
ibgpX(*nold)[2] = z1;
}
return rc;
}
static int FaceWithEdge(ibGeometry g, ibgPoint *nint,
ibgPoint *n1, ibgPoint *n2)
{ibgD2D gz = (ibgD2D )g;
ibgDouble xx,yy,dx,dy,dd,pp,z1,z2;
int rc;
z1 = ibgpX(*n1)[2];
z2 = ibgpX(*n2)[2];
ibgpX(*n1)[2] = gz->z;
ibgpX(*n2)[2] = gz->z;
rc = ibgiFaceWithEdge(gz->gold,nint,n1,n2);
ibgpX(*n1)[2] = z1;
ibgpX(*n2)[2] = z2;
dx = ibgpX(*n2)[0] - ibgpX(*n1)[0];
dy = ibgpX(*n2)[1] - ibgpX(*n1)[1];
xx = ibgpX(*nint)[0] - ibgpX(*n1)[0];
yy = ibgpX(*nint)[1] - ibgpX(*n1)[1];
dd = dx*dx + dy*dy;
if(dd <= 0.0) pp = 0.0;
else pp = (xx*dx + yy*dy)/dd;
ibgpX(*nint)[2] = z1 + pp*(z2-z1);
return rc;
}
static int LineWithTriangle(ibGeometry g, ibgPoint *nint, ibgPoint *nface,
ibgPoint *n1, ibgPoint *n2, ibgPoint *n3)
{ibgD2D gz = (ibgD2D )g;
ibgDouble xx,yy,dx,dy,ex,ey,dd,p2,p3,z1,z2,z3;
int rc;
z1 = ibgpX(*n1)[2];
z2 = ibgpX(*n2)[2];
z3 = ibgpX(*n3)[2];
ibgpX(*n1)[2] = gz->z;
ibgpX(*n2)[2] = gz->z;
ibgpX(*n3)[2] = gz->z;
rc = ibgiLineWithTriangle(gz->gold,nint,nface,n1,n2,n3);
ibgpX(*n1)[2] = z1;
ibgpX(*n2)[2] = z2;
ibgpX(*n3)[2] = z3;
dx = ibgpX(*n2)[0] - ibgpX(*n1)[0];
dy = ibgpX(*n2)[1] - ibgpX(*n1)[1];
ex = ibgpX(*n3)[0] - ibgpX(*n1)[0];
ey = ibgpX(*n3)[1] - ibgpX(*n1)[1];
xx = ibgpX(*nint)[0] - ibgpX(*n1)[0];
yy = ibgpX(*nint)[1] - ibgpX(*n1)[1];
dd = dx*ey - dy*ex;
if(dd == 0.0) p2 = p3 = 0.0;
else{
p2 = (dx*yy - dy*xx) / dd;
p3 = (xx*ey - yy*ex) / dd;
}
ibgpX(*nint)[2] = z1 + p3*(z2-z1) + p2*(z3-z1);
return rc;
}
static int Free(ibGeometry g)
{ibgD2D gz=((ibgD2D )g);
ibgdFree(gz->gold);
return ibgSuccess;
}
static ibGeometryClassRec ibgD2DClass;
ibGeometry ibgd2D(ibGeometry gold, ibgFloat z)
{ibgD2DRec *fnc;
fnc = malloc(sizeof(ibgD2DRec));
fnc->gold = gold;
fnc->z = z;
ibgdInitialize((ibGeometry)fnc,&ibgD2DClass);
ibgD2DClass.RegionOfPoint = (ibgdFunctionRegionOfPoint)RegionOfPoint;
ibgD2DClass.FaceWithEdge = (ibgdFunctionFaceWithEdge)FaceWithEdge;
ibgD2DClass.LineWithTriangle = (ibgdFunctionLineWithTriangle)LineWithTriangle;
ibgD2DClass.Free = Free;
return (ibGeometry)fnc;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -