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

📄 ibgd2d.c

📁 有限元学习研究用源代码(老外的),供科研人员参考
💻 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 + -