#ifndef _AREA_HPP_ #define _AREA_HPP_ #include #include #include #include #include struct area_hover; struct point; struct area { area() { } virtual void on_hover(int64_t card_id,std::shared_ptr&c,double speed)=0; virtual void on_enter(int64_t card_id,std::shared_ptr&c,double speed)=0; virtual void on_leave(int64_t card_id,std::shared_ptr&c,double speed)=0; int id()const { return m_id; } std::atomic m_card_count; int m_id; double m_limit_speed; // std::string m_name; // int m_limit_time_second; // int m_limit_person_count; // int m_area_type; std::vector m_bound; }; struct area_list:single_base> { area_list(); std::vector> get_area(const point&pt); static void init_from_db() { } }; struct area_hover { std::shared_ptr m_area; time_t m_enter_time,m_last_time; point m_enter_point,m_last_point; int m_num_speeding; area_hover(std::shared_ptr&area,const point&pt,double speed) :m_area(area) { m_enter_time=m_last_time=time(0); m_enter_point=m_last_point=pt; m_num_speeding=0; if(speed>m_area->m_limit_speed) m_num_speeding++; } int id()const { return m_area->id(); } bool operator == (const area_hover&o)const { return m_area->id()==o.m_area->id(); } bool operator < (const area_hover&o)const { return m_area->id()id(); } }; //每张卡包含一个对象 //在解析出数据点时,调用on_point struct area_tool { std::vector> m_clist; void on_point(int card_id,const point&pt,double speed) { std::vector> areas=area_list::instance()->get_area(pt);//找出所有的区域 std::sort(areas.begin(),areas.end(),[](std::shared_ptrl,std::shared_ptrr){ return l->id()id(); }); auto c1=m_clist.begin(),ce=m_clist.end(); auto a1=areas.begin() ,ae=areas.end(); std::vector> nlist; while (c1!=ce && a1!=ae) { if ((*c1)->id()<(*a1)->id()) { do_leave_biz(card_id,*c1,speed); ++c1; } else if ((*a1)->id()<(*c1)->id()) { nlist.push_back(std::make_shared(*a1,pt,speed)); do_enter_biz(card_id,nlist.back(),speed); ++a1; } else { nlist.push_back(*c1); do_hover_biz(card_id,nlist.back(),speed); ++c1,++a1; } } while(c1!=ce) { do_leave_biz(card_id,*c1,speed); ++c1; } while(a1!=ae) { nlist.push_back(std::make_shared(*a1,pt,speed)); do_enter_biz(card_id,nlist.back(),speed); ++a1; } m_clist=std::move(nlist); } //检测是否超时 void on_timer(int64_t card_id) { } void do_hover_biz(int64_t card_id,std::shared_ptr&a,double speed) { a->m_area->on_hover(card_id,a,speed); } void do_enter_biz(int64_t card_id,std::shared_ptr a,double speed) { a->m_area->on_enter(card_id,a,speed); } void do_leave_biz(int64_t card_id,std::shared_ptr a,double speed) { a->m_area->on_leave(card_id,a,speed); } }; #endif