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

📄 wzpoint.hxx

📁 有限元学习研究用源代码(老外的),供科研人员参考
💻 HXX
字号:
#ifndef wzpoint_hxx
#define wzpoint_hxx

#ifndef wz_hxx
#include "wz.hxx"
#endif
#include "wzsafepointer.hxx"
#include "wzsegment.hxx"

class	wzPoint;
class   wzPointToFloat;
class   wzPointToSegment;
class   wzPointToIndex;
class   wzPointToPoint;

const  	unsigned wzPointDim      = 3;
const  	unsigned wzPointDimFloat = 3;
const  	unsigned wzPointDimIndex = 1;
const  	unsigned wzPointDimFull  = 6; // == wzPointDim+wzPointDimFull;

class wzPointToFloat{
public:
  virtual wzFloat call(const wzPoint& p) const=0;
  wzFloat operator()(const wzPoint& p) const{return call(p);}
};

class wzPointToIndex{
public:
        virtual wzIndex operator()(const wzPoint& p) const=0;
};

class wzPointToSegment{
public:
        virtual wzSegment operator()(const wzPoint& p) const=0;
};

class wzPointToPoint{
public:
        virtual void operator()(wzPoint& p, const wzPoint& pold) const=0;
};

class wzPoint{
public:
  wzFloat       	X[wzPointDimFull];
  wzFloat  		operator[](unsigned i)  const {return X[i];}
  wzFloat&  		operator[](unsigned i)  {return X[i];}
  wzIndex    		I[wzPointDimIndex];
  wzSegment	     	S;
private:
  static 	wzIndex	Dim;
  static 	wzIndex	DimFloat;
  static 	wzIndex	DimIndex;
  static 	wzIndex	DimFull;
public:
  wzPoint(wzFloat x=0, wzFloat y=0, wzFloat z=0);
  wzPoint(const wzPoint&);
  wzPoint& operator=(const wzPoint&);
  wzFloat      	x()          const {return X[0];}
  wzFloat 	y()          const {return X[1];}
  wzFloat 	z()          const {return X[2];}
  wzFloat      	f()          const {return X[wzPointDim];}
  wzFloat 	g()          const {return X[wzPointDim+1];}
  wzFloat 	h()          const {return X[wzPointDim+2];}
  wzIndex 	i()          const {return I[0];}
  wzIndex 	j()          const {return I[1];}
  wzIndex 	k()          const {return I[2];}
  wzFloat     	f(int i)     const {return  ((wzFloat*)(X+wzPointDim))[i];}
  wzIndex      	i(int i)     const {return  ((wzIndex*)I)[i];}
  wzFloat&	x()          {return X[0];}
  wzFloat&	y()          {return X[1];}
  wzFloat&	z()          {return X[2];}
  wzFloat&	f()          {return X[wzPointDim];}
  wzFloat&	g()          {return X[wzPointDim+1];}
  wzFloat&	h()          {return X[wzPointDim+2];}
  wzIndex&	i()          {return I[0];}
  wzIndex&	j()          {return I[1];}
  wzIndex&	k()          {return I[2];}
  wzFloat&	f(int i)     {return  ((wzFloat*)(X+wzPointDim))[i];}
  wzIndex&	i(int i)     {return  ((wzIndex*)I)[i];}
  const wzSegment& segment()	const {return S;}
  wzSegment&   	segment()    	{return S;}
  operator      wzSegment() 	{return S;}
  wzIndex      	codim()      	const {return S.codim();}
  wzRegion	region() 	const {return S.region();}
  wzFace	face()   	const {return S.face();}
  wzEdge	edge()   	const {return S.edge();}
  wzVertex	vertex() 	const {return S.vertex();}
  wzBoolean	inRegion()	const {return S.isRegion();}
  wzBoolean	onFace()	const {return S.isFace();}
  wzBoolean	onEdge()	const {return S.isEdge();}
  wzBoolean	isVertex()	const {return S.isVertex();}
  // distances and equality:
  static wzFloat Epsilon;
  wzFloat      	distance(const wzPoint& p) const;
  wzPoint&     	operator*=(wzFloat f);
  wzPoint&     	operator+=(const wzPoint& p);
  wzPoint&     	operator-=(const wzPoint& p);
  wzFloat      	scalar(const wzPoint& p)  const;
  wzFloat      	scalar(const wzPoint& p0, const wzPoint& p1) const;
  wzFloat      	vector2(const wzPoint& p0, const wzPoint& p1) const;
  wzFloat  	operator*(const wzPoint& p)  const;
  wzBoolean	operator==(const wzPoint& p) const;
  wzBoolean	operator!=(const wzPoint& p) const;
  // equivalence
  wzBoolean	far( const wzPoint& p, wzFloat delta) const;
  wzBoolean	near(const wzPoint& p, wzFloat delta) const;
  void affine(wzFloat p, const wzPoint& p0, const wzPoint& p1);
  void print()	const;
  wzBoolean    	valid()       const {return S.valid();}
  wzBoolean    	invalid()     const {return S.invalid();}
  void          invalidate()  {S.invalidate();}
  //  static const wzIndex XOffset;
  void 		setFloatValues(unsigned i);
  void 		setIndexValues(unsigned i);
  void 		setSpaceDimension(unsigned i);
  unsigned	spaceDimension() const {return Dim;}
  unsigned	floatValues() const {return DimFloat;}
  unsigned	indexValues() const {return DimIndex;}
};

