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

📄 cogsimple.cxx

📁 有限元学习研究用源代码(老外的),供科研人员参考
💻 CXX
字号:
 
#include "cogsimple.hxx"
#include "coglib.hxx"

#ifndef cogfunction_hxx
#include "cogfunction.hxx"
#endif

CogeometryPlane::CogeometryPlane(
			cogFloat  x, cogFloat  y, cogFloat  z,
			cogFloat ax, cogFloat ay, cogFloat az, 
			cogRegion rp, cogRegion rm)
:CogeometryWithRegions(*(cogPointToSegment*)this)
{
 rminus = rm; rplus = rp;
 setDirection(ax,ay,az);
 setPoint(x,y,z);
}

CogeometryPlane::CogeometryPlane(cogRegion rp, cogRegion rm)
:CogeometryWithRegions(*(cogPointToSegment*)this)
{
 rminus = rm; rplus = rp;
 setDirection(1,0,0);
 setPoint(0,0,0);
}

cogSegment CogeometryPlane::operator()(const cogPoint& p) const
{
 if((a[0]*p[0]+a[1]*p[1]+a[2]*p[2]-d)>0) return rplus;
 return rminus;
}

void CogeometryPlane::setDirection(cogFloat x, cogFloat y, cogFloat z)
{
 a[0] = x;  a[1] = y;  a[2] = z; d = 0;
}

void CogeometryPlane::setPoint(cogFloat x, cogFloat y, cogFloat z)
{
 d = (a[0]*x+a[1]*y+a[2]*z); 
}

CogeometryEllipsoid::CogeometryEllipsoid(
			cogFloat  x, cogFloat  y, cogFloat  z,
			cogFloat rx, cogFloat ry, cogFloat rz, 
			cogRegion rinside, cogRegion routside)
:CogeometryWithRegions(*(cogPointToSegment*)this)
{
 rin = rinside; rout = routside;
 setRadius(rx,ry,rz);
 setCenter(x,y,z);
}
CogeometryEllipsoid::CogeometryEllipsoid(
			cogRegion rinside, cogRegion routside)
:CogeometryWithRegions(*(cogPointToSegment*)this)
{
 rin = rinside; rout = routside;
 setRadius();
 setCenter();
}

cogSegment CogeometryEllipsoid::operator()(const cogPoint& p) const
{cogFloat dd=0, rr;
 cogIndex d;
 for(d=0;d<3;d++){  // directions
	rr = (p[d]-c[d]);
	rr /= r[d]; dd += rr*rr;
 }
 if(dd>1) return rout; 
 return rin;
}

void CogeometryEllipsoid::stretchRadius(cogFloat f)
{
 r[0] *= f;  r[1] *= f;  r[2] *= f; 
}

void CogeometryEllipsoid::stretchRadius(cogFloat fx, cogFloat fy, cogFloat fz)
{
 r[0] *= fx;  r[1] *= fy;  r[2] *= fz; 
}
void CogeometryEllipsoid::setSphere(cogFloat f)
{
 r[0] = f;  r[1] = f;  r[2] = f; 
}

void CogeometryEllipsoid::setRadius(cogFloat fx, cogFloat fy, cogFloat fz)
{
 r[0] = fx;  r[1] = fy;  r[2] = fz; 
}

void CogeometryEllipsoid::moveCenter(cogFloat x, cogFloat y, cogFloat z)
{
 c[0] += x;  c[1] += y;  c[2] += z; 
}

void CogeometryEllipsoid::setCenter(cogFloat x, cogFloat y, cogFloat z)
{
 c[0] = x;  c[1] = y;  c[2] = z; 
}


CogeometryTorus::CogeometryTorus(
			cogFloat  x, cogFloat  y, cogFloat  z,
			cogFloat rbig, cogFloat rsmall, 
			cogRegion rinside, cogRegion routside)
:CogeometryWithRegions(*(cogPointToSegment*)this)
{
 rin = rinside; rout = routside;
 setScale(rbig,rsmall);
 setCenter(x,y,z);
}
CogeometryTorus::CogeometryTorus(
			cogRegion rinside, cogRegion routside)
:CogeometryWithRegions(*(cogPointToSegment*)this)
{
 rin = rinside; rout = routside;
 setScale(3,1);
 setCenter();
}

cogSegment CogeometryTorus::operator()(const cogPoint& x) const
{cogFloat xx=x[0]-c[0],yy=x[1]-c[1],zz=x[2]-c[2];
 cogFloat r2=xx*xx+yy*yy, z2=zz*zz/rz2;
 cogFloat p =r2+z2+rp, pp=p*p-rs*r2;
 if(pp>0) return rout; 
 return rin;
}

void CogeometryTorus::setScale(cogFloat rbig, cogFloat rsmall)
{
 rz2 = 1;	//(rbig-rsmall)*(rbig-rsmall);
 rp  = rbig*rsmall;
 rs  = (rbig+rsmall)*(rbig+rsmall);
}

void CogeometryTorus::moveCenter(cogFloat x, cogFloat y, cogFloat z)
{
 c[0] += x;  c[1] += y;  c[2] += z; 
}

void CogeometryTorus::setCenter(cogFloat x, cogFloat y, cogFloat z)
{
 c[0] = x;  c[1] = y;  c[2] = z; 
}

⌨️ 快捷键说明

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