UNIVERS  15.3
UNIVERS base processing software API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
p_vspogt_elements.H
1 /* p_vspogt_elements.H */
2 /* $Id: p_vspogt_elements.H,v 2.6 2001/09/25 17:58:05 hoh Exp $ */
3 #ifndef __p_vspogt_elements_H
4 #define __p_vspogt_elements_H
5 
6 #include <mix/IntAr.H>
7 #include <mix/IndexAr.H>
8 #include <mod3d/p_raytr_model.H>
9 #include <mod3d/p_raytr_elements.H>
10 #include <mod3d/rays.H>
11 
12 // Данные для продолжения луча внутри телаstruct extend_data{ double vray[3]; double dTime; point pStart; }; class time_depth_list_local{ protected: Logic lPrepared; IndexAr ia; DoubleAr daTimes; DoubleAr daFi; DoubleAr daAz; DoubleAr daProp; DoubleAr daDiver; DoubleAr daRefRat; DoubleAr davpolx; DoubleAr davpoly; DoubleAr davpolz; aPoints paReflections; p_pl_splines paReflectingSplines; // Проинтерполировали точку по соседям int interpolate (int iPoint,point&pRes) const; // Иногда приходится и удалять лишние элементы void remove(int i); public: // На случай, если создается локальный список, который не будем в БД писать time_depth_list_local(unsigned quant = DEFAULT_QUANT, unsigned volume = START_VOLUME); // По времени - линейная интерполяция параметров void interpolate(double dTime,double& prop,double& diver,double& refrat, point&pRefl,pl_spline& sReflect) const; void interpolate(double dTime, double* vpol) const; double start_time()const{return daTimes(ia(0));}; double finish_time()const{return daTimes(ia(_last_));}; // Время серёдки сегмента с передаваемым номером double t_of_new_border(int) const; // Типа внесли начальные отражения итадалее void prepared(){lPrepared=TRUE;}; int n_of_segments() const; // Количество сегментов в списке // добавить время-точку-сплайн void add_new_node(double, const point3d &, p_pl_intern_spline,ray_to_receiver &,Logic); void add_new_node(double, const point3d &, p_pl_intern_spline,ray_to_receiver &,double); void merge(const time_depth_list_local&); // Прибавить к одному списку другой // По времени - номер отрезка int t2i(double)const; // Слияние двух тиспасписков без повторов void merge_unique(const time_depth_list_local&); // То же, но добавляет новые элементы исключительно по краям void merge_unique_monotone(const time_depth_list_local&); // Разного рода чистки void clear(); void pack(); // Различные отладочные фички void debug_output() const; friend class time_depth_lists; }; class time_depth_list: public db_container,public time_depth_list_local{ protected: dbHandle dbhReceivers; dbHandle dbhTD; static int iLast; int N1,N2; int iTDLStoreRegime; // Работа с БД int read_from_db (dbItem& dbiTD, dbItem& dbiRN); int write_to_db (dbItem& dbiTD, dbItem& dbiRN)const; void get_item (dbItem& dbiRes, dbItem& dbiRN) const; public: // Если таким образом создан - можем писать в БД time_depth_list(db_results_manager& d,char*sp, int id,int n1,int n2, int iTDLSR=PM_ADD, unsigned quant = DEFAULT_QUANT,unsigned volume = START_VOLUME); // БД virtual int store() const; virtual int load(); void prepare_pack_load (dbHandle&dbhR,dbHandle&dbhT); void done_loading(); void pack_load(dbHandle&,dbHandle&); friend class time_depth_lists; }; typedef time_depth_list* p_time_depth_list; typedef ObjectsAr<p_time_depth_list> time_depth_lists_dynar; class time_depth_lists:public time_depth_lists_dynar{ public: p_time_depth_list get(int,int)const; }; class pl_vspogt_body:public pl_intern_body,public time_depth_list_local{ protected: pl_intern_borders paActiveBorders; DoubleAr daActualTimes; // Времена, на которых отражались ^ границы Logic interpolated(int) const; p_pl_fict_border get_fict_border(double)const; // Фиктивная граница по времени extend_data *ed; public: pl_vspogt_body(geophys_params&g); ~pl_vspogt_body(){paActiveBorders.clean();delete ed;}; void prepare_for_vspogt(const pl_intern_borders&,rays_to_receiver* prtr, const DoubleAr& daRT); void get_initial_fict_borders(pl_fict_borders &)const; // Пара фиктивных границ по номеру плохоинтерполированного Ж8() времени pl_fict_borders* get_fict_borders(int) const; // Некоторое количество фиктивных границ по узлу ib void add_n_borders(int iNNewPointsLeft,int ib,pl_fict_borders*, ray_parameters_dynar *)const; // Номер этогосамого узла int bad_interpolation(); void clear(); //Получение тройки фиктивных границ ниже отражающей (случай глубочайшего тела) pl_fict_borders*extend_initial(ray* prInitial,double dTLast,DoubleAr&daTimes, p_pl_intern_border); // Продолжение луча внутри тела (по данным, уже подготовленным ^^^) Logic extend(double dWhere,point& pRes); // Фиктивная граница по времени p_pl_fict_border get_fict_border(pl_fict_border&,point)const; p_pl_fict_border get_fict_horizontal_border(point)const; }; typedef pl_vspogt_body* p_pl_vspogt_body; typedef ObjectsAr<p_pl_vspogt_body> pl_vspogt_bodies; typedef ObjectsAr<IntAr*> aKindaBorders; class mixer:public aSegments2D{ protected: int *iaFlags; aKindaBorders akbCurrent; void clear_data(); // Определяет, лежит ли точка в созданном теле Logic point_in_body(const point2D& pWhat,int iB); // Определяет направление по телу void get_direction_body(const point2D& pWhat,int iB,double& A,double& B); // Пытается создать еще одно тело IntAr* new_body (const point2D& pWhat); // Засувает тело в список void add_body(IntAr*piaBody); inline int sign(const point2D&,segment2D&); int segment_other_body_line(int iB); public: mixer(){iaFlags=NULL;}; // По точке выдает направление смесителя в ней void get_mix_direction(const point2D& pWhere,double& A,double& B); // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
13 struct extend_data{
14  double vray[3];
15  double dTime;
16  point pStart;
17 };
18 
20 protected:
21  Logic lPrepared;
22  IndexAr ia;
23  DoubleAr daTimes;
24 
25  DoubleAr daFi;
26  DoubleAr daAz;
27 
28  DoubleAr daProp;
29  DoubleAr daDiver;
30 
31  DoubleAr daRefRat;
32 
33  DoubleAr davpolx;
34  DoubleAr davpoly;
35  DoubleAr davpolz;
36 
37  aPoints paReflections;
38  p_pl_splines paReflectingSplines;
39 
40  // Проинтерполировали точку по соседям int interpolate (int iPoint,point&pRes) const; // Иногда приходится и удалять лишние элементы void remove(int i); public: // На случай, если создается локальный список, который не будем в БД писать time_depth_list_local(unsigned quant = DEFAULT_QUANT, unsigned volume = START_VOLUME); // По времени - линейная интерполяция параметров void interpolate(double dTime,double& prop,double& diver,double& refrat, point&pRefl,pl_spline& sReflect) const; void interpolate(double dTime, double* vpol) const; double start_time()const{return daTimes(ia(0));}; double finish_time()const{return daTimes(ia(_last_));}; // Время серёдки сегмента с передаваемым номером double t_of_new_border(int) const; // Типа внесли начальные отражения итадалее void prepared(){lPrepared=TRUE;}; int n_of_segments() const; // Количество сегментов в списке // добавить время-точку-сплайн void add_new_node(double, const point3d &, p_pl_intern_spline,ray_to_receiver &,Logic); void add_new_node(double, const point3d &, p_pl_intern_spline,ray_to_receiver &,double); void merge(const time_depth_list_local&); // Прибавить к одному списку другой // По времени - номер отрезка int t2i(double)const; // Слияние двух тиспасписков без повторов void merge_unique(const time_depth_list_local&); // То же, но добавляет новые элементы исключительно по краям void merge_unique_monotone(const time_depth_list_local&); // Разного рода чистки void clear(); void pack(); // Различные отладочные фички void debug_output() const; friend class time_depth_lists; }; class time_depth_list: public db_container,public time_depth_list_local{ protected: dbHandle dbhReceivers; dbHandle dbhTD; static int iLast; int N1,N2; int iTDLStoreRegime; // Работа с БД int read_from_db (dbItem& dbiTD, dbItem& dbiRN); int write_to_db (dbItem& dbiTD, dbItem& dbiRN)const; void get_item (dbItem& dbiRes, dbItem& dbiRN) const; public: // Если таким образом создан - можем писать в БД time_depth_list(db_results_manager& d,char*sp, int id,int n1,int n2, int iTDLSR=PM_ADD, unsigned quant = DEFAULT_QUANT,unsigned volume = START_VOLUME); // БД virtual int store() const; virtual int load(); void prepare_pack_load (dbHandle&dbhR,dbHandle&dbhT); void done_loading(); void pack_load(dbHandle&,dbHandle&); friend class time_depth_lists; }; typedef time_depth_list* p_time_depth_list; typedef ObjectsAr<p_time_depth_list> time_depth_lists_dynar; class time_depth_lists:public time_depth_lists_dynar{ public: p_time_depth_list get(int,int)const; }; class pl_vspogt_body:public pl_intern_body,public time_depth_list_local{ protected: pl_intern_borders paActiveBorders; DoubleAr daActualTimes; // Времена, на которых отражались ^ границы Logic interpolated(int) const; p_pl_fict_border get_fict_border(double)const; // Фиктивная граница по времени extend_data *ed; public: pl_vspogt_body(geophys_params&g); ~pl_vspogt_body(){paActiveBorders.clean();delete ed;}; void prepare_for_vspogt(const pl_intern_borders&,rays_to_receiver* prtr, const DoubleAr& daRT); void get_initial_fict_borders(pl_fict_borders &)const; // Пара фиктивных границ по номеру плохоинтерполированного Ж8() времени pl_fict_borders* get_fict_borders(int) const; // Некоторое количество фиктивных границ по узлу ib void add_n_borders(int iNNewPointsLeft,int ib,pl_fict_borders*, ray_parameters_dynar *)const; // Номер этогосамого узла int bad_interpolation(); void clear(); //Получение тройки фиктивных границ ниже отражающей (случай глубочайшего тела) pl_fict_borders*extend_initial(ray* prInitial,double dTLast,DoubleAr&daTimes, p_pl_intern_border); // Продолжение луча внутри тела (по данным, уже подготовленным ^^^) Logic extend(double dWhere,point& pRes); // Фиктивная граница по времени p_pl_fict_border get_fict_border(pl_fict_border&,point)const; p_pl_fict_border get_fict_horizontal_border(point)const; }; typedef pl_vspogt_body* p_pl_vspogt_body; typedef ObjectsAr<p_pl_vspogt_body> pl_vspogt_bodies; typedef ObjectsAr<IntAr*> aKindaBorders; class mixer:public aSegments2D{ protected: int *iaFlags; aKindaBorders akbCurrent; void clear_data(); // Определяет, лежит ли точка в созданном теле Logic point_in_body(const point2D& pWhat,int iB); // Определяет направление по телу void get_direction_body(const point2D& pWhat,int iB,double& A,double& B); // Пытается создать еще одно тело IntAr* new_body (const point2D& pWhat); // Засувает тело в список void add_body(IntAr*piaBody); inline int sign(const point2D&,segment2D&); int segment_other_body_line(int iB); public: mixer(){iaFlags=NULL;}; // По точке выдает направление смесителя в ней void get_mix_direction(const point2D& pWhere,double& A,double& B); // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
41  int interpolate (int iPoint,point&pRes) const;
42 
43  // Иногда приходится и удалять лишние элементы void remove(int i); public: // На случай, если создается локальный список, который не будем в БД писать time_depth_list_local(unsigned quant = DEFAULT_QUANT, unsigned volume = START_VOLUME); // По времени - линейная интерполяция параметров void interpolate(double dTime,double& prop,double& diver,double& refrat, point&pRefl,pl_spline& sReflect) const; void interpolate(double dTime, double* vpol) const; double start_time()const{return daTimes(ia(0));}; double finish_time()const{return daTimes(ia(_last_));}; // Время серёдки сегмента с передаваемым номером double t_of_new_border(int) const; // Типа внесли начальные отражения итадалее void prepared(){lPrepared=TRUE;}; int n_of_segments() const; // Количество сегментов в списке // добавить время-точку-сплайн void add_new_node(double, const point3d &, p_pl_intern_spline,ray_to_receiver &,Logic); void add_new_node(double, const point3d &, p_pl_intern_spline,ray_to_receiver &,double); void merge(const time_depth_list_local&); // Прибавить к одному списку другой // По времени - номер отрезка int t2i(double)const; // Слияние двух тиспасписков без повторов void merge_unique(const time_depth_list_local&); // То же, но добавляет новые элементы исключительно по краям void merge_unique_monotone(const time_depth_list_local&); // Разного рода чистки void clear(); void pack(); // Различные отладочные фички void debug_output() const; friend class time_depth_lists; }; class time_depth_list: public db_container,public time_depth_list_local{ protected: dbHandle dbhReceivers; dbHandle dbhTD; static int iLast; int N1,N2; int iTDLStoreRegime; // Работа с БД int read_from_db (dbItem& dbiTD, dbItem& dbiRN); int write_to_db (dbItem& dbiTD, dbItem& dbiRN)const; void get_item (dbItem& dbiRes, dbItem& dbiRN) const; public: // Если таким образом создан - можем писать в БД time_depth_list(db_results_manager& d,char*sp, int id,int n1,int n2, int iTDLSR=PM_ADD, unsigned quant = DEFAULT_QUANT,unsigned volume = START_VOLUME); // БД virtual int store() const; virtual int load(); void prepare_pack_load (dbHandle&dbhR,dbHandle&dbhT); void done_loading(); void pack_load(dbHandle&,dbHandle&); friend class time_depth_lists; }; typedef time_depth_list* p_time_depth_list; typedef ObjectsAr<p_time_depth_list> time_depth_lists_dynar; class time_depth_lists:public time_depth_lists_dynar{ public: p_time_depth_list get(int,int)const; }; class pl_vspogt_body:public pl_intern_body,public time_depth_list_local{ protected: pl_intern_borders paActiveBorders; DoubleAr daActualTimes; // Времена, на которых отражались ^ границы Logic interpolated(int) const; p_pl_fict_border get_fict_border(double)const; // Фиктивная граница по времени extend_data *ed; public: pl_vspogt_body(geophys_params&g); ~pl_vspogt_body(){paActiveBorders.clean();delete ed;}; void prepare_for_vspogt(const pl_intern_borders&,rays_to_receiver* prtr, const DoubleAr& daRT); void get_initial_fict_borders(pl_fict_borders &)const; // Пара фиктивных границ по номеру плохоинтерполированного Ж8() времени pl_fict_borders* get_fict_borders(int) const; // Некоторое количество фиктивных границ по узлу ib void add_n_borders(int iNNewPointsLeft,int ib,pl_fict_borders*, ray_parameters_dynar *)const; // Номер этогосамого узла int bad_interpolation(); void clear(); //Получение тройки фиктивных границ ниже отражающей (случай глубочайшего тела) pl_fict_borders*extend_initial(ray* prInitial,double dTLast,DoubleAr&daTimes, p_pl_intern_border); // Продолжение луча внутри тела (по данным, уже подготовленным ^^^) Logic extend(double dWhere,point& pRes); // Фиктивная граница по времени p_pl_fict_border get_fict_border(pl_fict_border&,point)const; p_pl_fict_border get_fict_horizontal_border(point)const; }; typedef pl_vspogt_body* p_pl_vspogt_body; typedef ObjectsAr<p_pl_vspogt_body> pl_vspogt_bodies; typedef ObjectsAr<IntAr*> aKindaBorders; class mixer:public aSegments2D{ protected: int *iaFlags; aKindaBorders akbCurrent; void clear_data(); // Определяет, лежит ли точка в созданном теле Logic point_in_body(const point2D& pWhat,int iB); // Определяет направление по телу void get_direction_body(const point2D& pWhat,int iB,double& A,double& B); // Пытается создать еще одно тело IntAr* new_body (const point2D& pWhat); // Засувает тело в список void add_body(IntAr*piaBody); inline int sign(const point2D&,segment2D&); int segment_other_body_line(int iB); public: mixer(){iaFlags=NULL;}; // По точке выдает направление смесителя в ней void get_mix_direction(const point2D& pWhere,double& A,double& B); // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
44  void remove(int i);
45 public:
46 
47  // На случай, если создается локальный список, который не будем в БД писать time_depth_list_local(unsigned quant = DEFAULT_QUANT, unsigned volume = START_VOLUME); // По времени - линейная интерполяция параметров void interpolate(double dTime,double& prop,double& diver,double& refrat, point&pRefl,pl_spline& sReflect) const; void interpolate(double dTime, double* vpol) const; double start_time()const{return daTimes(ia(0));}; double finish_time()const{return daTimes(ia(_last_));}; // Время серёдки сегмента с передаваемым номером double t_of_new_border(int) const; // Типа внесли начальные отражения итадалее void prepared(){lPrepared=TRUE;}; int n_of_segments() const; // Количество сегментов в списке // добавить время-точку-сплайн void add_new_node(double, const point3d &, p_pl_intern_spline,ray_to_receiver &,Logic); void add_new_node(double, const point3d &, p_pl_intern_spline,ray_to_receiver &,double); void merge(const time_depth_list_local&); // Прибавить к одному списку другой // По времени - номер отрезка int t2i(double)const; // Слияние двух тиспасписков без повторов void merge_unique(const time_depth_list_local&); // То же, но добавляет новые элементы исключительно по краям void merge_unique_monotone(const time_depth_list_local&); // Разного рода чистки void clear(); void pack(); // Различные отладочные фички void debug_output() const; friend class time_depth_lists; }; class time_depth_list: public db_container,public time_depth_list_local{ protected: dbHandle dbhReceivers; dbHandle dbhTD; static int iLast; int N1,N2; int iTDLStoreRegime; // Работа с БД int read_from_db (dbItem& dbiTD, dbItem& dbiRN); int write_to_db (dbItem& dbiTD, dbItem& dbiRN)const; void get_item (dbItem& dbiRes, dbItem& dbiRN) const; public: // Если таким образом создан - можем писать в БД time_depth_list(db_results_manager& d,char*sp, int id,int n1,int n2, int iTDLSR=PM_ADD, unsigned quant = DEFAULT_QUANT,unsigned volume = START_VOLUME); // БД virtual int store() const; virtual int load(); void prepare_pack_load (dbHandle&dbhR,dbHandle&dbhT); void done_loading(); void pack_load(dbHandle&,dbHandle&); friend class time_depth_lists; }; typedef time_depth_list* p_time_depth_list; typedef ObjectsAr<p_time_depth_list> time_depth_lists_dynar; class time_depth_lists:public time_depth_lists_dynar{ public: p_time_depth_list get(int,int)const; }; class pl_vspogt_body:public pl_intern_body,public time_depth_list_local{ protected: pl_intern_borders paActiveBorders; DoubleAr daActualTimes; // Времена, на которых отражались ^ границы Logic interpolated(int) const; p_pl_fict_border get_fict_border(double)const; // Фиктивная граница по времени extend_data *ed; public: pl_vspogt_body(geophys_params&g); ~pl_vspogt_body(){paActiveBorders.clean();delete ed;}; void prepare_for_vspogt(const pl_intern_borders&,rays_to_receiver* prtr, const DoubleAr& daRT); void get_initial_fict_borders(pl_fict_borders &)const; // Пара фиктивных границ по номеру плохоинтерполированного Ж8() времени pl_fict_borders* get_fict_borders(int) const; // Некоторое количество фиктивных границ по узлу ib void add_n_borders(int iNNewPointsLeft,int ib,pl_fict_borders*, ray_parameters_dynar *)const; // Номер этогосамого узла int bad_interpolation(); void clear(); //Получение тройки фиктивных границ ниже отражающей (случай глубочайшего тела) pl_fict_borders*extend_initial(ray* prInitial,double dTLast,DoubleAr&daTimes, p_pl_intern_border); // Продолжение луча внутри тела (по данным, уже подготовленным ^^^) Logic extend(double dWhere,point& pRes); // Фиктивная граница по времени p_pl_fict_border get_fict_border(pl_fict_border&,point)const; p_pl_fict_border get_fict_horizontal_border(point)const; }; typedef pl_vspogt_body* p_pl_vspogt_body; typedef ObjectsAr<p_pl_vspogt_body> pl_vspogt_bodies; typedef ObjectsAr<IntAr*> aKindaBorders; class mixer:public aSegments2D{ protected: int *iaFlags; aKindaBorders akbCurrent; void clear_data(); // Определяет, лежит ли точка в созданном теле Logic point_in_body(const point2D& pWhat,int iB); // Определяет направление по телу void get_direction_body(const point2D& pWhat,int iB,double& A,double& B); // Пытается создать еще одно тело IntAr* new_body (const point2D& pWhat); // Засувает тело в список void add_body(IntAr*piaBody); inline int sign(const point2D&,segment2D&); int segment_other_body_line(int iB); public: mixer(){iaFlags=NULL;}; // По точке выдает направление смесителя в ней void get_mix_direction(const point2D& pWhere,double& A,double& B); // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
48  time_depth_list_local(unsigned quant = DEFAULT_QUANT,
49  unsigned volume = START_VOLUME);
50 
51  // По времени - линейная интерполяция параметров
52  void interpolate(double dTime,double& prop,double& diver,double& refrat,
53  point&pRefl,pl_spline& sReflect) const;
54  void interpolate(double dTime, double* vpol) const;
55  double start_time()const{return daTimes(ia(0));};
56  double finish_time()const{return daTimes(ia(_last_));};
57 
58 
59  // Время серёдки сегмента с передаваемым номером
60  double t_of_new_border(int) const;
61 
62  // Типа внесли начальные отражения итадалее
63  void prepared(){lPrepared=TRUE;};
64 
65  int n_of_segments() const; // Количество сегментов в списке
66 
67  // добавить время-точку-сплайн void add_new_node(double, const point3d &, p_pl_intern_spline,ray_to_receiver &,Logic); void add_new_node(double, const point3d &, p_pl_intern_spline,ray_to_receiver &,double); void merge(const time_depth_list_local&); // Прибавить к одному списку другой // По времени - номер отрезка int t2i(double)const; // Слияние двух тиспасписков без повторов void merge_unique(const time_depth_list_local&); // То же, но добавляет новые элементы исключительно по краям void merge_unique_monotone(const time_depth_list_local&); // Разного рода чистки void clear(); void pack(); // Различные отладочные фички void debug_output() const; friend class time_depth_lists; }; class time_depth_list: public db_container,public time_depth_list_local{ protected: dbHandle dbhReceivers; dbHandle dbhTD; static int iLast; int N1,N2; int iTDLStoreRegime; // Работа с БД int read_from_db (dbItem& dbiTD, dbItem& dbiRN); int write_to_db (dbItem& dbiTD, dbItem& dbiRN)const; void get_item (dbItem& dbiRes, dbItem& dbiRN) const; public: // Если таким образом создан - можем писать в БД time_depth_list(db_results_manager& d,char*sp, int id,int n1,int n2, int iTDLSR=PM_ADD, unsigned quant = DEFAULT_QUANT,unsigned volume = START_VOLUME); // БД virtual int store() const; virtual int load(); void prepare_pack_load (dbHandle&dbhR,dbHandle&dbhT); void done_loading(); void pack_load(dbHandle&,dbHandle&); friend class time_depth_lists; }; typedef time_depth_list* p_time_depth_list; typedef ObjectsAr<p_time_depth_list> time_depth_lists_dynar; class time_depth_lists:public time_depth_lists_dynar{ public: p_time_depth_list get(int,int)const; }; class pl_vspogt_body:public pl_intern_body,public time_depth_list_local{ protected: pl_intern_borders paActiveBorders; DoubleAr daActualTimes; // Времена, на которых отражались ^ границы Logic interpolated(int) const; p_pl_fict_border get_fict_border(double)const; // Фиктивная граница по времени extend_data *ed; public: pl_vspogt_body(geophys_params&g); ~pl_vspogt_body(){paActiveBorders.clean();delete ed;}; void prepare_for_vspogt(const pl_intern_borders&,rays_to_receiver* prtr, const DoubleAr& daRT); void get_initial_fict_borders(pl_fict_borders &)const; // Пара фиктивных границ по номеру плохоинтерполированного Ж8() времени pl_fict_borders* get_fict_borders(int) const; // Некоторое количество фиктивных границ по узлу ib void add_n_borders(int iNNewPointsLeft,int ib,pl_fict_borders*, ray_parameters_dynar *)const; // Номер этогосамого узла int bad_interpolation(); void clear(); //Получение тройки фиктивных границ ниже отражающей (случай глубочайшего тела) pl_fict_borders*extend_initial(ray* prInitial,double dTLast,DoubleAr&daTimes, p_pl_intern_border); // Продолжение луча внутри тела (по данным, уже подготовленным ^^^) Logic extend(double dWhere,point& pRes); // Фиктивная граница по времени p_pl_fict_border get_fict_border(pl_fict_border&,point)const; p_pl_fict_border get_fict_horizontal_border(point)const; }; typedef pl_vspogt_body* p_pl_vspogt_body; typedef ObjectsAr<p_pl_vspogt_body> pl_vspogt_bodies; typedef ObjectsAr<IntAr*> aKindaBorders; class mixer:public aSegments2D{ protected: int *iaFlags; aKindaBorders akbCurrent; void clear_data(); // Определяет, лежит ли точка в созданном теле Logic point_in_body(const point2D& pWhat,int iB); // Определяет направление по телу void get_direction_body(const point2D& pWhat,int iB,double& A,double& B); // Пытается создать еще одно тело IntAr* new_body (const point2D& pWhat); // Засувает тело в список void add_body(IntAr*piaBody); inline int sign(const point2D&,segment2D&); int segment_other_body_line(int iB); public: mixer(){iaFlags=NULL;}; // По точке выдает направление смесителя в ней void get_mix_direction(const point2D& pWhere,double& A,double& B); // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
68  void add_new_node(double, const point3d &,
70  void add_new_node(double, const point3d &,
72 
73  void merge(const time_depth_list_local&); // Прибавить к одному списку другой // По времени - номер отрезка int t2i(double)const; // Слияние двух тиспасписков без повторов void merge_unique(const time_depth_list_local&); // То же, но добавляет новые элементы исключительно по краям void merge_unique_monotone(const time_depth_list_local&); // Разного рода чистки void clear(); void pack(); // Различные отладочные фички void debug_output() const; friend class time_depth_lists; }; class time_depth_list: public db_container,public time_depth_list_local{ protected: dbHandle dbhReceivers; dbHandle dbhTD; static int iLast; int N1,N2; int iTDLStoreRegime; // Работа с БД int read_from_db (dbItem& dbiTD, dbItem& dbiRN); int write_to_db (dbItem& dbiTD, dbItem& dbiRN)const; void get_item (dbItem& dbiRes, dbItem& dbiRN) const; public: // Если таким образом создан - можем писать в БД time_depth_list(db_results_manager& d,char*sp, int id,int n1,int n2, int iTDLSR=PM_ADD, unsigned quant = DEFAULT_QUANT,unsigned volume = START_VOLUME); // БД virtual int store() const; virtual int load(); void prepare_pack_load (dbHandle&dbhR,dbHandle&dbhT); void done_loading(); void pack_load(dbHandle&,dbHandle&); friend class time_depth_lists; }; typedef time_depth_list* p_time_depth_list; typedef ObjectsAr<p_time_depth_list> time_depth_lists_dynar; class time_depth_lists:public time_depth_lists_dynar{ public: p_time_depth_list get(int,int)const; }; class pl_vspogt_body:public pl_intern_body,public time_depth_list_local{ protected: pl_intern_borders paActiveBorders; DoubleAr daActualTimes; // Времена, на которых отражались ^ границы Logic interpolated(int) const; p_pl_fict_border get_fict_border(double)const; // Фиктивная граница по времени extend_data *ed; public: pl_vspogt_body(geophys_params&g); ~pl_vspogt_body(){paActiveBorders.clean();delete ed;}; void prepare_for_vspogt(const pl_intern_borders&,rays_to_receiver* prtr, const DoubleAr& daRT); void get_initial_fict_borders(pl_fict_borders &)const; // Пара фиктивных границ по номеру плохоинтерполированного Ж8() времени pl_fict_borders* get_fict_borders(int) const; // Некоторое количество фиктивных границ по узлу ib void add_n_borders(int iNNewPointsLeft,int ib,pl_fict_borders*, ray_parameters_dynar *)const; // Номер этогосамого узла int bad_interpolation(); void clear(); //Получение тройки фиктивных границ ниже отражающей (случай глубочайшего тела) pl_fict_borders*extend_initial(ray* prInitial,double dTLast,DoubleAr&daTimes, p_pl_intern_border); // Продолжение луча внутри тела (по данным, уже подготовленным ^^^) Logic extend(double dWhere,point& pRes); // Фиктивная граница по времени p_pl_fict_border get_fict_border(pl_fict_border&,point)const; p_pl_fict_border get_fict_horizontal_border(point)const; }; typedef pl_vspogt_body* p_pl_vspogt_body; typedef ObjectsAr<p_pl_vspogt_body> pl_vspogt_bodies; typedef ObjectsAr<IntAr*> aKindaBorders; class mixer:public aSegments2D{ protected: int *iaFlags; aKindaBorders akbCurrent; void clear_data(); // Определяет, лежит ли точка в созданном теле Logic point_in_body(const point2D& pWhat,int iB); // Определяет направление по телу void get_direction_body(const point2D& pWhat,int iB,double& A,double& B); // Пытается создать еще одно тело IntAr* new_body (const point2D& pWhat); // Засувает тело в список void add_body(IntAr*piaBody); inline int sign(const point2D&,segment2D&); int segment_other_body_line(int iB); public: mixer(){iaFlags=NULL;}; // По точке выдает направление смесителя в ней void get_mix_direction(const point2D& pWhere,double& A,double& B); // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
74 
75  // По времени - номер отрезка int t2i(double)const; // Слияние двух тиспасписков без повторов void merge_unique(const time_depth_list_local&); // То же, но добавляет новые элементы исключительно по краям void merge_unique_monotone(const time_depth_list_local&); // Разного рода чистки void clear(); void pack(); // Различные отладочные фички void debug_output() const; friend class time_depth_lists; }; class time_depth_list: public db_container,public time_depth_list_local{ protected: dbHandle dbhReceivers; dbHandle dbhTD; static int iLast; int N1,N2; int iTDLStoreRegime; // Работа с БД int read_from_db (dbItem& dbiTD, dbItem& dbiRN); int write_to_db (dbItem& dbiTD, dbItem& dbiRN)const; void get_item (dbItem& dbiRes, dbItem& dbiRN) const; public: // Если таким образом создан - можем писать в БД time_depth_list(db_results_manager& d,char*sp, int id,int n1,int n2, int iTDLSR=PM_ADD, unsigned quant = DEFAULT_QUANT,unsigned volume = START_VOLUME); // БД virtual int store() const; virtual int load(); void prepare_pack_load (dbHandle&dbhR,dbHandle&dbhT); void done_loading(); void pack_load(dbHandle&,dbHandle&); friend class time_depth_lists; }; typedef time_depth_list* p_time_depth_list; typedef ObjectsAr<p_time_depth_list> time_depth_lists_dynar; class time_depth_lists:public time_depth_lists_dynar{ public: p_time_depth_list get(int,int)const; }; class pl_vspogt_body:public pl_intern_body,public time_depth_list_local{ protected: pl_intern_borders paActiveBorders; DoubleAr daActualTimes; // Времена, на которых отражались ^ границы Logic interpolated(int) const; p_pl_fict_border get_fict_border(double)const; // Фиктивная граница по времени extend_data *ed; public: pl_vspogt_body(geophys_params&g); ~pl_vspogt_body(){paActiveBorders.clean();delete ed;}; void prepare_for_vspogt(const pl_intern_borders&,rays_to_receiver* prtr, const DoubleAr& daRT); void get_initial_fict_borders(pl_fict_borders &)const; // Пара фиктивных границ по номеру плохоинтерполированного Ж8() времени pl_fict_borders* get_fict_borders(int) const; // Некоторое количество фиктивных границ по узлу ib void add_n_borders(int iNNewPointsLeft,int ib,pl_fict_borders*, ray_parameters_dynar *)const; // Номер этогосамого узла int bad_interpolation(); void clear(); //Получение тройки фиктивных границ ниже отражающей (случай глубочайшего тела) pl_fict_borders*extend_initial(ray* prInitial,double dTLast,DoubleAr&daTimes, p_pl_intern_border); // Продолжение луча внутри тела (по данным, уже подготовленным ^^^) Logic extend(double dWhere,point& pRes); // Фиктивная граница по времени p_pl_fict_border get_fict_border(pl_fict_border&,point)const; p_pl_fict_border get_fict_horizontal_border(point)const; }; typedef pl_vspogt_body* p_pl_vspogt_body; typedef ObjectsAr<p_pl_vspogt_body> pl_vspogt_bodies; typedef ObjectsAr<IntAr*> aKindaBorders; class mixer:public aSegments2D{ protected: int *iaFlags; aKindaBorders akbCurrent; void clear_data(); // Определяет, лежит ли точка в созданном теле Logic point_in_body(const point2D& pWhat,int iB); // Определяет направление по телу void get_direction_body(const point2D& pWhat,int iB,double& A,double& B); // Пытается создать еще одно тело IntAr* new_body (const point2D& pWhat); // Засувает тело в список void add_body(IntAr*piaBody); inline int sign(const point2D&,segment2D&); int segment_other_body_line(int iB); public: mixer(){iaFlags=NULL;}; // По точке выдает направление смесителя в ней void get_mix_direction(const point2D& pWhere,double& A,double& B); // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
76  int t2i(double)const;
77 
78  // Слияние двух тиспасписков без повторов
79  void merge_unique(const time_depth_list_local&);
80 
81  // То же, но добавляет новые элементы исключительно по краям void merge_unique_monotone(const time_depth_list_local&); // Разного рода чистки void clear(); void pack(); // Различные отладочные фички void debug_output() const; friend class time_depth_lists; }; class time_depth_list: public db_container,public time_depth_list_local{ protected: dbHandle dbhReceivers; dbHandle dbhTD; static int iLast; int N1,N2; int iTDLStoreRegime; // Работа с БД int read_from_db (dbItem& dbiTD, dbItem& dbiRN); int write_to_db (dbItem& dbiTD, dbItem& dbiRN)const; void get_item (dbItem& dbiRes, dbItem& dbiRN) const; public: // Если таким образом создан - можем писать в БД time_depth_list(db_results_manager& d,char*sp, int id,int n1,int n2, int iTDLSR=PM_ADD, unsigned quant = DEFAULT_QUANT,unsigned volume = START_VOLUME); // БД virtual int store() const; virtual int load(); void prepare_pack_load (dbHandle&dbhR,dbHandle&dbhT); void done_loading(); void pack_load(dbHandle&,dbHandle&); friend class time_depth_lists; }; typedef time_depth_list* p_time_depth_list; typedef ObjectsAr<p_time_depth_list> time_depth_lists_dynar; class time_depth_lists:public time_depth_lists_dynar{ public: p_time_depth_list get(int,int)const; }; class pl_vspogt_body:public pl_intern_body,public time_depth_list_local{ protected: pl_intern_borders paActiveBorders; DoubleAr daActualTimes; // Времена, на которых отражались ^ границы Logic interpolated(int) const; p_pl_fict_border get_fict_border(double)const; // Фиктивная граница по времени extend_data *ed; public: pl_vspogt_body(geophys_params&g); ~pl_vspogt_body(){paActiveBorders.clean();delete ed;}; void prepare_for_vspogt(const pl_intern_borders&,rays_to_receiver* prtr, const DoubleAr& daRT); void get_initial_fict_borders(pl_fict_borders &)const; // Пара фиктивных границ по номеру плохоинтерполированного Ж8() времени pl_fict_borders* get_fict_borders(int) const; // Некоторое количество фиктивных границ по узлу ib void add_n_borders(int iNNewPointsLeft,int ib,pl_fict_borders*, ray_parameters_dynar *)const; // Номер этогосамого узла int bad_interpolation(); void clear(); //Получение тройки фиктивных границ ниже отражающей (случай глубочайшего тела) pl_fict_borders*extend_initial(ray* prInitial,double dTLast,DoubleAr&daTimes, p_pl_intern_border); // Продолжение луча внутри тела (по данным, уже подготовленным ^^^) Logic extend(double dWhere,point& pRes); // Фиктивная граница по времени p_pl_fict_border get_fict_border(pl_fict_border&,point)const; p_pl_fict_border get_fict_horizontal_border(point)const; }; typedef pl_vspogt_body* p_pl_vspogt_body; typedef ObjectsAr<p_pl_vspogt_body> pl_vspogt_bodies; typedef ObjectsAr<IntAr*> aKindaBorders; class mixer:public aSegments2D{ protected: int *iaFlags; aKindaBorders akbCurrent; void clear_data(); // Определяет, лежит ли точка в созданном теле Logic point_in_body(const point2D& pWhat,int iB); // Определяет направление по телу void get_direction_body(const point2D& pWhat,int iB,double& A,double& B); // Пытается создать еще одно тело IntAr* new_body (const point2D& pWhat); // Засувает тело в список void add_body(IntAr*piaBody); inline int sign(const point2D&,segment2D&); int segment_other_body_line(int iB); public: mixer(){iaFlags=NULL;}; // По точке выдает направление смесителя в ней void get_mix_direction(const point2D& pWhere,double& A,double& B); // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
82  void merge_unique_monotone(const time_depth_list_local&);
83 
84  // Разного рода чистки
85  void clear();
86  void pack();
87 
88  // Различные отладочные фички
89  void debug_output() const;
90 
91  friend class time_depth_lists;
92 };
93 
95 protected:
96  dbHandle dbhReceivers;
97  dbHandle dbhTD;
98  static int iLast;
99  int N1,N2;
100  int iTDLStoreRegime;
101 
102  // Работа с БД int read_from_db (dbItem& dbiTD, dbItem& dbiRN); int write_to_db (dbItem& dbiTD, dbItem& dbiRN)const; void get_item (dbItem& dbiRes, dbItem& dbiRN) const; public: // Если таким образом создан - можем писать в БД time_depth_list(db_results_manager& d,char*sp, int id,int n1,int n2, int iTDLSR=PM_ADD, unsigned quant = DEFAULT_QUANT,unsigned volume = START_VOLUME); // БД virtual int store() const; virtual int load(); void prepare_pack_load (dbHandle&dbhR,dbHandle&dbhT); void done_loading(); void pack_load(dbHandle&,dbHandle&); friend class time_depth_lists; }; typedef time_depth_list* p_time_depth_list; typedef ObjectsAr<p_time_depth_list> time_depth_lists_dynar; class time_depth_lists:public time_depth_lists_dynar{ public: p_time_depth_list get(int,int)const; }; class pl_vspogt_body:public pl_intern_body,public time_depth_list_local{ protected: pl_intern_borders paActiveBorders; DoubleAr daActualTimes; // Времена, на которых отражались ^ границы Logic interpolated(int) const; p_pl_fict_border get_fict_border(double)const; // Фиктивная граница по времени extend_data *ed; public: pl_vspogt_body(geophys_params&g); ~pl_vspogt_body(){paActiveBorders.clean();delete ed;}; void prepare_for_vspogt(const pl_intern_borders&,rays_to_receiver* prtr, const DoubleAr& daRT); void get_initial_fict_borders(pl_fict_borders &)const; // Пара фиктивных границ по номеру плохоинтерполированного Ж8() времени pl_fict_borders* get_fict_borders(int) const; // Некоторое количество фиктивных границ по узлу ib void add_n_borders(int iNNewPointsLeft,int ib,pl_fict_borders*, ray_parameters_dynar *)const; // Номер этогосамого узла int bad_interpolation(); void clear(); //Получение тройки фиктивных границ ниже отражающей (случай глубочайшего тела) pl_fict_borders*extend_initial(ray* prInitial,double dTLast,DoubleAr&daTimes, p_pl_intern_border); // Продолжение луча внутри тела (по данным, уже подготовленным ^^^) Logic extend(double dWhere,point& pRes); // Фиктивная граница по времени p_pl_fict_border get_fict_border(pl_fict_border&,point)const; p_pl_fict_border get_fict_horizontal_border(point)const; }; typedef pl_vspogt_body* p_pl_vspogt_body; typedef ObjectsAr<p_pl_vspogt_body> pl_vspogt_bodies; typedef ObjectsAr<IntAr*> aKindaBorders; class mixer:public aSegments2D{ protected: int *iaFlags; aKindaBorders akbCurrent; void clear_data(); // Определяет, лежит ли точка в созданном теле Logic point_in_body(const point2D& pWhat,int iB); // Определяет направление по телу void get_direction_body(const point2D& pWhat,int iB,double& A,double& B); // Пытается создать еще одно тело IntAr* new_body (const point2D& pWhat); // Засувает тело в список void add_body(IntAr*piaBody); inline int sign(const point2D&,segment2D&); int segment_other_body_line(int iB); public: mixer(){iaFlags=NULL;}; // По точке выдает направление смесителя в ней void get_mix_direction(const point2D& pWhere,double& A,double& B); // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
103  int read_from_db (dbItem& dbiTD, dbItem& dbiRN);
104  int write_to_db (dbItem& dbiTD, dbItem& dbiRN)const;
105  void get_item (dbItem& dbiRes, dbItem& dbiRN) const;
106 public:
107  // Если таким образом создан - можем писать в БД
108  time_depth_list(db_results_manager& d,char*sp, int id,int n1,int n2,
109  int iTDLSR=PM_ADD,
110  unsigned quant = DEFAULT_QUANT,unsigned volume = START_VOLUME);
111  // БД
112  virtual int store() const;
113  virtual int load();
114  void prepare_pack_load (dbHandle&dbhR,dbHandle&dbhT);
115  void done_loading();
116  void pack_load(dbHandle&,dbHandle&);
117 
118  friend class time_depth_lists;
119 };
120 
123 
125 public:
126  p_time_depth_list get(int,int)const;
127 };
128 
130 protected:
131  pl_intern_borders paActiveBorders;
132  DoubleAr daActualTimes; // Времена, на которых отражались ^ границы Logic interpolated(int) const; p_pl_fict_border get_fict_border(double)const; // Фиктивная граница по времени extend_data *ed; public: pl_vspogt_body(geophys_params&g); ~pl_vspogt_body(){paActiveBorders.clean();delete ed;}; void prepare_for_vspogt(const pl_intern_borders&,rays_to_receiver* prtr, const DoubleAr& daRT); void get_initial_fict_borders(pl_fict_borders &)const; // Пара фиктивных границ по номеру плохоинтерполированного Ж8() времени pl_fict_borders* get_fict_borders(int) const; // Некоторое количество фиктивных границ по узлу ib void add_n_borders(int iNNewPointsLeft,int ib,pl_fict_borders*, ray_parameters_dynar *)const; // Номер этогосамого узла int bad_interpolation(); void clear(); //Получение тройки фиктивных границ ниже отражающей (случай глубочайшего тела) pl_fict_borders*extend_initial(ray* prInitial,double dTLast,DoubleAr&daTimes, p_pl_intern_border); // Продолжение луча внутри тела (по данным, уже подготовленным ^^^) Logic extend(double dWhere,point& pRes); // Фиктивная граница по времени p_pl_fict_border get_fict_border(pl_fict_border&,point)const; p_pl_fict_border get_fict_horizontal_border(point)const; }; typedef pl_vspogt_body* p_pl_vspogt_body; typedef ObjectsAr<p_pl_vspogt_body> pl_vspogt_bodies; typedef ObjectsAr<IntAr*> aKindaBorders; class mixer:public aSegments2D{ protected: int *iaFlags; aKindaBorders akbCurrent; void clear_data(); // Определяет, лежит ли точка в созданном теле Logic point_in_body(const point2D& pWhat,int iB); // Определяет направление по телу void get_direction_body(const point2D& pWhat,int iB,double& A,double& B); // Пытается создать еще одно тело IntAr* new_body (const point2D& pWhat); // Засувает тело в список void add_body(IntAr*piaBody); inline int sign(const point2D&,segment2D&); int segment_other_body_line(int iB); public: mixer(){iaFlags=NULL;}; // По точке выдает направление смесителя в ней void get_mix_direction(const point2D& pWhere,double& A,double& B); // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
133 
134  Logic interpolated(int) const;
135  p_pl_fict_border get_fict_border(double)const; // Фиктивная граница по времени extend_data *ed; public: pl_vspogt_body(geophys_params&g); ~pl_vspogt_body(){paActiveBorders.clean();delete ed;}; void prepare_for_vspogt(const pl_intern_borders&,rays_to_receiver* prtr, const DoubleAr& daRT); void get_initial_fict_borders(pl_fict_borders &)const; // Пара фиктивных границ по номеру плохоинтерполированного Ж8() времени pl_fict_borders* get_fict_borders(int) const; // Некоторое количество фиктивных границ по узлу ib void add_n_borders(int iNNewPointsLeft,int ib,pl_fict_borders*, ray_parameters_dynar *)const; // Номер этогосамого узла int bad_interpolation(); void clear(); //Получение тройки фиктивных границ ниже отражающей (случай глубочайшего тела) pl_fict_borders*extend_initial(ray* prInitial,double dTLast,DoubleAr&daTimes, p_pl_intern_border); // Продолжение луча внутри тела (по данным, уже подготовленным ^^^) Logic extend(double dWhere,point& pRes); // Фиктивная граница по времени p_pl_fict_border get_fict_border(pl_fict_border&,point)const; p_pl_fict_border get_fict_horizontal_border(point)const; }; typedef pl_vspogt_body* p_pl_vspogt_body; typedef ObjectsAr<p_pl_vspogt_body> pl_vspogt_bodies; typedef ObjectsAr<IntAr*> aKindaBorders; class mixer:public aSegments2D{ protected: int *iaFlags; aKindaBorders akbCurrent; void clear_data(); // Определяет, лежит ли точка в созданном теле Logic point_in_body(const point2D& pWhat,int iB); // Определяет направление по телу void get_direction_body(const point2D& pWhat,int iB,double& A,double& B); // Пытается создать еще одно тело IntAr* new_body (const point2D& pWhat); // Засувает тело в список void add_body(IntAr*piaBody); inline int sign(const point2D&,segment2D&); int segment_other_body_line(int iB); public: mixer(){iaFlags=NULL;}; // По точке выдает направление смесителя в ней void get_mix_direction(const point2D& pWhere,double& A,double& B); // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
136  extend_data *ed;
137 public:
139  ~pl_vspogt_body(){paActiveBorders.clean();delete ed;};
140 
141 
142  void prepare_for_vspogt(const pl_intern_borders&,rays_to_receiver* prtr,
143  const DoubleAr& daRT);
144  void get_initial_fict_borders(pl_fict_borders &)const;
145 
146  // Пара фиктивных границ по номеру плохоинтерполированного Ж8() времени pl_fict_borders* get_fict_borders(int) const; // Некоторое количество фиктивных границ по узлу ib void add_n_borders(int iNNewPointsLeft,int ib,pl_fict_borders*, ray_parameters_dynar *)const; // Номер этогосамого узла int bad_interpolation(); void clear(); //Получение тройки фиктивных границ ниже отражающей (случай глубочайшего тела) pl_fict_borders*extend_initial(ray* prInitial,double dTLast,DoubleAr&daTimes, p_pl_intern_border); // Продолжение луча внутри тела (по данным, уже подготовленным ^^^) Logic extend(double dWhere,point& pRes); // Фиктивная граница по времени p_pl_fict_border get_fict_border(pl_fict_border&,point)const; p_pl_fict_border get_fict_horizontal_border(point)const; }; typedef pl_vspogt_body* p_pl_vspogt_body; typedef ObjectsAr<p_pl_vspogt_body> pl_vspogt_bodies; typedef ObjectsAr<IntAr*> aKindaBorders; class mixer:public aSegments2D{ protected: int *iaFlags; aKindaBorders akbCurrent; void clear_data(); // Определяет, лежит ли точка в созданном теле Logic point_in_body(const point2D& pWhat,int iB); // Определяет направление по телу void get_direction_body(const point2D& pWhat,int iB,double& A,double& B); // Пытается создать еще одно тело IntAr* new_body (const point2D& pWhat); // Засувает тело в список void add_body(IntAr*piaBody); inline int sign(const point2D&,segment2D&); int segment_other_body_line(int iB); public: mixer(){iaFlags=NULL;}; // По точке выдает направление смесителя в ней void get_mix_direction(const point2D& pWhere,double& A,double& B); // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
147  pl_fict_borders* get_fict_borders(int) const;
148  // Некоторое количество фиктивных границ по узлу ib
149  void add_n_borders(int iNNewPointsLeft,int ib,pl_fict_borders*,
150  ray_parameters_dynar *)const;
151 
152  // Номер этогосамого узла int bad_interpolation(); void clear(); //Получение тройки фиктивных границ ниже отражающей (случай глубочайшего тела) pl_fict_borders*extend_initial(ray* prInitial,double dTLast,DoubleAr&daTimes, p_pl_intern_border); // Продолжение луча внутри тела (по данным, уже подготовленным ^^^) Logic extend(double dWhere,point& pRes); // Фиктивная граница по времени p_pl_fict_border get_fict_border(pl_fict_border&,point)const; p_pl_fict_border get_fict_horizontal_border(point)const; }; typedef pl_vspogt_body* p_pl_vspogt_body; typedef ObjectsAr<p_pl_vspogt_body> pl_vspogt_bodies; typedef ObjectsAr<IntAr*> aKindaBorders; class mixer:public aSegments2D{ protected: int *iaFlags; aKindaBorders akbCurrent; void clear_data(); // Определяет, лежит ли точка в созданном теле Logic point_in_body(const point2D& pWhat,int iB); // Определяет направление по телу void get_direction_body(const point2D& pWhat,int iB,double& A,double& B); // Пытается создать еще одно тело IntAr* new_body (const point2D& pWhat); // Засувает тело в список void add_body(IntAr*piaBody); inline int sign(const point2D&,segment2D&); int segment_other_body_line(int iB); public: mixer(){iaFlags=NULL;}; // По точке выдает направление смесителя в ней void get_mix_direction(const point2D& pWhere,double& A,double& B); // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
153  int bad_interpolation();
154 
155  void clear();
156 
157  //Получение тройки фиктивных границ ниже отражающей (случай глубочайшего тела)
158  pl_fict_borders*extend_initial(ray* prInitial,double dTLast,DoubleAr&daTimes,
160 
161  // Продолжение луча внутри тела (по данным, уже подготовленным ^^^)
162  Logic extend(double dWhere,point& pRes);
163 
164  // Фиктивная граница по времени p_pl_fict_border get_fict_border(pl_fict_border&,point)const; p_pl_fict_border get_fict_horizontal_border(point)const; }; typedef pl_vspogt_body* p_pl_vspogt_body; typedef ObjectsAr<p_pl_vspogt_body> pl_vspogt_bodies; typedef ObjectsAr<IntAr*> aKindaBorders; class mixer:public aSegments2D{ protected: int *iaFlags; aKindaBorders akbCurrent; void clear_data(); // Определяет, лежит ли точка в созданном теле Logic point_in_body(const point2D& pWhat,int iB); // Определяет направление по телу void get_direction_body(const point2D& pWhat,int iB,double& A,double& B); // Пытается создать еще одно тело IntAr* new_body (const point2D& pWhat); // Засувает тело в список void add_body(IntAr*piaBody); inline int sign(const point2D&,segment2D&); int segment_other_body_line(int iB); public: mixer(){iaFlags=NULL;}; // По точке выдает направление смесителя в ней void get_mix_direction(const point2D& pWhere,double& A,double& B); // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
165  p_pl_fict_border get_fict_border(pl_fict_border&,point)const;
166 
167  p_pl_fict_border get_fict_horizontal_border(point)const;
168 
169 };
170 
173 
175 class mixer:public aSegments2D{
176 protected:
177  int *iaFlags;
178  aKindaBorders akbCurrent;
179 
180  void clear_data();
181 
182  // Определяет, лежит ли точка в созданном теле Logic point_in_body(const point2D& pWhat,int iB); // Определяет направление по телу void get_direction_body(const point2D& pWhat,int iB,double& A,double& B); // Пытается создать еще одно тело IntAr* new_body (const point2D& pWhat); // Засувает тело в список void add_body(IntAr*piaBody); inline int sign(const point2D&,segment2D&); int segment_other_body_line(int iB); public: mixer(){iaFlags=NULL;}; // По точке выдает направление смесителя в ней void get_mix_direction(const point2D& pWhere,double& A,double& B); // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
183  Logic point_in_body(const point2D& pWhat,int iB);
184 
185  // Определяет направление по телу void get_direction_body(const point2D& pWhat,int iB,double& A,double& B); // Пытается создать еще одно тело IntAr* new_body (const point2D& pWhat); // Засувает тело в список void add_body(IntAr*piaBody); inline int sign(const point2D&,segment2D&); int segment_other_body_line(int iB); public: mixer(){iaFlags=NULL;}; // По точке выдает направление смесителя в ней void get_mix_direction(const point2D& pWhere,double& A,double& B); // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
186  void get_direction_body(const point2D& pWhat,int iB,double& A,double& B);
187 
188  // Пытается создать еще одно тело IntAr* new_body (const point2D& pWhat); // Засувает тело в список void add_body(IntAr*piaBody); inline int sign(const point2D&,segment2D&); int segment_other_body_line(int iB); public: mixer(){iaFlags=NULL;}; // По точке выдает направление смесителя в ней void get_mix_direction(const point2D& pWhere,double& A,double& B); // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
189  IntAr* new_body (const point2D& pWhat);
190 
191  // Засувает тело в список
192  void add_body(IntAr*piaBody);
193 
194  inline int sign(const point2D&,segment2D&);
195  int segment_other_body_line(int iB);
196 public:
197  mixer(){iaFlags=NULL;};
198  // По точке выдает направление смесителя в ней void get_mix_direction(const point2D& pWhere,double& A,double& B); // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
199  void get_mix_direction(const point2D& pWhere,double& A,double& B);
200 
201  // Переписываем вставку - удаление virtual void addh(const segment2D & val); virtual void addl(const segment2D& val); virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);}; virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);}; // remove пока что не знаю, как переделать, да и надо ли }; inline int mixer::sign (const point2D&p,segment2D&s){ double dEps=0.0001; double A,B,C; s.get_coefs(A,B,C); double S=(A*p.X()+B*p.Y()+C); if(S>dEps) return 1; else if(S<-dEps) return -1; else return 0; }; class fict_bord_hit_info:public hit_point_info{ protected: rays_shoot * pr; int iBody1; int iBody2; const pl_fict_border &fbReflect; point pRes; double dTime; double dAcc; public: virtual ray* shoot(ray_parameters&,point&,Logic&,double); virtual ray* shoot(double,double,point&,Logic&,double); virtual Logic good_enough(double,ray*); fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double, double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D, int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D, double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D); point3d stopped_at()const; double time()const; }; #endif /* p_vspogt_elements.H */ /* Melnikov George Yu. 19-Mar-1999 */ /* Melnikov George Yu. 23-Mar-1999 */ /* Melnikov George Yu. 24-Mar-1999 */ /* ... */ /* Melnikov George Yu. 1-Feb-2000 */
202  virtual void addh(const segment2D & val);
203  virtual void addl(const segment2D& val);
204 
205  virtual void addh(const aSegments2D& pArray){Throw(ERROR__N_A);};
206  virtual void addl(const aSegments2D& pArray){Throw(ERROR__N_A);};
207 
208  virtual void insert (unsigned i, const aSegments2D& val){Throw(ERROR__N_A);};
209  // remove пока что не знаю, как переделать, да и надо ли
210 };
211 inline int mixer::sign (const point2D&p,segment2D&s){
212  double dEps=0.0001;
213  double A,B,C;
214  s.get_coefs(A,B,C);
215  double S=(A*p.X()+B*p.Y()+C);
216  if(S>dEps)
217  return 1;
218  else if(S<-dEps)
219  return -1;
220  else
221  return 0;
222 };
223 
225 protected:
226  rays_shoot * pr;
227  int iBody1;
228  int iBody2;
229  const pl_fict_border &fbReflect;
230  point pRes;
231  double dTime;
232  double dAcc;
233 public:
234  virtual ray* shoot(ray_parameters&,point&,Logic&,double);
235  virtual ray* shoot(double,double,point&,Logic&,double);
236  virtual Logic good_enough(double,ray*);
237  fict_bord_hit_info(rays_shoot*,int,int,const pl_fict_border &,double,
238  double dl=PM_ALPHA_LESS_D,double dm=PM_ALPHA_MORE_D,
239  int i1=MN_CHINA_D,double d1=MN_PHI_D,int i2=MILNUM2_D,
240  double d2=PM_ALPHA_STOP_D,int i3=PM_MAX_ITERATIONS_COUNT_D);
241  point3d stopped_at()const;
242  double time()const;
243 };
244 
245 #endif /* p_vspogt_elements.H */
246 /* Melnikov George Yu. 19-Mar-1999 */
247 /* Melnikov George Yu. 23-Mar-1999 */
248 /* Melnikov George Yu. 24-Mar-1999 */
249 /* ... */
250 /* Melnikov George Yu. 1-Feb-2000 */
Definition: geometry.H:58
Definition: p_elements.H:86
Definition: any_elements.H:22
Definition: p_vspogt_elements.H:175
Definition: p_vspogt_elements.H:224
Definition: db_managers.H:75
Definition: db_container.H:59
Definition: p_elements.H:23
Definition: IntAr.H:14
Definition: rays.H:61
Definition: p_elements.H:145
Definition: p_elements.H:168
Definition: geometry.H:16
Definition: p_vspogt_elements.H:13
Definition: IndexAr.H:9
Definition: rays.H:81
Definition: p_vspogt_elements.H:19
Definition: p_vspogt_elements.H:129
Definition: DoubleAr.H:14
Definition: p_raytr_hits.H:66
Definition: p_elements.H:134
Definition: rays.H:170
Definition: p_vspogt_elements.H:124
Definition: rays.H:223
Definition: geometry.H:39
Definition: p_vspogt_elements.H:94
Definition: dbnamedefs.h:85
Definition: rays.H:132