Path: blob/devel/ElmerGUI/netgen/libsrc/csg/algprim.hpp
3206 views
#ifndef FILE_ALGPRIM1#define FILE_ALGPRIM234/**************************************************************************/5/* File: algprim.hh */6/* Author: Joachim Schoeberl */7/* Date: 1. Dez. 95 */8/**************************************************************************/910/*1112Quadric Surfaces (Plane, Sphere, Cylinder)1314*/151617/**18A quadric surface.19surface defined by20cxx x^2 + cyy y^2 + czz z^2 + cxy x y + cxz x z + cyz y z +21cx x + cy y + cz z + c1 = 0.22**/23class QuadraticSurface : public OneSurfacePrimitive24{25protected:26double cxx, cyy, czz, cxy, cxz, cyz, cx, cy, cz, c1;2728public:29virtual double CalcFunctionValue (const Point<3> & point) const;30virtual void CalcGradient (const Point<3> & point, Vec<3> & grad) const;31virtual void CalcHesse (const Point<3> & point, Mat<3> & hesse) const;32/*33virtual int RootInBox (const Box<3> & box)34const { return 0; }35virtual INSOLID_TYPE BoxInSolid (const BoxSphere<3> & box)36const { return DOES_INTERSECT; }37*/38virtual double HesseNorm () const { return cxx + cyy + czz; }3940virtual Point<3> GetSurfacePoint () const;414243virtual void Print (ostream & ist) const;44virtual void Read (istream & ist);45void PrintCoeff (ostream & ost) const;46};474849/// A Plane (i.e., the plane and everything behind it).50class Plane : public QuadraticSurface51{52/// a point in the plane53Point<3> p;54/// outward normal vector55Vec<3> n;5657double eps_base;5859public:60///61Plane (const Point<3> & ap, Vec<3> an);6263virtual void GetPrimitiveData (const char *& classname,64ARRAY<double> & coeffs) const;65virtual void SetPrimitiveData (ARRAY<double> & coeffs);66static Primitive * CreateDefault ();6768virtual Primitive * Copy () const;69virtual void Transform (Transformation<3> & trans);707172virtual int IsIdentic (const Surface & s2, int & inv, double eps) const;7374///75virtual void DefineTangentialPlane (const Point<3> & ap1,76const Point<3> & ap2);77///78virtual void ToPlane (const Point<3> & p3d,79Point<2> & pplane, double h,80int & zone) const;81///82virtual void FromPlane (const Point<2> & pplane,83Point<3> & p3d,84double h) const;85///86virtual void Project (Point<3> & p) const;8788///89virtual INSOLID_TYPE BoxInSolid (const BoxSphere<3> & box) const;9091///92inline virtual double CalcFunctionValue (const Point<3> & p3d) const93{return cx * p3d(0) + cy * p3d(1) + cz * p3d(2) + c1;}94///95virtual void CalcGradient (const Point<3> & point,96Vec<3> & grad) const;97///98virtual void CalcHesse (const Point<3> & point,99Mat<3> & hesse) const;100///101virtual double HesseNorm () const;102///103virtual Point<3> GetSurfacePoint () const;104///105virtual void GetTriangleApproximation106(TriangleApproximation & tas,107const Box<3> & boundingbox, double facets) const;108109};110111// typedef Plane Plane;112113114///115class Sphere : public QuadraticSurface116{117///118Point<3> c;119///120double r;121public:122///123Sphere (const Point<3> & ac, double ar);124125virtual void GetPrimitiveData (const char *& classname,126ARRAY<double> & coeffs) const;127virtual void SetPrimitiveData (ARRAY<double> & coeffs);128static Primitive * CreateDefault ();129130virtual Primitive * Copy () const;131virtual void Transform (Transformation<3> & trans);132133134virtual int IsIdentic (const Surface & s2, int & inv, double eps) const;135136///137virtual void DefineTangentialPlane (const Point<3> & ap1,138const Point<3> & ap2);139///140virtual void ToPlane (const Point<3> & p3d,141Point<2> & pplane, double h,142int & zone) const;143///144virtual void FromPlane (const Point<2> & pplane,145Point<3> & p, double h) const;146///147virtual void Project (Point<3> & p) const;148149///150virtual INSOLID_TYPE BoxInSolid (const BoxSphere<3> & box) const;151///152virtual double HesseNorm () const;153///154virtual Point<3> GetSurfacePoint () const;155///156const Point<3> & Center () const { return c; }157///158double Radius () const { return r; }159160///161virtual void GetTriangleApproximation (TriangleApproximation & tas,162const Box<3> & bbox,163double facets) const;164};165166167///168class Cylinder : public QuadraticSurface169{170///171Point<3> a, b;172///173double r;174///175Vec<3> vab;176177public:178Cylinder (const Point<3> & aa, const Point<3> & ab, double ar);179Cylinder (ARRAY<double> & coeffs);180181virtual void GetPrimitiveData (const char *& classname, ARRAY<double> & coeffs) const;182virtual void SetPrimitiveData (ARRAY<double> & coeffs);183static Primitive * CreateDefault ();184185virtual Primitive * Copy () const;186virtual void Transform (Transformation<3> & trans);187188///189virtual int IsIdentic (const Surface & s2, int & inv, double eps) const;190///191virtual void DefineTangentialPlane (const Point<3> & ap1,192const Point<3> & ap2);193///194virtual void ToPlane (const Point<3> & p,195Point<2> & pplane,196double h,197int & zone) const;198///199virtual void FromPlane (const Point<2> & pplane,200Point<3> & p,201double h) const;202///203virtual void Project (Point<3> & p) const;204205///206virtual INSOLID_TYPE BoxInSolid (const BoxSphere<3> & box) const;207///208virtual double HesseNorm () const;209///210virtual Point<3> GetSurfacePoint () const;211///212virtual void GetTriangleApproximation (TriangleApproximation & tas,213const Box<3> & bbox,214double facets) const;215};216217218219220221///222class EllipticCylinder : public QuadraticSurface223{224private:225///226Point<3> a;227///228Vec<3> vl, vs;229///230Vec<3> vab, t0vec, t1vec;231///232double vabl, t0, t1;233public:234///235EllipticCylinder (const Point<3> & aa,236const Vec<3> & avl, const Vec<3> & avs);237238/*239static Primitive * CreateDefault ();240virtual void GetPrimitiveData (const char *& classname, ARRAY<double> & coeffs) const;241virtual void SetPrimitiveData (ARRAY<double> & coeffs);242*/243///244virtual INSOLID_TYPE BoxInSolid (const BoxSphere<3> & box) const;245///246virtual double HesseNorm () const;247///248virtual Point<3> GetSurfacePoint () const;249250virtual void GetTriangleApproximation (TriangleApproximation & tas,251const Box<3> & bbox,252double facets) const;253254255virtual double MaxCurvature () const;256257virtual double MaxCurvatureLoc (const Point<3> & /* c */ ,258double /* rad */) const;259260261private:262void CalcData();263};264265266267268269270///271class Ellipsoid : public QuadraticSurface272{273private:274///275Point<3> a;276///277Vec<3> v1, v2, v3;278///279double rmin;280public:281///282Ellipsoid (const Point<3> & aa,283const Vec<3> & av1,284const Vec<3> & av2,285const Vec<3> & av3);286///287virtual INSOLID_TYPE BoxInSolid (const BoxSphere<3> & box) const;288///289virtual double HesseNorm () const;290///291virtual double MaxCurvature () const;292///293virtual Point<3> GetSurfacePoint () const;294295virtual void GetTriangleApproximation (TriangleApproximation & tas,296const Box<3> & bbox,297double facets) const;298299private:300void CalcData();301};302303304305306307308309310///311class Cone : public QuadraticSurface312{313///314Point<3> a, b;315///316double ra, rb, minr;317///318Vec<3> vab, t0vec, t1vec;319///320double vabl, t0, t1;321public:322///323Cone (const Point<3> & aa, const Point<3> & ab, double ara, double arb);324///325static Primitive * CreateDefault ();326virtual void GetPrimitiveData (const char *& classname, ARRAY<double> & coeffs) const;327virtual void SetPrimitiveData (ARRAY<double> & coeffs);328329///330virtual INSOLID_TYPE BoxInSolid (const BoxSphere<3> & box) const;331///332virtual double HesseNorm () const;333334virtual double LocH (const Point<3> & p, double x,335double c, double hmax) const;336337///338virtual Point<3> GetSurfacePoint () const;339340virtual void GetTriangleApproximation (TriangleApproximation & tas,341const Box<3> & bbox,342double facets) const;343344private:345void CalcData();346};347348349350351352353354355/// Torus356/// Lorenzo Codecasa ([email protected])357/// April 27th, 2005358///359/// begin...360class Torus : public OneSurfacePrimitive361{362/// center of the torus363Point<3> c;364/// vector normal to the symmetry plane of the torus365Vec<3> n;366/// Large radius of the torus367double R;368/// Small radius of the torus369double r;370371public:372/// OK373Torus (const Point<3> & ac, const Vec<3> & an, double aR, double ar);374/// OK375const Point<3> & Center () const { return c; }376/// OK377const Vec<3> & NormalToPlane () const { return n; }378/// OK379double LargeRadius () const { return R; }380/// OK381double SmallRadius () const { return r; }382/// OK383virtual double CalcFunctionValue (const Point<3> & point) const;384/// OK385virtual void CalcGradient (const Point<3> & point, Vec<3> & grad) const;386/// OK387virtual void CalcHesse (const Point<3> & point, Mat<3> & hesse) const;388/// OK389virtual double HesseNorm () const;390/// OK391virtual Point<3> GetSurfacePoint () const;392/// OK393virtual void GetPrimitiveData (const char *& classname,394ARRAY<double> & coeffs) const;395/// OK396virtual void SetPrimitiveData (ARRAY<double> & coeffs);397/// OK398static Primitive * CreateDefault ();399/// OK400virtual Primitive * Copy () const;401/// OK402virtual void Transform (Transformation<3> & trans);403/// OK404virtual int IsIdentic (const Surface & s2, int & inv, double eps) const;405/// OK406/// virtual void DefineTangentialPlane (const Point<3> & ap1,407// const Point<3> & ap2);408/// OK409/// virtual void ToPlane (const Point<3> & p3d,410/// Point<2> & pplane,411/// double h, int & zone) const;412/// OK413/// virtual void FromPlane (const Point<2> & pplane,414// Point<3> & p, double h) const;415/// OK416/// virtual void Project (Point<3> & p) const;417/// OK418virtual INSOLID_TYPE BoxInSolid (const BoxSphere<3> & box) const;419/// OK420virtual void GetTriangleApproximation (TriangleApproximation & tas,421const Box<3> & bbox,422double facets) const;423/// OK424virtual void Print (ostream & ist) const;425/// OK426virtual void Read (istream & ist);427};428429/// ...end430431432433434435436437438#endif439440441