UNIVERS  15.3
UNIVERS base processing software API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
p_elements.H
1 /* p_elements.H */
2 /* $Id: p_elements.H,v 2.15 2001/10/09 14:54:38 hoh Exp $ */
3 #ifndef __p_elements_H
4 #define __p_elements_H
5 
6 
7 #include <mix/IntAr.H>
8 #include <mix/DoubleAr.H>
9 #include <mix/ObjectsAr.H>
10 
11 #include "any_elements.H"
12 /*
13  Элементы модели с плоскими границами: границы, тела, сплайны.
14 
15  Предоставляют необходимую функциональность и приоткрываются для пользователя. */ class pl_model; class any_model; class pl_spline; // Элементы внутреннего представления class pl_intern_spline:public any_spline{ // Гладкая поверхность - плоскость protected: double a,b,c,d; // Коэффициенты канонического уравнения плоскости pl_intern_spline(); // Используем при порождении детей public: ~pl_intern_spline(){;}; pl_intern_spline(double A,double B,double C, double D); // Пересечение с отрезком входных точек point cross(const point& p1,const point& p2) const; // С какой стороны от плоскости лежит точка int sign(const point & p) const; // Перевод в локальную систему координат point2D local(const point& pMain, const point& p0,const point& p1,const point& p2) const; // Перевод в локальную систему координат // (более новый, но старый пока трогать не будем) point2D local(const point& pMain, const point& p0) const; // Перевод в глобальную систему координат point global(const point2D& pMain, const point& p0) const; double A() const {return a;}; double B() const {return b;}; double C() const {return c;}; double D() const {return d;}; double distance(const point3d &pWhere); // Друзья friend class pl_model; }; typedef pl_intern_spline* p_pl_intern_spline; typedef ObjectsAr<p_pl_intern_spline> pl_intern_splines; // Граница с соответствующими геофизическими параметрами class pl_overlying_spline:public pl_intern_spline{ protected: geophys_params gp; point3d pInternal; // Точка, лежащая на границе, образованной этим сплайном public: pl_overlying_spline(const geophys_params &gp,const point3d& p, double dFi,double dAz); geophys_params get_geophys(){return gp;}; point3d get_internal_point(){return pInternal;}; }; typedef pl_overlying_spline* p_pl_overlying_spline; typedef ObjectsAr<p_pl_overlying_spline> pl_overlying_splines; // Граница - многоугольник // Требуется некоторый способ определения целостности границы... class pl_intern_border:public any_border{ protected: aPoints aTops; // Вершины многоугольника, требование: aTops[0]=aTops[_last_]. DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; pl_intern_border(pl_intern_border &bCopy); // Точки, определяющие локальную систему координат на папе-сплайне Logic points_created; point p0; void init_local_coords(); // Вычисляет точку p0 public: ~pl_intern_border(); pl_intern_border(const aPoints & p, int ib[2],p_pl_intern_spline ps, border_flag bf); pl_intern_border(int ib[2],p_pl_intern_spline psSpline,border_flag bf); pl_intern_border(p_pl_intern_spline ps,border_flag _bf); pl_intern_border(p_pl_intern_spline ps,border_flag,aSegments3D&); const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; point get_a_top(int i)const{return aTops(i);}; // Опасная функция, однако... int add_a_top(const point& pt); int n_of_tops()const{return aTops.count()-1;}; virtual int contains(const point &pWhat)const; // По отрезкам - последовательность точек. int fix_points(aSegments3D&); const aPoints& points()const{return aTops;}; point closest_border_point(const point&)const; // Перевод из одних координат в другие point2D local(const point3d&); point3d global(const point2D&); point P0(){return p0;}; point middle()const; friend class pl_model; }; typedef pl_intern_border* p_pl_intern_border; #define AnyType p_pl_intern_border #define AnyAr pl_intern_borders #include <mix/AnyAr.H> class pl_fict_border:public pl_intern_border,public pl_intern_spline{ public: pl_fict_border(const aPoints & p, int ib[2], double A,double B, double C, double D): pl_intern_border(p,ib,NULL,TEMP),pl_intern_spline(A,B,C,D){}; }; typedef pl_fict_border* p_pl_fict_border; typedef ObjectsAr<p_pl_fict_border> pl_fict_borders; // Тело - набор многоугольников class pl_intern_body:public any_body{ protected: pl_intern_body(pl_intern_body &bCopy); pl_intern_splines* get_bodies_splines()const; public: pl_intern_body(geophys_params gp); pl_intern_body(any_borders &ab,geophys_params gp); ~pl_intern_body(){;}; // Добавляем в этот класс, так как требуется пересечение с плоскостями virtual int contains(const point &pWhat)const; // Создание фиктивной границы внутри тела по заданной плоскости int fict_border (const pl_spline& sSlice,p_pl_fict_border& bNew)const; friend class pl_model; }; typedef pl_intern_body* p_pl_intern_body; typedef ObjectsAr<p_pl_intern_body> pl_intern_bodies; // Элементы внешнего представления модели class pl_spline:public any_ex_spline{ protected: double a,b,c,d; public: pl_spline(); pl_spline(double A,double B,double C, double D); // плоскость по трем точкам pl_spline(const point& p1,const point& p2,const point& p3); // Пересечение с отрезком входных точек point cross(const point& p1,const point& p2) const; // Перевод в локальную систему координат point2D local(const point& pMain, const point& p0,const point& p1,const point& p2) const; // С какой стороны от плоскости лежит точка int sign(const point & p) const; void set_coef(double A,double B,double C, double D); void get_coef(double &A,double &B,double &C, double &D); double A() const {return a;}; double B() const {return b;}; double C() const {return c;}; double D() const {return d;}; double distance(const point3d &pWhere); }; typedef pl_spline* p_pl_spline; typedef ObjectsAr<p_pl_spline> p_pl_splines; class pl_border:public any_ex_border{ protected: DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; public: pl_border(); pl_border(const aPoints & at, int ib[2], int is, border_flag bf); pl_border(int ib[2], int is, border_flag bf); point get_a_top(int i)const {return point(aTops_X(i),aTops_Y(i),aTops_Z(i));}; const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; // Аналог конструктора для перезаписи созданного объекта int make_border(DoubleAr&ax,DoubleAr&ay,DoubleAr&az, int ib[2], int is, border_flag bf); int n_of_tops()const{return aTops_Z.count();}; int get_body(int ib); int get_spline()const {return iSpline;}; }; // Почти то же, что и произвольное тело class pl_body:public any_ex_body{ public: pl_body():any_ex_body(){;}; pl_body(IntAr & ab, const geophys_params & gp, int in); }; /* Функция-люмпен...*/ void get_splines_weights(const point& pLast, const pl_intern_splines & paSplines, const any_borders & paBorders, DoubleAr&daWeights); #endif /* p_elements.H */ /* Melnikov George Y. 16-Sep-1998 */ /* ... */ /* Melnikov George Yu. 31-Jan-2000 */
16  */
17 
18 class pl_model;
19 class any_model;
20 class pl_spline;
21 
22 // Элементы внутреннего представления
24 
25 // Гладкая поверхность - плоскость
26 protected:
27  double a,b,c,d; // Коэффициенты канонического уравнения плоскости
28  pl_intern_spline(); // Используем при порождении детей
29 
30 public:
31  ~pl_intern_spline(){;};
32  pl_intern_spline(double A,double B,double C, double D);
33 
34  // Пересечение с отрезком входных точек
35  point cross(const point& p1,const point& p2) const;
36 
37  // С какой стороны от плоскости лежит точка
38  int sign(const point & p) const;
39 
40  // Перевод в локальную систему координат point2D local(const point& pMain, const point& p0,const point& p1,const point& p2) const; // Перевод в локальную систему координат // (более новый, но старый пока трогать не будем) point2D local(const point& pMain, const point& p0) const; // Перевод в глобальную систему координат point global(const point2D& pMain, const point& p0) const; double A() const {return a;}; double B() const {return b;}; double C() const {return c;}; double D() const {return d;}; double distance(const point3d &pWhere); // Друзья friend class pl_model; }; typedef pl_intern_spline* p_pl_intern_spline; typedef ObjectsAr<p_pl_intern_spline> pl_intern_splines; // Граница с соответствующими геофизическими параметрами class pl_overlying_spline:public pl_intern_spline{ protected: geophys_params gp; point3d pInternal; // Точка, лежащая на границе, образованной этим сплайном public: pl_overlying_spline(const geophys_params &gp,const point3d& p, double dFi,double dAz); geophys_params get_geophys(){return gp;}; point3d get_internal_point(){return pInternal;}; }; typedef pl_overlying_spline* p_pl_overlying_spline; typedef ObjectsAr<p_pl_overlying_spline> pl_overlying_splines; // Граница - многоугольник // Требуется некоторый способ определения целостности границы... class pl_intern_border:public any_border{ protected: aPoints aTops; // Вершины многоугольника, требование: aTops[0]=aTops[_last_]. DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; pl_intern_border(pl_intern_border &bCopy); // Точки, определяющие локальную систему координат на папе-сплайне Logic points_created; point p0; void init_local_coords(); // Вычисляет точку p0 public: ~pl_intern_border(); pl_intern_border(const aPoints & p, int ib[2],p_pl_intern_spline ps, border_flag bf); pl_intern_border(int ib[2],p_pl_intern_spline psSpline,border_flag bf); pl_intern_border(p_pl_intern_spline ps,border_flag _bf); pl_intern_border(p_pl_intern_spline ps,border_flag,aSegments3D&); const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; point get_a_top(int i)const{return aTops(i);}; // Опасная функция, однако... int add_a_top(const point& pt); int n_of_tops()const{return aTops.count()-1;}; virtual int contains(const point &pWhat)const; // По отрезкам - последовательность точек. int fix_points(aSegments3D&); const aPoints& points()const{return aTops;}; point closest_border_point(const point&)const; // Перевод из одних координат в другие point2D local(const point3d&); point3d global(const point2D&); point P0(){return p0;}; point middle()const; friend class pl_model; }; typedef pl_intern_border* p_pl_intern_border; #define AnyType p_pl_intern_border #define AnyAr pl_intern_borders #include <mix/AnyAr.H> class pl_fict_border:public pl_intern_border,public pl_intern_spline{ public: pl_fict_border(const aPoints & p, int ib[2], double A,double B, double C, double D): pl_intern_border(p,ib,NULL,TEMP),pl_intern_spline(A,B,C,D){}; }; typedef pl_fict_border* p_pl_fict_border; typedef ObjectsAr<p_pl_fict_border> pl_fict_borders; // Тело - набор многоугольников class pl_intern_body:public any_body{ protected: pl_intern_body(pl_intern_body &bCopy); pl_intern_splines* get_bodies_splines()const; public: pl_intern_body(geophys_params gp); pl_intern_body(any_borders &ab,geophys_params gp); ~pl_intern_body(){;}; // Добавляем в этот класс, так как требуется пересечение с плоскостями virtual int contains(const point &pWhat)const; // Создание фиктивной границы внутри тела по заданной плоскости int fict_border (const pl_spline& sSlice,p_pl_fict_border& bNew)const; friend class pl_model; }; typedef pl_intern_body* p_pl_intern_body; typedef ObjectsAr<p_pl_intern_body> pl_intern_bodies; // Элементы внешнего представления модели class pl_spline:public any_ex_spline{ protected: double a,b,c,d; public: pl_spline(); pl_spline(double A,double B,double C, double D); // плоскость по трем точкам pl_spline(const point& p1,const point& p2,const point& p3); // Пересечение с отрезком входных точек point cross(const point& p1,const point& p2) const; // Перевод в локальную систему координат point2D local(const point& pMain, const point& p0,const point& p1,const point& p2) const; // С какой стороны от плоскости лежит точка int sign(const point & p) const; void set_coef(double A,double B,double C, double D); void get_coef(double &A,double &B,double &C, double &D); double A() const {return a;}; double B() const {return b;}; double C() const {return c;}; double D() const {return d;}; double distance(const point3d &pWhere); }; typedef pl_spline* p_pl_spline; typedef ObjectsAr<p_pl_spline> p_pl_splines; class pl_border:public any_ex_border{ protected: DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; public: pl_border(); pl_border(const aPoints & at, int ib[2], int is, border_flag bf); pl_border(int ib[2], int is, border_flag bf); point get_a_top(int i)const {return point(aTops_X(i),aTops_Y(i),aTops_Z(i));}; const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; // Аналог конструктора для перезаписи созданного объекта int make_border(DoubleAr&ax,DoubleAr&ay,DoubleAr&az, int ib[2], int is, border_flag bf); int n_of_tops()const{return aTops_Z.count();}; int get_body(int ib); int get_spline()const {return iSpline;}; }; // Почти то же, что и произвольное тело class pl_body:public any_ex_body{ public: pl_body():any_ex_body(){;}; pl_body(IntAr & ab, const geophys_params & gp, int in); }; /* Функция-люмпен...*/ void get_splines_weights(const point& pLast, const pl_intern_splines & paSplines, const any_borders & paBorders, DoubleAr&daWeights); #endif /* p_elements.H */ /* Melnikov George Y. 16-Sep-1998 */ /* ... */ /* Melnikov George Yu. 31-Jan-2000 */
41  point2D local(const point& pMain,
42  const point& p0,const point& p1,const point& p2) const;
43 
44  // Перевод в локальную систему координат // (более новый, но старый пока трогать не будем) point2D local(const point& pMain, const point& p0) const; // Перевод в глобальную систему координат point global(const point2D& pMain, const point& p0) const; double A() const {return a;}; double B() const {return b;}; double C() const {return c;}; double D() const {return d;}; double distance(const point3d &pWhere); // Друзья friend class pl_model; }; typedef pl_intern_spline* p_pl_intern_spline; typedef ObjectsAr<p_pl_intern_spline> pl_intern_splines; // Граница с соответствующими геофизическими параметрами class pl_overlying_spline:public pl_intern_spline{ protected: geophys_params gp; point3d pInternal; // Точка, лежащая на границе, образованной этим сплайном public: pl_overlying_spline(const geophys_params &gp,const point3d& p, double dFi,double dAz); geophys_params get_geophys(){return gp;}; point3d get_internal_point(){return pInternal;}; }; typedef pl_overlying_spline* p_pl_overlying_spline; typedef ObjectsAr<p_pl_overlying_spline> pl_overlying_splines; // Граница - многоугольник // Требуется некоторый способ определения целостности границы... class pl_intern_border:public any_border{ protected: aPoints aTops; // Вершины многоугольника, требование: aTops[0]=aTops[_last_]. DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; pl_intern_border(pl_intern_border &bCopy); // Точки, определяющие локальную систему координат на папе-сплайне Logic points_created; point p0; void init_local_coords(); // Вычисляет точку p0 public: ~pl_intern_border(); pl_intern_border(const aPoints & p, int ib[2],p_pl_intern_spline ps, border_flag bf); pl_intern_border(int ib[2],p_pl_intern_spline psSpline,border_flag bf); pl_intern_border(p_pl_intern_spline ps,border_flag _bf); pl_intern_border(p_pl_intern_spline ps,border_flag,aSegments3D&); const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; point get_a_top(int i)const{return aTops(i);}; // Опасная функция, однако... int add_a_top(const point& pt); int n_of_tops()const{return aTops.count()-1;}; virtual int contains(const point &pWhat)const; // По отрезкам - последовательность точек. int fix_points(aSegments3D&); const aPoints& points()const{return aTops;}; point closest_border_point(const point&)const; // Перевод из одних координат в другие point2D local(const point3d&); point3d global(const point2D&); point P0(){return p0;}; point middle()const; friend class pl_model; }; typedef pl_intern_border* p_pl_intern_border; #define AnyType p_pl_intern_border #define AnyAr pl_intern_borders #include <mix/AnyAr.H> class pl_fict_border:public pl_intern_border,public pl_intern_spline{ public: pl_fict_border(const aPoints & p, int ib[2], double A,double B, double C, double D): pl_intern_border(p,ib,NULL,TEMP),pl_intern_spline(A,B,C,D){}; }; typedef pl_fict_border* p_pl_fict_border; typedef ObjectsAr<p_pl_fict_border> pl_fict_borders; // Тело - набор многоугольников class pl_intern_body:public any_body{ protected: pl_intern_body(pl_intern_body &bCopy); pl_intern_splines* get_bodies_splines()const; public: pl_intern_body(geophys_params gp); pl_intern_body(any_borders &ab,geophys_params gp); ~pl_intern_body(){;}; // Добавляем в этот класс, так как требуется пересечение с плоскостями virtual int contains(const point &pWhat)const; // Создание фиктивной границы внутри тела по заданной плоскости int fict_border (const pl_spline& sSlice,p_pl_fict_border& bNew)const; friend class pl_model; }; typedef pl_intern_body* p_pl_intern_body; typedef ObjectsAr<p_pl_intern_body> pl_intern_bodies; // Элементы внешнего представления модели class pl_spline:public any_ex_spline{ protected: double a,b,c,d; public: pl_spline(); pl_spline(double A,double B,double C, double D); // плоскость по трем точкам pl_spline(const point& p1,const point& p2,const point& p3); // Пересечение с отрезком входных точек point cross(const point& p1,const point& p2) const; // Перевод в локальную систему координат point2D local(const point& pMain, const point& p0,const point& p1,const point& p2) const; // С какой стороны от плоскости лежит точка int sign(const point & p) const; void set_coef(double A,double B,double C, double D); void get_coef(double &A,double &B,double &C, double &D); double A() const {return a;}; double B() const {return b;}; double C() const {return c;}; double D() const {return d;}; double distance(const point3d &pWhere); }; typedef pl_spline* p_pl_spline; typedef ObjectsAr<p_pl_spline> p_pl_splines; class pl_border:public any_ex_border{ protected: DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; public: pl_border(); pl_border(const aPoints & at, int ib[2], int is, border_flag bf); pl_border(int ib[2], int is, border_flag bf); point get_a_top(int i)const {return point(aTops_X(i),aTops_Y(i),aTops_Z(i));}; const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; // Аналог конструктора для перезаписи созданного объекта int make_border(DoubleAr&ax,DoubleAr&ay,DoubleAr&az, int ib[2], int is, border_flag bf); int n_of_tops()const{return aTops_Z.count();}; int get_body(int ib); int get_spline()const {return iSpline;}; }; // Почти то же, что и произвольное тело class pl_body:public any_ex_body{ public: pl_body():any_ex_body(){;}; pl_body(IntAr & ab, const geophys_params & gp, int in); }; /* Функция-люмпен...*/ void get_splines_weights(const point& pLast, const pl_intern_splines & paSplines, const any_borders & paBorders, DoubleAr&daWeights); #endif /* p_elements.H */ /* Melnikov George Y. 16-Sep-1998 */ /* ... */ /* Melnikov George Yu. 31-Jan-2000 */
45  // (более новый, но старый пока трогать не будем)
46  point2D local(const point& pMain,
47  const point& p0) const;
48 
49  // Перевод в глобальную систему координат point global(const point2D& pMain, const point& p0) const; double A() const {return a;}; double B() const {return b;}; double C() const {return c;}; double D() const {return d;}; double distance(const point3d &pWhere); // Друзья friend class pl_model; }; typedef pl_intern_spline* p_pl_intern_spline; typedef ObjectsAr<p_pl_intern_spline> pl_intern_splines; // Граница с соответствующими геофизическими параметрами class pl_overlying_spline:public pl_intern_spline{ protected: geophys_params gp; point3d pInternal; // Точка, лежащая на границе, образованной этим сплайном public: pl_overlying_spline(const geophys_params &gp,const point3d& p, double dFi,double dAz); geophys_params get_geophys(){return gp;}; point3d get_internal_point(){return pInternal;}; }; typedef pl_overlying_spline* p_pl_overlying_spline; typedef ObjectsAr<p_pl_overlying_spline> pl_overlying_splines; // Граница - многоугольник // Требуется некоторый способ определения целостности границы... class pl_intern_border:public any_border{ protected: aPoints aTops; // Вершины многоугольника, требование: aTops[0]=aTops[_last_]. DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; pl_intern_border(pl_intern_border &bCopy); // Точки, определяющие локальную систему координат на папе-сплайне Logic points_created; point p0; void init_local_coords(); // Вычисляет точку p0 public: ~pl_intern_border(); pl_intern_border(const aPoints & p, int ib[2],p_pl_intern_spline ps, border_flag bf); pl_intern_border(int ib[2],p_pl_intern_spline psSpline,border_flag bf); pl_intern_border(p_pl_intern_spline ps,border_flag _bf); pl_intern_border(p_pl_intern_spline ps,border_flag,aSegments3D&); const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; point get_a_top(int i)const{return aTops(i);}; // Опасная функция, однако... int add_a_top(const point& pt); int n_of_tops()const{return aTops.count()-1;}; virtual int contains(const point &pWhat)const; // По отрезкам - последовательность точек. int fix_points(aSegments3D&); const aPoints& points()const{return aTops;}; point closest_border_point(const point&)const; // Перевод из одних координат в другие point2D local(const point3d&); point3d global(const point2D&); point P0(){return p0;}; point middle()const; friend class pl_model; }; typedef pl_intern_border* p_pl_intern_border; #define AnyType p_pl_intern_border #define AnyAr pl_intern_borders #include <mix/AnyAr.H> class pl_fict_border:public pl_intern_border,public pl_intern_spline{ public: pl_fict_border(const aPoints & p, int ib[2], double A,double B, double C, double D): pl_intern_border(p,ib,NULL,TEMP),pl_intern_spline(A,B,C,D){}; }; typedef pl_fict_border* p_pl_fict_border; typedef ObjectsAr<p_pl_fict_border> pl_fict_borders; // Тело - набор многоугольников class pl_intern_body:public any_body{ protected: pl_intern_body(pl_intern_body &bCopy); pl_intern_splines* get_bodies_splines()const; public: pl_intern_body(geophys_params gp); pl_intern_body(any_borders &ab,geophys_params gp); ~pl_intern_body(){;}; // Добавляем в этот класс, так как требуется пересечение с плоскостями virtual int contains(const point &pWhat)const; // Создание фиктивной границы внутри тела по заданной плоскости int fict_border (const pl_spline& sSlice,p_pl_fict_border& bNew)const; friend class pl_model; }; typedef pl_intern_body* p_pl_intern_body; typedef ObjectsAr<p_pl_intern_body> pl_intern_bodies; // Элементы внешнего представления модели class pl_spline:public any_ex_spline{ protected: double a,b,c,d; public: pl_spline(); pl_spline(double A,double B,double C, double D); // плоскость по трем точкам pl_spline(const point& p1,const point& p2,const point& p3); // Пересечение с отрезком входных точек point cross(const point& p1,const point& p2) const; // Перевод в локальную систему координат point2D local(const point& pMain, const point& p0,const point& p1,const point& p2) const; // С какой стороны от плоскости лежит точка int sign(const point & p) const; void set_coef(double A,double B,double C, double D); void get_coef(double &A,double &B,double &C, double &D); double A() const {return a;}; double B() const {return b;}; double C() const {return c;}; double D() const {return d;}; double distance(const point3d &pWhere); }; typedef pl_spline* p_pl_spline; typedef ObjectsAr<p_pl_spline> p_pl_splines; class pl_border:public any_ex_border{ protected: DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; public: pl_border(); pl_border(const aPoints & at, int ib[2], int is, border_flag bf); pl_border(int ib[2], int is, border_flag bf); point get_a_top(int i)const {return point(aTops_X(i),aTops_Y(i),aTops_Z(i));}; const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; // Аналог конструктора для перезаписи созданного объекта int make_border(DoubleAr&ax,DoubleAr&ay,DoubleAr&az, int ib[2], int is, border_flag bf); int n_of_tops()const{return aTops_Z.count();}; int get_body(int ib); int get_spline()const {return iSpline;}; }; // Почти то же, что и произвольное тело class pl_body:public any_ex_body{ public: pl_body():any_ex_body(){;}; pl_body(IntAr & ab, const geophys_params & gp, int in); }; /* Функция-люмпен...*/ void get_splines_weights(const point& pLast, const pl_intern_splines & paSplines, const any_borders & paBorders, DoubleAr&daWeights); #endif /* p_elements.H */ /* Melnikov George Y. 16-Sep-1998 */ /* ... */ /* Melnikov George Yu. 31-Jan-2000 */
50  point global(const point2D& pMain,
51  const point& p0) const;
52 
53  double A() const {return a;};
54  double B() const {return b;};
55  double C() const {return c;};
56  double D() const {return d;};
57 
58  double distance(const point3d &pWhere);
59 
60  // Друзья friend class pl_model; }; typedef pl_intern_spline* p_pl_intern_spline; typedef ObjectsAr<p_pl_intern_spline> pl_intern_splines; // Граница с соответствующими геофизическими параметрами class pl_overlying_spline:public pl_intern_spline{ protected: geophys_params gp; point3d pInternal; // Точка, лежащая на границе, образованной этим сплайном public: pl_overlying_spline(const geophys_params &gp,const point3d& p, double dFi,double dAz); geophys_params get_geophys(){return gp;}; point3d get_internal_point(){return pInternal;}; }; typedef pl_overlying_spline* p_pl_overlying_spline; typedef ObjectsAr<p_pl_overlying_spline> pl_overlying_splines; // Граница - многоугольник // Требуется некоторый способ определения целостности границы... class pl_intern_border:public any_border{ protected: aPoints aTops; // Вершины многоугольника, требование: aTops[0]=aTops[_last_]. DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; pl_intern_border(pl_intern_border &bCopy); // Точки, определяющие локальную систему координат на папе-сплайне Logic points_created; point p0; void init_local_coords(); // Вычисляет точку p0 public: ~pl_intern_border(); pl_intern_border(const aPoints & p, int ib[2],p_pl_intern_spline ps, border_flag bf); pl_intern_border(int ib[2],p_pl_intern_spline psSpline,border_flag bf); pl_intern_border(p_pl_intern_spline ps,border_flag _bf); pl_intern_border(p_pl_intern_spline ps,border_flag,aSegments3D&); const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; point get_a_top(int i)const{return aTops(i);}; // Опасная функция, однако... int add_a_top(const point& pt); int n_of_tops()const{return aTops.count()-1;}; virtual int contains(const point &pWhat)const; // По отрезкам - последовательность точек. int fix_points(aSegments3D&); const aPoints& points()const{return aTops;}; point closest_border_point(const point&)const; // Перевод из одних координат в другие point2D local(const point3d&); point3d global(const point2D&); point P0(){return p0;}; point middle()const; friend class pl_model; }; typedef pl_intern_border* p_pl_intern_border; #define AnyType p_pl_intern_border #define AnyAr pl_intern_borders #include <mix/AnyAr.H> class pl_fict_border:public pl_intern_border,public pl_intern_spline{ public: pl_fict_border(const aPoints & p, int ib[2], double A,double B, double C, double D): pl_intern_border(p,ib,NULL,TEMP),pl_intern_spline(A,B,C,D){}; }; typedef pl_fict_border* p_pl_fict_border; typedef ObjectsAr<p_pl_fict_border> pl_fict_borders; // Тело - набор многоугольников class pl_intern_body:public any_body{ protected: pl_intern_body(pl_intern_body &bCopy); pl_intern_splines* get_bodies_splines()const; public: pl_intern_body(geophys_params gp); pl_intern_body(any_borders &ab,geophys_params gp); ~pl_intern_body(){;}; // Добавляем в этот класс, так как требуется пересечение с плоскостями virtual int contains(const point &pWhat)const; // Создание фиктивной границы внутри тела по заданной плоскости int fict_border (const pl_spline& sSlice,p_pl_fict_border& bNew)const; friend class pl_model; }; typedef pl_intern_body* p_pl_intern_body; typedef ObjectsAr<p_pl_intern_body> pl_intern_bodies; // Элементы внешнего представления модели class pl_spline:public any_ex_spline{ protected: double a,b,c,d; public: pl_spline(); pl_spline(double A,double B,double C, double D); // плоскость по трем точкам pl_spline(const point& p1,const point& p2,const point& p3); // Пересечение с отрезком входных точек point cross(const point& p1,const point& p2) const; // Перевод в локальную систему координат point2D local(const point& pMain, const point& p0,const point& p1,const point& p2) const; // С какой стороны от плоскости лежит точка int sign(const point & p) const; void set_coef(double A,double B,double C, double D); void get_coef(double &A,double &B,double &C, double &D); double A() const {return a;}; double B() const {return b;}; double C() const {return c;}; double D() const {return d;}; double distance(const point3d &pWhere); }; typedef pl_spline* p_pl_spline; typedef ObjectsAr<p_pl_spline> p_pl_splines; class pl_border:public any_ex_border{ protected: DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; public: pl_border(); pl_border(const aPoints & at, int ib[2], int is, border_flag bf); pl_border(int ib[2], int is, border_flag bf); point get_a_top(int i)const {return point(aTops_X(i),aTops_Y(i),aTops_Z(i));}; const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; // Аналог конструктора для перезаписи созданного объекта int make_border(DoubleAr&ax,DoubleAr&ay,DoubleAr&az, int ib[2], int is, border_flag bf); int n_of_tops()const{return aTops_Z.count();}; int get_body(int ib); int get_spline()const {return iSpline;}; }; // Почти то же, что и произвольное тело class pl_body:public any_ex_body{ public: pl_body():any_ex_body(){;}; pl_body(IntAr & ab, const geophys_params & gp, int in); }; /* Функция-люмпен...*/ void get_splines_weights(const point& pLast, const pl_intern_splines & paSplines, const any_borders & paBorders, DoubleAr&daWeights); #endif /* p_elements.H */ /* Melnikov George Y. 16-Sep-1998 */ /* ... */ /* Melnikov George Yu. 31-Jan-2000 */
61 friend class pl_model;
62 };
63 
66 
67 
68 // Граница с соответствующими геофизическими параметрамиclass pl_overlying_spline:public pl_intern_spline{ protected: geophys_params gp; point3d pInternal; // Точка, лежащая на границе, образованной этим сплайном public: pl_overlying_spline(const geophys_params &gp,const point3d& p, double dFi,double dAz); geophys_params get_geophys(){return gp;}; point3d get_internal_point(){return pInternal;}; }; typedef pl_overlying_spline* p_pl_overlying_spline; typedef ObjectsAr<p_pl_overlying_spline> pl_overlying_splines; // Граница - многоугольник // Требуется некоторый способ определения целостности границы... class pl_intern_border:public any_border{ protected: aPoints aTops; // Вершины многоугольника, требование: aTops[0]=aTops[_last_]. DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; pl_intern_border(pl_intern_border &bCopy); // Точки, определяющие локальную систему координат на папе-сплайне Logic points_created; point p0; void init_local_coords(); // Вычисляет точку p0 public: ~pl_intern_border(); pl_intern_border(const aPoints & p, int ib[2],p_pl_intern_spline ps, border_flag bf); pl_intern_border(int ib[2],p_pl_intern_spline psSpline,border_flag bf); pl_intern_border(p_pl_intern_spline ps,border_flag _bf); pl_intern_border(p_pl_intern_spline ps,border_flag,aSegments3D&); const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; point get_a_top(int i)const{return aTops(i);}; // Опасная функция, однако... int add_a_top(const point& pt); int n_of_tops()const{return aTops.count()-1;}; virtual int contains(const point &pWhat)const; // По отрезкам - последовательность точек. int fix_points(aSegments3D&); const aPoints& points()const{return aTops;}; point closest_border_point(const point&)const; // Перевод из одних координат в другие point2D local(const point3d&); point3d global(const point2D&); point P0(){return p0;}; point middle()const; friend class pl_model; }; typedef pl_intern_border* p_pl_intern_border; #define AnyType p_pl_intern_border #define AnyAr pl_intern_borders #include <mix/AnyAr.H> class pl_fict_border:public pl_intern_border,public pl_intern_spline{ public: pl_fict_border(const aPoints & p, int ib[2], double A,double B, double C, double D): pl_intern_border(p,ib,NULL,TEMP),pl_intern_spline(A,B,C,D){}; }; typedef pl_fict_border* p_pl_fict_border; typedef ObjectsAr<p_pl_fict_border> pl_fict_borders; // Тело - набор многоугольников class pl_intern_body:public any_body{ protected: pl_intern_body(pl_intern_body &bCopy); pl_intern_splines* get_bodies_splines()const; public: pl_intern_body(geophys_params gp); pl_intern_body(any_borders &ab,geophys_params gp); ~pl_intern_body(){;}; // Добавляем в этот класс, так как требуется пересечение с плоскостями virtual int contains(const point &pWhat)const; // Создание фиктивной границы внутри тела по заданной плоскости int fict_border (const pl_spline& sSlice,p_pl_fict_border& bNew)const; friend class pl_model; }; typedef pl_intern_body* p_pl_intern_body; typedef ObjectsAr<p_pl_intern_body> pl_intern_bodies; // Элементы внешнего представления модели class pl_spline:public any_ex_spline{ protected: double a,b,c,d; public: pl_spline(); pl_spline(double A,double B,double C, double D); // плоскость по трем точкам pl_spline(const point& p1,const point& p2,const point& p3); // Пересечение с отрезком входных точек point cross(const point& p1,const point& p2) const; // Перевод в локальную систему координат point2D local(const point& pMain, const point& p0,const point& p1,const point& p2) const; // С какой стороны от плоскости лежит точка int sign(const point & p) const; void set_coef(double A,double B,double C, double D); void get_coef(double &A,double &B,double &C, double &D); double A() const {return a;}; double B() const {return b;}; double C() const {return c;}; double D() const {return d;}; double distance(const point3d &pWhere); }; typedef pl_spline* p_pl_spline; typedef ObjectsAr<p_pl_spline> p_pl_splines; class pl_border:public any_ex_border{ protected: DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; public: pl_border(); pl_border(const aPoints & at, int ib[2], int is, border_flag bf); pl_border(int ib[2], int is, border_flag bf); point get_a_top(int i)const {return point(aTops_X(i),aTops_Y(i),aTops_Z(i));}; const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; // Аналог конструктора для перезаписи созданного объекта int make_border(DoubleAr&ax,DoubleAr&ay,DoubleAr&az, int ib[2], int is, border_flag bf); int n_of_tops()const{return aTops_Z.count();}; int get_body(int ib); int get_spline()const {return iSpline;}; }; // Почти то же, что и произвольное тело class pl_body:public any_ex_body{ public: pl_body():any_ex_body(){;}; pl_body(IntAr & ab, const geophys_params & gp, int in); }; /* Функция-люмпен...*/ void get_splines_weights(const point& pLast, const pl_intern_splines & paSplines, const any_borders & paBorders, DoubleAr&daWeights); #endif /* p_elements.H */ /* Melnikov George Y. 16-Sep-1998 */ /* ... */ /* Melnikov George Yu. 31-Jan-2000 */
70 protected:
71  geophys_params gp;
72  point3d pInternal; // Точка, лежащая на границе, образованной этим сплайномpublic: pl_overlying_spline(const geophys_params &gp,const point3d& p, double dFi,double dAz); geophys_params get_geophys(){return gp;}; point3d get_internal_point(){return pInternal;}; }; typedef pl_overlying_spline* p_pl_overlying_spline; typedef ObjectsAr<p_pl_overlying_spline> pl_overlying_splines; // Граница - многоугольник // Требуется некоторый способ определения целостности границы... class pl_intern_border:public any_border{ protected: aPoints aTops; // Вершины многоугольника, требование: aTops[0]=aTops[_last_]. DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; pl_intern_border(pl_intern_border &bCopy); // Точки, определяющие локальную систему координат на папе-сплайне Logic points_created; point p0; void init_local_coords(); // Вычисляет точку p0 public: ~pl_intern_border(); pl_intern_border(const aPoints & p, int ib[2],p_pl_intern_spline ps, border_flag bf); pl_intern_border(int ib[2],p_pl_intern_spline psSpline,border_flag bf); pl_intern_border(p_pl_intern_spline ps,border_flag _bf); pl_intern_border(p_pl_intern_spline ps,border_flag,aSegments3D&); const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; point get_a_top(int i)const{return aTops(i);}; // Опасная функция, однако... int add_a_top(const point& pt); int n_of_tops()const{return aTops.count()-1;}; virtual int contains(const point &pWhat)const; // По отрезкам - последовательность точек. int fix_points(aSegments3D&); const aPoints& points()const{return aTops;}; point closest_border_point(const point&)const; // Перевод из одних координат в другие point2D local(const point3d&); point3d global(const point2D&); point P0(){return p0;}; point middle()const; friend class pl_model; }; typedef pl_intern_border* p_pl_intern_border; #define AnyType p_pl_intern_border #define AnyAr pl_intern_borders #include <mix/AnyAr.H> class pl_fict_border:public pl_intern_border,public pl_intern_spline{ public: pl_fict_border(const aPoints & p, int ib[2], double A,double B, double C, double D): pl_intern_border(p,ib,NULL,TEMP),pl_intern_spline(A,B,C,D){}; }; typedef pl_fict_border* p_pl_fict_border; typedef ObjectsAr<p_pl_fict_border> pl_fict_borders; // Тело - набор многоугольников class pl_intern_body:public any_body{ protected: pl_intern_body(pl_intern_body &bCopy); pl_intern_splines* get_bodies_splines()const; public: pl_intern_body(geophys_params gp); pl_intern_body(any_borders &ab,geophys_params gp); ~pl_intern_body(){;}; // Добавляем в этот класс, так как требуется пересечение с плоскостями virtual int contains(const point &pWhat)const; // Создание фиктивной границы внутри тела по заданной плоскости int fict_border (const pl_spline& sSlice,p_pl_fict_border& bNew)const; friend class pl_model; }; typedef pl_intern_body* p_pl_intern_body; typedef ObjectsAr<p_pl_intern_body> pl_intern_bodies; // Элементы внешнего представления модели class pl_spline:public any_ex_spline{ protected: double a,b,c,d; public: pl_spline(); pl_spline(double A,double B,double C, double D); // плоскость по трем точкам pl_spline(const point& p1,const point& p2,const point& p3); // Пересечение с отрезком входных точек point cross(const point& p1,const point& p2) const; // Перевод в локальную систему координат point2D local(const point& pMain, const point& p0,const point& p1,const point& p2) const; // С какой стороны от плоскости лежит точка int sign(const point & p) const; void set_coef(double A,double B,double C, double D); void get_coef(double &A,double &B,double &C, double &D); double A() const {return a;}; double B() const {return b;}; double C() const {return c;}; double D() const {return d;}; double distance(const point3d &pWhere); }; typedef pl_spline* p_pl_spline; typedef ObjectsAr<p_pl_spline> p_pl_splines; class pl_border:public any_ex_border{ protected: DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; public: pl_border(); pl_border(const aPoints & at, int ib[2], int is, border_flag bf); pl_border(int ib[2], int is, border_flag bf); point get_a_top(int i)const {return point(aTops_X(i),aTops_Y(i),aTops_Z(i));}; const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; // Аналог конструктора для перезаписи созданного объекта int make_border(DoubleAr&ax,DoubleAr&ay,DoubleAr&az, int ib[2], int is, border_flag bf); int n_of_tops()const{return aTops_Z.count();}; int get_body(int ib); int get_spline()const {return iSpline;}; }; // Почти то же, что и произвольное тело class pl_body:public any_ex_body{ public: pl_body():any_ex_body(){;}; pl_body(IntAr & ab, const geophys_params & gp, int in); }; /* Функция-люмпен...*/ void get_splines_weights(const point& pLast, const pl_intern_splines & paSplines, const any_borders & paBorders, DoubleAr&daWeights); #endif /* p_elements.H */ /* Melnikov George Y. 16-Sep-1998 */ /* ... */ /* Melnikov George Yu. 31-Jan-2000 */
73 public:
74  pl_overlying_spline(const geophys_params &gp,const point3d& p,
75  double dFi,double dAz);
76  geophys_params get_geophys(){return gp;};
77  point3d get_internal_point(){return pInternal;};
78 };
79 
80 
83 
84 // Граница - многоугольник// Требуется некоторый способ определения целостности границы... class pl_intern_border:public any_border{ protected: aPoints aTops; // Вершины многоугольника, требование: aTops[0]=aTops[_last_]. DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; pl_intern_border(pl_intern_border &bCopy); // Точки, определяющие локальную систему координат на папе-сплайне Logic points_created; point p0; void init_local_coords(); // Вычисляет точку p0 public: ~pl_intern_border(); pl_intern_border(const aPoints & p, int ib[2],p_pl_intern_spline ps, border_flag bf); pl_intern_border(int ib[2],p_pl_intern_spline psSpline,border_flag bf); pl_intern_border(p_pl_intern_spline ps,border_flag _bf); pl_intern_border(p_pl_intern_spline ps,border_flag,aSegments3D&); const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; point get_a_top(int i)const{return aTops(i);}; // Опасная функция, однако... int add_a_top(const point& pt); int n_of_tops()const{return aTops.count()-1;}; virtual int contains(const point &pWhat)const; // По отрезкам - последовательность точек. int fix_points(aSegments3D&); const aPoints& points()const{return aTops;}; point closest_border_point(const point&)const; // Перевод из одних координат в другие point2D local(const point3d&); point3d global(const point2D&); point P0(){return p0;}; point middle()const; friend class pl_model; }; typedef pl_intern_border* p_pl_intern_border; #define AnyType p_pl_intern_border #define AnyAr pl_intern_borders #include <mix/AnyAr.H> class pl_fict_border:public pl_intern_border,public pl_intern_spline{ public: pl_fict_border(const aPoints & p, int ib[2], double A,double B, double C, double D): pl_intern_border(p,ib,NULL,TEMP),pl_intern_spline(A,B,C,D){}; }; typedef pl_fict_border* p_pl_fict_border; typedef ObjectsAr<p_pl_fict_border> pl_fict_borders; // Тело - набор многоугольников class pl_intern_body:public any_body{ protected: pl_intern_body(pl_intern_body &bCopy); pl_intern_splines* get_bodies_splines()const; public: pl_intern_body(geophys_params gp); pl_intern_body(any_borders &ab,geophys_params gp); ~pl_intern_body(){;}; // Добавляем в этот класс, так как требуется пересечение с плоскостями virtual int contains(const point &pWhat)const; // Создание фиктивной границы внутри тела по заданной плоскости int fict_border (const pl_spline& sSlice,p_pl_fict_border& bNew)const; friend class pl_model; }; typedef pl_intern_body* p_pl_intern_body; typedef ObjectsAr<p_pl_intern_body> pl_intern_bodies; // Элементы внешнего представления модели class pl_spline:public any_ex_spline{ protected: double a,b,c,d; public: pl_spline(); pl_spline(double A,double B,double C, double D); // плоскость по трем точкам pl_spline(const point& p1,const point& p2,const point& p3); // Пересечение с отрезком входных точек point cross(const point& p1,const point& p2) const; // Перевод в локальную систему координат point2D local(const point& pMain, const point& p0,const point& p1,const point& p2) const; // С какой стороны от плоскости лежит точка int sign(const point & p) const; void set_coef(double A,double B,double C, double D); void get_coef(double &A,double &B,double &C, double &D); double A() const {return a;}; double B() const {return b;}; double C() const {return c;}; double D() const {return d;}; double distance(const point3d &pWhere); }; typedef pl_spline* p_pl_spline; typedef ObjectsAr<p_pl_spline> p_pl_splines; class pl_border:public any_ex_border{ protected: DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; public: pl_border(); pl_border(const aPoints & at, int ib[2], int is, border_flag bf); pl_border(int ib[2], int is, border_flag bf); point get_a_top(int i)const {return point(aTops_X(i),aTops_Y(i),aTops_Z(i));}; const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; // Аналог конструктора для перезаписи созданного объекта int make_border(DoubleAr&ax,DoubleAr&ay,DoubleAr&az, int ib[2], int is, border_flag bf); int n_of_tops()const{return aTops_Z.count();}; int get_body(int ib); int get_spline()const {return iSpline;}; }; // Почти то же, что и произвольное тело class pl_body:public any_ex_body{ public: pl_body():any_ex_body(){;}; pl_body(IntAr & ab, const geophys_params & gp, int in); }; /* Функция-люмпен...*/ void get_splines_weights(const point& pLast, const pl_intern_splines & paSplines, const any_borders & paBorders, DoubleAr&daWeights); #endif /* p_elements.H */ /* Melnikov George Y. 16-Sep-1998 */ /* ... */ /* Melnikov George Yu. 31-Jan-2000 */
85 // Требуется некоторый способ определения целостности границы...
87 protected:
88  aPoints aTops; // Вершины многоугольника, требование: aTops[0]=aTops[_last_].
89  DoubleAr aTops_X;
90  DoubleAr aTops_Y;
91  DoubleAr aTops_Z;
93 
94  // Точки, определяющие локальную систему координат на папе-сплайне
95  Logic points_created;
96  point p0;
97 
98  void init_local_coords(); // Вычисляет точку p0
99 public:
100  ~pl_intern_border();
101  pl_intern_border(const aPoints & p, int ib[2],p_pl_intern_spline ps,
102  border_flag bf);
103  pl_intern_border(int ib[2],p_pl_intern_spline psSpline,border_flag bf);
104  pl_intern_border(p_pl_intern_spline ps,border_flag _bf);
105  pl_intern_border(p_pl_intern_spline ps,border_flag,aSegments3D&);
106 
107  const DoubleAr& get_x()const;
108  const DoubleAr& get_y()const;
109  const DoubleAr& get_z()const;
110  point get_a_top(int i)const{return aTops(i);};
111  // Опасная функция, однако...
112  int add_a_top(const point& pt);
113  int n_of_tops()const{return aTops.count()-1;};
114  virtual int contains(const point &pWhat)const;
115  // По отрезкам - последовательность точек.
116  int fix_points(aSegments3D&);
117  const aPoints& points()const{return aTops;};
118  point closest_border_point(const point&)const;
119 
120  // Перевод из одних координат в другие point2D local(const point3d&); point3d global(const point2D&); point P0(){return p0;}; point middle()const; friend class pl_model; }; typedef pl_intern_border* p_pl_intern_border; #define AnyType p_pl_intern_border #define AnyAr pl_intern_borders #include <mix/AnyAr.H> class pl_fict_border:public pl_intern_border,public pl_intern_spline{ public: pl_fict_border(const aPoints & p, int ib[2], double A,double B, double C, double D): pl_intern_border(p,ib,NULL,TEMP),pl_intern_spline(A,B,C,D){}; }; typedef pl_fict_border* p_pl_fict_border; typedef ObjectsAr<p_pl_fict_border> pl_fict_borders; // Тело - набор многоугольников class pl_intern_body:public any_body{ protected: pl_intern_body(pl_intern_body &bCopy); pl_intern_splines* get_bodies_splines()const; public: pl_intern_body(geophys_params gp); pl_intern_body(any_borders &ab,geophys_params gp); ~pl_intern_body(){;}; // Добавляем в этот класс, так как требуется пересечение с плоскостями virtual int contains(const point &pWhat)const; // Создание фиктивной границы внутри тела по заданной плоскости int fict_border (const pl_spline& sSlice,p_pl_fict_border& bNew)const; friend class pl_model; }; typedef pl_intern_body* p_pl_intern_body; typedef ObjectsAr<p_pl_intern_body> pl_intern_bodies; // Элементы внешнего представления модели class pl_spline:public any_ex_spline{ protected: double a,b,c,d; public: pl_spline(); pl_spline(double A,double B,double C, double D); // плоскость по трем точкам pl_spline(const point& p1,const point& p2,const point& p3); // Пересечение с отрезком входных точек point cross(const point& p1,const point& p2) const; // Перевод в локальную систему координат point2D local(const point& pMain, const point& p0,const point& p1,const point& p2) const; // С какой стороны от плоскости лежит точка int sign(const point & p) const; void set_coef(double A,double B,double C, double D); void get_coef(double &A,double &B,double &C, double &D); double A() const {return a;}; double B() const {return b;}; double C() const {return c;}; double D() const {return d;}; double distance(const point3d &pWhere); }; typedef pl_spline* p_pl_spline; typedef ObjectsAr<p_pl_spline> p_pl_splines; class pl_border:public any_ex_border{ protected: DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; public: pl_border(); pl_border(const aPoints & at, int ib[2], int is, border_flag bf); pl_border(int ib[2], int is, border_flag bf); point get_a_top(int i)const {return point(aTops_X(i),aTops_Y(i),aTops_Z(i));}; const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; // Аналог конструктора для перезаписи созданного объекта int make_border(DoubleAr&ax,DoubleAr&ay,DoubleAr&az, int ib[2], int is, border_flag bf); int n_of_tops()const{return aTops_Z.count();}; int get_body(int ib); int get_spline()const {return iSpline;}; }; // Почти то же, что и произвольное тело class pl_body:public any_ex_body{ public: pl_body():any_ex_body(){;}; pl_body(IntAr & ab, const geophys_params & gp, int in); }; /* Функция-люмпен...*/ void get_splines_weights(const point& pLast, const pl_intern_splines & paSplines, const any_borders & paBorders, DoubleAr&daWeights); #endif /* p_elements.H */ /* Melnikov George Y. 16-Sep-1998 */ /* ... */ /* Melnikov George Yu. 31-Jan-2000 */
121  point2D local(const point3d&);
122  point3d global(const point2D&);
123  point P0(){return p0;};
124  point middle()const;
125  friend class pl_model;
126 };
127 
129 #define AnyType p_pl_intern_border
130 #define AnyAr pl_intern_borders
131 #include <mix/AnyAr.H>
132 
133 
135 public:
136  pl_fict_border(const aPoints & p, int ib[2],
137  double A,double B, double C, double D):
138  pl_intern_border(p,ib,NULL,TEMP),pl_intern_spline(A,B,C,D){};
139 };
140 
143 
144 // Тело - набор многоугольниковclass pl_intern_body:public any_body{ protected: pl_intern_body(pl_intern_body &bCopy); pl_intern_splines* get_bodies_splines()const; public: pl_intern_body(geophys_params gp); pl_intern_body(any_borders &ab,geophys_params gp); ~pl_intern_body(){;}; // Добавляем в этот класс, так как требуется пересечение с плоскостями virtual int contains(const point &pWhat)const; // Создание фиктивной границы внутри тела по заданной плоскости int fict_border (const pl_spline& sSlice,p_pl_fict_border& bNew)const; friend class pl_model; }; typedef pl_intern_body* p_pl_intern_body; typedef ObjectsAr<p_pl_intern_body> pl_intern_bodies; // Элементы внешнего представления модели class pl_spline:public any_ex_spline{ protected: double a,b,c,d; public: pl_spline(); pl_spline(double A,double B,double C, double D); // плоскость по трем точкам pl_spline(const point& p1,const point& p2,const point& p3); // Пересечение с отрезком входных точек point cross(const point& p1,const point& p2) const; // Перевод в локальную систему координат point2D local(const point& pMain, const point& p0,const point& p1,const point& p2) const; // С какой стороны от плоскости лежит точка int sign(const point & p) const; void set_coef(double A,double B,double C, double D); void get_coef(double &A,double &B,double &C, double &D); double A() const {return a;}; double B() const {return b;}; double C() const {return c;}; double D() const {return d;}; double distance(const point3d &pWhere); }; typedef pl_spline* p_pl_spline; typedef ObjectsAr<p_pl_spline> p_pl_splines; class pl_border:public any_ex_border{ protected: DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; public: pl_border(); pl_border(const aPoints & at, int ib[2], int is, border_flag bf); pl_border(int ib[2], int is, border_flag bf); point get_a_top(int i)const {return point(aTops_X(i),aTops_Y(i),aTops_Z(i));}; const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; // Аналог конструктора для перезаписи созданного объекта int make_border(DoubleAr&ax,DoubleAr&ay,DoubleAr&az, int ib[2], int is, border_flag bf); int n_of_tops()const{return aTops_Z.count();}; int get_body(int ib); int get_spline()const {return iSpline;}; }; // Почти то же, что и произвольное тело class pl_body:public any_ex_body{ public: pl_body():any_ex_body(){;}; pl_body(IntAr & ab, const geophys_params & gp, int in); }; /* Функция-люмпен...*/ void get_splines_weights(const point& pLast, const pl_intern_splines & paSplines, const any_borders & paBorders, DoubleAr&daWeights); #endif /* p_elements.H */ /* Melnikov George Y. 16-Sep-1998 */ /* ... */ /* Melnikov George Yu. 31-Jan-2000 */
146 protected:
148  pl_intern_splines* get_bodies_splines()const;
149 public:
152  ~pl_intern_body(){;};
153 
154  // Добавляем в этот класс, так как требуется пересечение с плоскостями
155  virtual int contains(const point &pWhat)const;
156 
157  // Создание фиктивной границы внутри тела по заданной плоскости
158  int fict_border (const pl_spline& sSlice,p_pl_fict_border& bNew)const;
159 
160 friend class pl_model;
161 };
162 
165 
166 // Элементы внешнего представления модели
167 
169 protected:
170  double a,b,c,d;
171 
172 public:
173  pl_spline();
174  pl_spline(double A,double B,double C, double D);
175 
176  // плоскость по трем точкам pl_spline(const point& p1,const point& p2,const point& p3); // Пересечение с отрезком входных точек point cross(const point& p1,const point& p2) const; // Перевод в локальную систему координат point2D local(const point& pMain, const point& p0,const point& p1,const point& p2) const; // С какой стороны от плоскости лежит точка int sign(const point & p) const; void set_coef(double A,double B,double C, double D); void get_coef(double &A,double &B,double &C, double &D); double A() const {return a;}; double B() const {return b;}; double C() const {return c;}; double D() const {return d;}; double distance(const point3d &pWhere); }; typedef pl_spline* p_pl_spline; typedef ObjectsAr<p_pl_spline> p_pl_splines; class pl_border:public any_ex_border{ protected: DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; public: pl_border(); pl_border(const aPoints & at, int ib[2], int is, border_flag bf); pl_border(int ib[2], int is, border_flag bf); point get_a_top(int i)const {return point(aTops_X(i),aTops_Y(i),aTops_Z(i));}; const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; // Аналог конструктора для перезаписи созданного объекта int make_border(DoubleAr&ax,DoubleAr&ay,DoubleAr&az, int ib[2], int is, border_flag bf); int n_of_tops()const{return aTops_Z.count();}; int get_body(int ib); int get_spline()const {return iSpline;}; }; // Почти то же, что и произвольное тело class pl_body:public any_ex_body{ public: pl_body():any_ex_body(){;}; pl_body(IntAr & ab, const geophys_params & gp, int in); }; /* Функция-люмпен...*/ void get_splines_weights(const point& pLast, const pl_intern_splines & paSplines, const any_borders & paBorders, DoubleAr&daWeights); #endif /* p_elements.H */ /* Melnikov George Y. 16-Sep-1998 */ /* ... */ /* Melnikov George Yu. 31-Jan-2000 */
177  pl_spline(const point& p1,const point& p2,const point& p3);
178 
179  // Пересечение с отрезком входных точек
180  point cross(const point& p1,const point& p2) const;
181 
182  // Перевод в локальную систему координат point2D local(const point& pMain, const point& p0,const point& p1,const point& p2) const; // С какой стороны от плоскости лежит точка int sign(const point & p) const; void set_coef(double A,double B,double C, double D); void get_coef(double &A,double &B,double &C, double &D); double A() const {return a;}; double B() const {return b;}; double C() const {return c;}; double D() const {return d;}; double distance(const point3d &pWhere); }; typedef pl_spline* p_pl_spline; typedef ObjectsAr<p_pl_spline> p_pl_splines; class pl_border:public any_ex_border{ protected: DoubleAr aTops_X; DoubleAr aTops_Y; DoubleAr aTops_Z; public: pl_border(); pl_border(const aPoints & at, int ib[2], int is, border_flag bf); pl_border(int ib[2], int is, border_flag bf); point get_a_top(int i)const {return point(aTops_X(i),aTops_Y(i),aTops_Z(i));}; const DoubleAr& get_x()const; const DoubleAr& get_y()const; const DoubleAr& get_z()const; // Аналог конструктора для перезаписи созданного объекта int make_border(DoubleAr&ax,DoubleAr&ay,DoubleAr&az, int ib[2], int is, border_flag bf); int n_of_tops()const{return aTops_Z.count();}; int get_body(int ib); int get_spline()const {return iSpline;}; }; // Почти то же, что и произвольное тело class pl_body:public any_ex_body{ public: pl_body():any_ex_body(){;}; pl_body(IntAr & ab, const geophys_params & gp, int in); }; /* Функция-люмпен...*/ void get_splines_weights(const point& pLast, const pl_intern_splines & paSplines, const any_borders & paBorders, DoubleAr&daWeights); #endif /* p_elements.H */ /* Melnikov George Y. 16-Sep-1998 */ /* ... */ /* Melnikov George Yu. 31-Jan-2000 */
183  point2D local(const point& pMain,
184  const point& p0,const point& p1,const point& p2) const;
185 
186  // С какой стороны от плоскости лежит точка
187  int sign(const point & p) const;
188 
189  void set_coef(double A,double B,double C, double D);
190  void get_coef(double &A,double &B,double &C, double &D);
191  double A() const {return a;};
192  double B() const {return b;};
193  double C() const {return c;};
194  double D() const {return d;};
195  double distance(const point3d &pWhere);
196 };
197 
198 typedef pl_spline* p_pl_spline;
200 
202 protected:
203  DoubleAr aTops_X;
204  DoubleAr aTops_Y;
205  DoubleAr aTops_Z;
206 public:
207  pl_border();
208  pl_border(const aPoints & at, int ib[2], int is, border_flag bf);
209  pl_border(int ib[2], int is, border_flag bf);
210  point get_a_top(int i)const {return point(aTops_X(i),aTops_Y(i),aTops_Z(i));};
211  const DoubleAr& get_x()const;
212  const DoubleAr& get_y()const;
213  const DoubleAr& get_z()const;
214 
215  // Аналог конструктора для перезаписи созданного объекта int make_border(DoubleAr&ax,DoubleAr&ay,DoubleAr&az, int ib[2], int is, border_flag bf); int n_of_tops()const{return aTops_Z.count();}; int get_body(int ib); int get_spline()const {return iSpline;}; }; // Почти то же, что и произвольное тело class pl_body:public any_ex_body{ public: pl_body():any_ex_body(){;}; pl_body(IntAr & ab, const geophys_params & gp, int in); }; /* Функция-люмпен...*/ void get_splines_weights(const point& pLast, const pl_intern_splines & paSplines, const any_borders & paBorders, DoubleAr&daWeights); #endif /* p_elements.H */ /* Melnikov George Y. 16-Sep-1998 */ /* ... */ /* Melnikov George Yu. 31-Jan-2000 */
216  int make_border(DoubleAr&ax,DoubleAr&ay,DoubleAr&az,
217  int ib[2], int is, border_flag bf);
218 
219  int n_of_tops()const{return aTops_Z.count();};
220  int get_body(int ib);
221  int get_spline()const {return iSpline;};
222 };
223 
224 // Почти то же, что и произвольное телоclass pl_body:public any_ex_body{ public: pl_body():any_ex_body(){;}; pl_body(IntAr & ab, const geophys_params & gp, int in); }; /* Функция-люмпен...*/ void get_splines_weights(const point& pLast, const pl_intern_splines & paSplines, const any_borders & paBorders, DoubleAr&daWeights); #endif /* p_elements.H */ /* Melnikov George Y. 16-Sep-1998 */ /* ... */ /* Melnikov George Yu. 31-Jan-2000 */
225 class pl_body:public any_ex_body{
226 public:
227  pl_body():any_ex_body(){;};
228  pl_body(IntAr & ab, const geophys_params & gp, int in);
229 };
230 
231 
232 /* Функция-люмпен...*/
233 void get_splines_weights(const point& pLast,
234  const pl_intern_splines & paSplines,
235  const any_borders & paBorders,
236  DoubleAr&daWeights);
237 #endif /* p_elements.H */
238 /* Melnikov George Y. 16-Sep-1998 */
239 /* ... */
240 /* Melnikov George Yu. 31-Jan-2000 */
Definition: any_elements.H:98
Definition: p_elements.H:225
Definition: any_elements.H:221
Definition: p_elements.H:86
Definition: any_elements.H:22
Definition: p_model.H:29
Definition: any_model.H:30
Definition: p_elements.H:69
Definition: p_elements.H:23
Definition: p_elements.H:201
Definition: IntAr.H:14
Definition: any_elements.H:108
Definition: p_elements.H:145
Definition: p_elements.H:168
Definition: geometry.H:16
Definition: ObjectsAr.H:21
Definition: any_elements.H:201
Definition: DoubleAr.H:14
Definition: p_elements.H:134
Definition: geometry.H:39
Definition: any_elements.H:207
Definition: any_elements.H:134