Path: blob/devel/ElmerGUI/netgen/libsrc/csg/revolution.hpp
3206 views
#ifndef _REVOLUTION_HPP1#define _REVOLUTION_HPP23class Revolution;45class RevolutionFace : public Surface6{7private:8bool isfirst, islast;9const SplineSeg<2> * spline;10bool deletable;1112Point<3> p0;13Vec<3> v_axis;1415int id;1617mutable Vector spline_coefficient;181920ARRAY < Vec<2>* > checklines_vec;21ARRAY < Point<2>* > checklines_start;22ARRAY < Vec<2>* > checklines_normal;2324private:25void Init (void);2627public:28void CalcProj(const Point<3> & point3d, Point<2> & point2d) const;29void CalcProj(const Point<3> & point3d, Point<2> & point2d,30const Vec<3> & vector3d, Vec<2> & vector2d) const;31void CalcProj0(const Vec<3> & point3d_minus_p0, Point<2> & point2d) const;3233public:34RevolutionFace(const SplineSeg<2> & spline_in,35const Point<3> & p,36const Vec<3> & vec,37bool first = false,38bool last = false,39const int id_in = 0);4041RevolutionFace(const ARRAY<double> & raw_data);4243~RevolutionFace();4445virtual int IsIdentic (const Surface & s2, int & inv, double eps) const;4647virtual double CalcFunctionValue (const Point<3> & point) const;48virtual void CalcGradient (const Point<3> & point, Vec<3> & grad) const;49virtual void CalcHesse (const Point<3> & point, Mat<3> & hesse) const;50virtual double HesseNorm () const;5152virtual double MaxCurvature () const;53//virtual double MaxCurvatureLoc (const Point<3> & /* c */ ,54// double /* rad */) const;5556virtual void Project (Point<3> & p) const;5758virtual Point<3> GetSurfacePoint () const;59virtual void Print (ostream & str) const;6061virtual void GetTriangleApproximation (TriangleApproximation & tas,62const Box<3> & boundingbox,63double facets) const;6465bool BoxIntersectsFace (const Box<3> & box) const;66/*67bool BoxIntersectsFace (const BoxSphere<2> & box, bool & uncertain) const;68bool BoxIntersectsFace (const BoxSphere<3> & box, bool & uncertain) const;69*/7071const SplineSeg<2> & GetSpline(void) const {return *spline;}7273INSOLID_TYPE PointInFace (const Point<3> & p, const double eps) const;7475void GetRawData(ARRAY<double> & data) const;7677};78798081/*8283Primitive of revolution8485*/868788class Revolution : public Primitive89{90private:91Point<3> p0,p1;92Vec<3> v_axis;93const SplineGeometry2d & splinecurve;94const int nsplines;9596// 1 ... torus-like97// 2 ... sphere-like98int type;99100101ARRAY<RevolutionFace*> faces;102103mutable int intersecting_face;104105public:106Revolution(const Point<3> & p0_in,107const Point<3> & p1_in,108const SplineGeometry2d & spline_in);109110~Revolution();111112113/*114Check, whether box intersects solid defined by surface.115116return values:1170 .. box outside solid \\1181 .. box in solid \\1192 .. can't decide (allowed, iff box is close to solid)120*/121virtual INSOLID_TYPE BoxInSolid (const BoxSphere<3> & box) const;122virtual INSOLID_TYPE PointInSolid (const Point<3> & p,123double eps) const;124virtual INSOLID_TYPE VecInSolid (const Point<3> & p,125const Vec<3> & v,126double eps) const;127128// checks if lim s->0 lim t->0 p + t(v1 + s v2) in solid129virtual INSOLID_TYPE VecInSolid2 (const Point<3> & p,130const Vec<3> & v1,131const Vec<3> & v2,132double eps) const;133134135virtual int GetNSurfaces() const;136virtual Surface & GetSurface (int i = 0);137virtual const Surface & GetSurface (int i = 0) const;138139140virtual void Reduce (const BoxSphere<3> & box);141virtual void UnReduce ();142143144};145146147148#endif149150151