inline	wzPoint::wzPoint(wzFloat x, wzFloat y, wzFloat z)
:S(){X[0]=x;X[1]=y;X[2]=z;}

inline  wzPoint::wzPoint(const wzPoint& p)
:S(p.S)
{
  int i; 
  for(i=0;i<DimFull;i++) X[i] = p.X[i];
  for(i=0;i<DimIndex;i++) I[i] = p.I[i];
}

inline  wzPoint& wzPoint::operator=(const wzPoint& p)
{
  int i;
  for(i=0;i<DimFull;i++) X[i] = p.X[i]; 
  for(i=0;i<DimIndex;i++) I[i] = p.I[i];
  S=p.S; 
  return *this;
}

inline  wzFloat  wzPoint::distance(const wzPoint& p) const
{wzFloat       x  =  (X[0]>p[0])?(X[0]-p[0]):(p[0]-X[0]); 
 switch (Dim){
	case 3: x +=  (X[2]>p[2])?(X[2]-p[2]):(p[2]-X[2]);
	case 2: x +=  (X[1]>p[1])?(X[1]-p[1]):(p[1]-X[1]);
 } return x;
}

inline 	wzPoint& wzPoint::operator+=(const wzPoint& p)
{
  X[0]+=p.X[0]; X[1]+=p.X[1]; X[2]+=p.X[2];
  return *this;
}
inline 	wzPoint& wzPoint::operator-=(const wzPoint& p)
{
  X[0]-=p.X[0]; X[1]-=p.X[1]; X[2]-=p.X[2];
  return *this;
}
inline 	wzPoint& wzPoint::operator*=(wzFloat f)
{
  X[0]*=f; X[1]*=f; X[2]*=f;
  return *this;
}

inline  wzFloat  wzPoint::scalar(const wzPoint& p0, const wzPoint& p1) const
{wzFloat       x  =  (p0[0]-X[0]) * (p1[0]-X[0]); 
 switch (Dim){
	case 3: x +=  (p0[2]-X[2]) * (p1[2]-X[2]);
	case 2: x +=  (p0[1]-X[1]) * (p1[1]-X[1]);
 } return x;
}

inline  wzFloat  wzPoint::scalar(const wzPoint& p) const
{wzFloat       x  =  (p[0]) * (X[0]); 
 switch (Dim){
	case 3: x +=  (p[2]) * (X[2]);
	case 2: x +=  (p[1]) * (X[1]);
 } return x;
}

inline wzFloat scalar(const wzPoint& p0, const wzPoint& p1)
{return p0.scalar(p1);}

inline wzFloat wzPoint::operator*(const wzPoint& p) const 
{return scalar(p);}

inline 	wzBoolean wzPoint::operator==(const wzPoint& p) const
				{return distance(p) <=Epsilon;}
inline 	wzBoolean wzPoint::operator!=(const wzPoint& p) const
	        		{return !((*this)==p);}
inline 	wzBoolean wzPoint::far( const wzPoint& p, wzFloat delta) const
				{return distance(p) >= delta;}
inline 	wzBoolean wzPoint::near(const wzPoint& p, wzFloat delta) const
				{return distance(p) <  delta;}

inline  void 	wzPoint::setFloatValues(unsigned i)
{
  if(i>wzPointDimFull-wzPointDim){throw wzError("wzpointtest","baddim");}
  DimFloat=i; DimFull=wzPointDim+i;
}
inline  void 	wzPoint::setIndexValues(unsigned i) 
{
  if(i>wzPointDimIndex){throw wzError("wzpointtest","baddim");}DimIndex=i;
}
inline  void 	wzPoint::setSpaceDimension(unsigned i) 
{
  if(i>wzPointDim){throw wzError("wzpointtest","baddim");}Dim=i;
}

class wzPointList: 
  public wzProxyTarget, 
  public wzRange{
public:
  int     spaceDim;
  int     boxDim;
  wzArray<wzPoint> 	Point;
  wzArray<int>       	Near;
  wzFloat min[3];
  wzFloat max[3];
  wzPointList(char *filename);
  wzPointList(int dim=3)
    :wzRange(sizeof(wzPoint)),spaceDim(dim),boxDim(0),
     Point(((wzRange*)this)->base),Near(*((wzRange*)this))
  {;}
  void computeBox();
};

typedef wzProxy<wzPointList> wzpoints;
//typedef wzPointList*	wzpoints;
typedef wzPointToFloat*	wzfunction;
#define cogLoop wzRangeLoop
#endif

⌨️ 快捷键说明

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