trafficLight.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. #ifndef __TRAFFIC_LIGHT_H__
  2. #define __TRAFFIC_LIGHT_H__
  3. #include <memory>
  4. #include <algorithm>
  5. #include <cstdlib>
  6. #include <sstream>
  7. #include <cfloat>
  8. #include <list>
  9. #include <atomic>
  10. #include <map>
  11. #include <array>
  12. #include <thread>
  13. #include <chrono>
  14. #include <iostream>
  15. #include <vector>
  16. #include <string.h>
  17. #include "traffic_info.h"
  18. #include "car.h"
  19. #include <string>
  20. #include "geo_hash.h"
  21. #include "structdef.h"
  22. #include "classdef.h"
  23. NAMESPACE_POINT_BEGIN(NAMESPACE_POINT)
  24. //#define MAX_SCOPE_BIGCAR 300//像素
  25. #define MID_CAR_LENGTH_GROUP 5//像素
  26. #define RUN_LIGHT_DIS 20//闯红灯与绿灯的距离
  27. //路口红绿灯
  28. //大巷红绿灯
  29. //路口规则
  30. //小车避让大车规则
  31. //代理模式
  32. //装饰器模式
  33. //抽象工厂模式
  34. //x->大 speed 正
  35. //x->恒
  36. // y->大 speed 正
  37. // y->小 speed 负
  38. //x->小 speed 负
  39. //这里的初始化红绿灯组vector初始化,因数据库配置和实际情况进行初始化,不能保证通用,需要在不同的情形下特殊处理
  40. //这里是根据区域划分红绿灯,然后根据红绿灯位置按照(上行或者下行)进行排序
  41. //这里初始化根据,每一条巷道为一组,遇到拐点,则是新的巷道。因为,拐点必有红绿灯。
  42. //需要考虑到T字口和十字口中有车辆过来,但非是指定区域即辅运大巷
  43. struct Manage
  44. {
  45. geo_list m_g;
  46. std::map<std::string,std::shared_ptr<card_interface>> m_map;
  47. std::shared_ptr<card_interface> operator [](std::string cardid)
  48. {
  49. return m_map[cardid];
  50. }
  51. const std::shared_ptr<card_interface> operator [](std::string cardid) const
  52. {
  53. auto iter = m_map.find(cardid);
  54. if(iter == m_map.end())
  55. return nullptr;
  56. else
  57. return iter->second;
  58. }
  59. };
  60. //初始化红绿灯组,根据区域进行划分
  61. struct InitData
  62. {
  63. void read_dat_group(const char * fname);
  64. void read_dat_light(const char * fname);
  65. std::map<int,std::shared_ptr<TrafficLightGroup>> m_Map;
  66. void showInfo()
  67. {
  68. std::cout << "-------xxxxxxxxxxxxxxxxxxx------------------------\n";
  69. for(const auto x : m_Map)
  70. std::cout << x.second->showinfo()<<std::endl;
  71. }
  72. };
  73. class DecoratorRule;
  74. class Rule
  75. {
  76. public:
  77. Rule()
  78. {}
  79. void setPtr(std::shared_ptr<DecoratorRule> p)
  80. {
  81. m_owner = p;
  82. }
  83. virtual std::vector<std::shared_ptr<TrafficLightGroup>> handleRule(std::shared_ptr<card_interface> c= 0) = 0;
  84. virtual std::shared_ptr<RunRedLight> check_run_red_light(std::shared_ptr<card_interface> c ,double dis){return nullptr;}
  85. virtual void put(std::shared_ptr<TrafficLightGroup> tlp) = 0;
  86. virtual void put(std::vector<std::shared_ptr<TrafficLightGroup>> && vec) = 0;
  87. virtual std::string showInfo() = 0;
  88. virtual std::vector<std::string> find_near(int x,int y,int dist,const std::string & card_no);
  89. std::string itostr(int gid)
  90. {
  91. char buf[10];
  92. sprintf(buf,"%d",gid);
  93. std::string str(buf);
  94. return std::move(str);
  95. }
  96. bool sortCar(const std::string &c1,const std::string &c2,std::shared_ptr<TrafficLightGroup> tlp_ptr)
  97. {
  98. auto card1 = getCard(c1);
  99. auto card2 = getCard(c2);
  100. double d1=DBL_MAX, d2 = DBL_MAX;
  101. if(card2 != nullptr)
  102. {
  103. d2 = tlp_ptr->dist(card2->getX(),card2->getY());
  104. }
  105. if(card1 != nullptr)
  106. {
  107. d1 = tlp_ptr->dist(card1->getX(),card1->getY());
  108. }
  109. return d1 < d2;
  110. }
  111. // 在红绿灯组数组m_pTrafficLight中找离位置点(x,y)最近的灯组m_specialFlag、m_line、m_directDist以及m_id(灯组ID)信息
  112. std::tuple<bool,line,double,int> findNearLightInfo(double x,double y,std::shared_ptr<TrafficLightGroup> tlg_ptr)
  113. {
  114. int lightId = 0;
  115. double max = DBL_MAX;
  116. bool special = false;
  117. line l;
  118. double distDirect = 0;
  119. for(const auto px : tlg_ptr->m_pTrafficLight)
  120. {
  121. double tmp = px->dist(x,y);
  122. if(max > tmp)
  123. {
  124. max = tmp;
  125. special = px->m_specialFlag?true:false;
  126. l = px->m_line;
  127. distDirect = px->m_directDist;
  128. lightId= px->m_id;
  129. }
  130. }
  131. return std::make_tuple(special,l,distDirect,lightId);
  132. }
  133. std::shared_ptr<card_interface> getCard(const std::string &card_no);
  134. virtual ~Rule() {}
  135. std::weak_ptr<DecoratorRule> m_owner;
  136. };
  137. class CrossingRule:public Rule
  138. {
  139. public:
  140. CrossingRule()
  141. {}
  142. virtual void setPtr(std::shared_ptr<DecoratorRule> p)
  143. {
  144. m_owner = p;
  145. }
  146. //谁先到达路口红绿灯指定的距离,which side turn green.then else turn red..
  147. virtual bool getBigCarFlag(const std::string &card_no);
  148. //here should another thread to handle it .
  149. bool handleManualControl(std::shared_ptr<TrafficLightGroup> pt);
  150. bool findNearLight(const std::string & card_no,std::shared_ptr<TrafficLightGroup> tlg_ptr,bool a = false);
  151. bool handleSpecialAvondance(std::shared_ptr<TrafficLightGroup> pt);
  152. bool handleCrossing(std::shared_ptr<TrafficLightGroup> pt) ;
  153. virtual std::vector<std::shared_ptr<TrafficLightGroup>> handleRule(std::shared_ptr<card_interface> c=nullptr);
  154. void changeCarState(std::string & card_no,std::shared_ptr<TrafficLightGroup> tlg_ptr);
  155. void put(std::shared_ptr<TrafficLightGroup> tlp)
  156. {
  157. m_CTrafficLightGroupMap.push_back(tlp);
  158. // std::cout << tlp->showinfo()<<std::endl;
  159. }
  160. void put(std::vector<std::shared_ptr<TrafficLightGroup>> && vec)
  161. {
  162. m_CTrafficLightGroupMap = vec;
  163. // std::cout << "+++++++++++\n";
  164. // for(const auto x : m_CTrafficLightGroupMap)
  165. // std::cout << x->showinfo()<<std::endl;
  166. }
  167. virtual std::string showInfo()
  168. {
  169. std::stringstream ss;
  170. ss<<"CrossingRule:{{";
  171. for(const auto px : m_CTrafficLightGroupMap)
  172. {
  173. ss<<"gId:"<<px->m_gId<<",X:"<<px->x<<"Y:"<<px->y;
  174. for(const auto py : px->m_pTrafficLight)
  175. ss<<"[lId:"<<py->m_id<<",x:"<<py->x<<",y:"<<py->y<<"],";
  176. ss<<"},{";
  177. }
  178. ss<<"}}";
  179. return std::move(ss.str());
  180. }
  181. public:
  182. std::vector<std::shared_ptr<TrafficLightGroup>> m_CTrafficLightGroupMap;
  183. };
  184. class AvoidanceRule:public Rule
  185. {
  186. public:
  187. AvoidanceRule()
  188. {}
  189. virtual std::vector<std::shared_ptr<TrafficLightGroup>> handleRule(std::shared_ptr<card_interface> c=nullptr);
  190. virtual std::shared_ptr<RunRedLight> check_run_red_light(std::shared_ptr<card_interface> c,double reddis);
  191. void add_one(std::shared_ptr<TrafficLightGroup> & pt,std::shared_ptr<card_interface> &c,std::vector<std::shared_ptr<TrafficLightGroup>> &vt,LIGHT_COLOUR lc,LIGHT_COLOUR lc_);
  192. void changeGroup(std::shared_ptr<TrafficLightGroup> &p,point pt,LIGHT_COLOUR lc,LIGHT_COLOUR lc_);
  193. void eraseTwoGroup(std::shared_ptr<card_interface> &c,std::vector<std::shared_ptr<TrafficLightGroup>> &vt);
  194. void eraseTrafficLightGroup(bool a,std::shared_ptr<card_interface> &c,std::vector<std::shared_ptr<TrafficLightGroup>> &vt);
  195. std::vector<std::shared_ptr<TrafficLightGroup>> findGroup(double x,double y,int areaid,double vv, std::shared_ptr<card_interface> c);
  196. bool getMidCar(std::shared_ptr<card_interface> bigcar,std::shared_ptr<TrafficLightGroup> & one,std::shared_ptr<TrafficLightGroup> & two);
  197. bool Diff(std::shared_ptr<TrafficLightGroup> &p,point pt,LIGHT_COLOUR lc,LIGHT_COLOUR lc_);
  198. //后续小车避让大车规则,只需要找到前方的两个红绿灯,找到两个对比一下之前的记录,如果灯组改变了,则修改,如果没变,则判断是否有小车,进行改变
  199. //如果只找到一个红绿灯,查看是否含有记录,如果有,则不坐任何处理。
  200. bool findTwoLightGroupMidCar(std::shared_ptr<TrafficLightGroup> one,std::shared_ptr<TrafficLightGroup>two,std::shared_ptr<card_interface> bigcar,std::shared_ptr<card_interface> car) ;
  201. void put(std::shared_ptr<TrafficLightGroup> tlp)
  202. {
  203. m_CTrafficLightGroupMap[tlp->m_areaId].push_back(tlp);
  204. // std::cout << tlp->showinfo()<<std::endl;
  205. }
  206. void put(std::vector<std::shared_ptr<TrafficLightGroup>> && vec)
  207. {
  208. for(const auto x : vec)
  209. {
  210. m_CTrafficLightGroupMap[x->m_areaId].push_back(x);
  211. // std::cout << "=+++++++++++=\n";
  212. // std::cout << x->showinfo()<<std::endl;
  213. }
  214. }
  215. void sort()
  216. {
  217. TRACE(_T("size: %d"),m_CTrafficLightGroupMap.size());
  218. for(auto & x:m_CTrafficLightGroupMap)
  219. {
  220. if(x.second.size()<=1)
  221. continue;
  222. line l(**x.second.begin(),**std::prev(x.second.end()));
  223. for(const auto & y :m_CTrafficLightGroupMap)
  224. {
  225. if(x.first == y.first)
  226. continue;
  227. for(const auto & t:y.second)
  228. {
  229. if(l.contain(*t,0.001))
  230. {
  231. if(t->m_areaId != x.first)
  232. x.second.push_back(t);
  233. }
  234. }
  235. }
  236. }
  237. for(auto &x : m_CTrafficLightGroupMap)
  238. {
  239. std::sort(x.second.begin(),x.second.end(),[](std::shared_ptr<TrafficLightGroup> one ,std::shared_ptr<TrafficLightGroup> two )->bool{return *one < *two;});
  240. x.second.erase(std::unique(x.second.begin(),x.second.end(),[](std::shared_ptr<TrafficLightGroup> one ,std::shared_ptr<TrafficLightGroup> two )->bool{return *one == *two;}),x.second.end());
  241. }
  242. // auto x = findGroup(4727,-100,6,-10);
  243. // for(auto c : x)
  244. // {
  245. // if(c!=nullptr)
  246. // std::cout << "4444444444444444444444444444444444------"<<c->m_gId<<" "<<c->x<<" "<<c->y<<std::endl;
  247. // }
  248. // x = findGroup(4627,-75,2,-10);
  249. // for(auto c : x)
  250. // {
  251. // if(c!=nullptr)
  252. // std::cout << "4444444444444444444444444444444444------"<<c->m_gId<<" "<<c->x<<" "<<c->y<<std::endl;
  253. // }
  254. #if 0
  255. //here should use reference........
  256. for(auto &x : m_CTrafficLightGroupMap)
  257. std::sort(x.second.begin(),x.second.end(),[](std::shared_ptr<TrafficLightGroup> one ,std::shared_ptr<TrafficLightGroup> two )->bool{return *one < *two;});
  258. std::map<int,std::tuple<double,double,double>> vtm;
  259. for(auto &x : m_CTrafficLightGroupMap)
  260. {
  261. if(x.second.size()<=1)
  262. continue;
  263. //line l(**x.second.begin(),**x.second.end());
  264. auto abc = (*x.second.begin())->get_abc(**std::prev(x.second.end()));
  265. for(const auto y : vtm)
  266. {
  267. if(std::get<0>(abc)==std::get<0>(y.second)&&std::get<1>(abc)==std::get<1>(y.second)&&std::get<2>(abc)==std::get<2>(y.second))
  268. {
  269. //should initialization with size when Using std::merge
  270. std::vector<std::shared_ptr<TrafficLightGroup>> vt(m_CTrafficLightGroupMap[y.first].size()+x.second.size());
  271. for(const auto c:m_CTrafficLightGroupMap[y.first])
  272. std::cout << c->x<<"---===0---="<<c->y<<std::endl;
  273. for(const auto c:x.second)
  274. std::cout << c->x<<"---===0---="<<c->y<<std::endl;
  275. std::merge(m_CTrafficLightGroupMap[y.first].begin(),m_CTrafficLightGroupMap[y.first].end(),x.second.begin(),x.second.end(),std::begin(vt),[](std::shared_ptr<TrafficLightGroup> one ,std::shared_ptr<TrafficLightGroup> two )->bool{return *one < *two;});
  276. x.second = vt;
  277. m_CTrafficLightGroupMap[y.first] = vt;
  278. }
  279. }
  280. vtm.insert({x.first,abc});
  281. }
  282. #endif
  283. }
  284. virtual std::string showInfo()
  285. {
  286. //should sort first..
  287. //sort();
  288. std::stringstream ss;
  289. ss<<"AvoidanceRule:{{{";
  290. for(const auto p : m_CTrafficLightGroupMap)
  291. {
  292. for(const auto px : p.second)
  293. {
  294. ss<<"AreaId:{"<<p.first<<"}gId:"<<px->m_gId<<",AreaId:"<<px->m_areaId<<",X:"<<px->x<<"Y:"<<px->y;
  295. for(const auto py : px->m_pTrafficLight)
  296. ss<<"[lId:"<<py->m_id<<",x:"<<py->x<<",y:"<<py->y<<"],";
  297. ss<<"},{" ;
  298. }
  299. ss<<"},#------------------#{";
  300. }
  301. ss<<"}}";
  302. return std::move(ss.str());
  303. }
  304. public:
  305. std::map<int,std::vector<std::shared_ptr<TrafficLightGroup>>> m_CTrafficLightGroupMap;
  306. };
  307. class CarManager;
  308. class DecoratorRule:public std::enable_shared_from_this<DecoratorRule>
  309. {
  310. public:
  311. DecoratorRule(CarManager* m)
  312. :m_(m)
  313. {
  314. }
  315. std::string showInfo()
  316. {
  317. return m_rule->showInfo();
  318. }
  319. void put(std::shared_ptr<TrafficLightGroup> tlp)
  320. {
  321. m_rule->put(tlp);
  322. }
  323. void put(std::vector<std::shared_ptr<TrafficLightGroup>> && vec)
  324. {
  325. m_rule->put(std::move(vec));
  326. }
  327. virtual void handleRule(std::shared_ptr<card_interface> c = nullptr){}
  328. virtual std::shared_ptr<RunRedLight> check_run_red_light(std::shared_ptr<card_interface> c ,double dis){return nullptr;}
  329. virtual std::shared_ptr<DecoratorRule> getPtr() = 0;
  330. virtual void CreateRule() = 0;
  331. std::vector<std::string> find_near(double x,double y,double dist,std::string cardid);
  332. std::shared_ptr<card_interface> getCard(const std::string &card_no);
  333. virtual ~DecoratorRule(){}
  334. std::shared_ptr<Rule> m_rule;
  335. //std::shared_ptr<Manage> m_;
  336. CarManager *m_;
  337. };
  338. class Uncopyable
  339. {
  340. protected:
  341. Uncopyable(){}
  342. ~Uncopyable(){}
  343. private:
  344. Uncopyable(const Uncopyable & lhs);
  345. Uncopyable & operator=(const Uncopyable &lhs);
  346. };
  347. class DecoratorRuleCrossing:public DecoratorRule,private Uncopyable
  348. {
  349. public:
  350. // DecoratorRuleCrossing(const DecoratorRuleCrossing &) = delete;
  351. // DecoratorRuleCrossing & operator=(const DecoratorRuleCrossing &) =delete;
  352. std::shared_ptr<DecoratorRule> getPtr()
  353. {
  354. return shared_from_this();
  355. }
  356. DecoratorRuleCrossing(CarManager* m)
  357. :DecoratorRule(m)
  358. ,b_exit(false)
  359. {
  360. m_pthread = NULL;
  361. }
  362. virtual void CreateRule()
  363. {
  364. m_rule = std::make_shared<CrossingRule>();
  365. m_rule->setPtr(getPtr());
  366. }
  367. void run();
  368. void handleRule(std::shared_ptr<card_interface> c = nullptr)
  369. {
  370. m_pthread = new std::thread(&DecoratorRuleCrossing::run,this);
  371. }
  372. ~DecoratorRuleCrossing()
  373. {
  374. b_exit = true;
  375. if(m_pthread!=NULL)
  376. {
  377. m_pthread->join();
  378. delete m_pthread;
  379. }
  380. }
  381. private:
  382. std::thread * m_pthread;
  383. bool b_exit;
  384. };
  385. class DecoratorRuleAvoidance:public DecoratorRule
  386. {
  387. public:
  388. DecoratorRuleAvoidance(CarManager* m)
  389. :DecoratorRule(m)
  390. {
  391. }
  392. std::shared_ptr<DecoratorRule> getPtr()
  393. {
  394. return shared_from_this();
  395. }
  396. virtual void CreateRule()
  397. {
  398. m_rule = std::make_shared<AvoidanceRule>();
  399. m_rule->setPtr(getPtr());
  400. }
  401. void handleRule(std::shared_ptr<card_interface> c = nullptr);
  402. virtual std::shared_ptr<RunRedLight> check_run_red_light(std::shared_ptr<card_interface> c,double dis);
  403. private:
  404. };
  405. /*
  406. static int str_split(char*s,char**rc)
  407. {
  408. char**o=rc;
  409. for(;*s;)
  410. {
  411. *o=strtok_r(s,",",&s);
  412. o++;
  413. }
  414. return o-rc;
  415. }
  416. int main()
  417. {
  418. Manage m;
  419. //test point func
  420. TrafficLightGroup *ctlg = new TrafficLightGroup(1,1,0,12,12.5,5,10,90) ;
  421. std::cout <<"direct:"<< ctlg->dist_direct(3,1)<<std::endl;;
  422. delete ctlg;
  423. //test self-thread.
  424. //std::shared_ptr<Rule> r =std::make_shared<CrossingRule> ();
  425. DecoratorRule* drc = new DecoratorRuleCrossing(&m);
  426. drc->CreateRule();
  427. drc->handleRule();
  428. delete drc;
  429. //test line
  430. line l(point(100,10),point(120,10));
  431. std::cout << l.dist(point(130,10))<<std::endl;
  432. line ll(point(4727,75),point(4727,88));
  433. std::cout << ll.a<<' '<<ll.b<<' '<<ll.c<<"=illlll"<<std::endl;
  434. auto abc = point(4727,75).get_abc(point(4727,88));
  435. std::cout << std::get<0>(abc)<<' '<<std::get<1>(abc)<<' '<<std::get<2>(abc)<<std::endl;
  436. line lll(point(4729,75),point(4729,88));
  437. std::cout << lll.a<<' '<<lll.b<<' '<<lll.c<<"=iixxlllll"<<std::endl;
  438. //read config
  439. InitData Id;
  440. Id.read_dat_group("dat_group.txt");
  441. Id.read_dat_light("dat_light.txt");
  442. Id.showInfo();
  443. //get map for trafficLightGroups includes TrafficLights
  444. //std::shared_ptr<Rule> CrossingR = std::make_shared<CrossingRule>(m);
  445. //CrossingR->put(std::move(Id.m_CrossingMap));
  446. //std::shared_ptr<Rule> AvoidanceR = std::make_shared<AvoidanceRule>(m);
  447. uint64_t tt = time(NULL)*1000;
  448. std::shared_ptr<card_interface> bc24 = std::make_shared<c>("2:4",tt,4470,75,false,1.1,2);//cardid timet x y bigcar speed,areaid
  449. std::shared_ptr<card_interface> bc22 = std::make_shared<c>("2:2",tt,4650,75,false,-1.1,2);//cardid timet x y bigcar speed.areaid
  450. m.m_map.insert({"2:4",bc24});
  451. m.m_map.insert({"2:2",bc22});
  452. // CrossingR->update(4470,-75,"2:4");
  453. // 这里需要把y转化成-
  454. m.m_g.update(4650,-75,"2:2");
  455. //auto av = AvoidanceR->find_near(4600,-75,100,"2:4");
  456. std::shared_ptr<DecoratorRule> DecCrossingRule = std::make_shared<DecoratorRuleCrossing>(&m);
  457. std::shared_ptr<DecoratorRule> DecAvoidanceRule = std::make_shared<DecoratorRuleAvoidance>(&m);
  458. for(const auto px : Id.m_Map)
  459. {
  460. //if(px.second->m_gId == 1)
  461. // px.second->store(2);
  462. // if(px.second->m_gId == 5)
  463. // bc24->push_back(px.second);
  464. // if(px.second->m_gId == 6)
  465. // {
  466. // bc24->push_back(px.second);
  467. // px.second->store(3);
  468. // }
  469. DecAvoidanceRule->put(px.second);
  470. DecCrossingRule->put(px.second);
  471. }
  472. //DectoratorRule do next..
  473. // DecCrossingRule->handleRule();
  474. //DecAvoidanceRule->handleRule();
  475. #if 0
  476. //test the sort for TrafficLightGroup............
  477. std::shared_ptr<TrafficLightGroup> p = std::make_shared<CrossingTrafficLightGroup>(1,2,0,12,12.5,5,10);
  478. std::shared_ptr<TrafficLightGroup> p1 = std::make_shared<AvoidanceTrafficLightGroup>(2,2,0,12,5,10);
  479. std::shared_ptr<TrafficLightGroup> p2 = std::make_shared<CrossingTrafficLightGroup>(3,2,0,12,12.5,5,10);
  480. std::vector<std::shared_ptr<TrafficLightGroup>> vp;
  481. vp.push_back(p);
  482. vp.push_back(p2);
  483. vp.push_back(p1);
  484. for(auto px:vp)
  485. std::cout << px->x<<"beforefdfdfd" << px->y<<std::endl;
  486. std::sort(vp.begin(),vp.end(),[](std::shared_ptr<TrafficLightGroup> one,std::shared_ptr<TrafficLightGroup> two)->bool{std::cout << two->x<<std::endl;return *one<*two;});
  487. for(auto px:vp)
  488. std::cout << px->x<<"fdfdfd" << px->y<<std::endl;
  489. #endif
  490. DecAvoidanceRule->handleRule(bc24);
  491. std::dynamic_pointer_cast<c>(bc24)->x_ = 4600;
  492. std::cout <<"------------------------------------"<<std::endl;
  493. DecAvoidanceRule->handleRule(bc24);
  494. std::cout<<"******************************************************************************888"<<std::endl;
  495. std::cout << CrossingR->showInfo()<<std::endl;;
  496. std::cout<<"************************888"<<std::endl;
  497. std::cout << AvoidanceR->showInfo()<<std::endl;;
  498. std::cout<<"**********************************************888"<<std::endl;
  499. return 0;
  500. }
  501. */
  502. NAMESPACE_POINT_END(NAMESPACE_POINT)
  503. #endif