📄 cogsimple.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 + -