wangzhengquan
2020-09-17 a4d90ebc6a31b9948ecee74189fe1423589e1f4c
algorithm/IndirectAlg.c
@@ -1,6 +1,7 @@
#include "usg_common.h"
#include "IndirectAlg.h"
#include "graph.h"
 
#define PI 3.14159265
 
@@ -32,15 +33,15 @@
IndirectAlg::IndirectAlg() {}
IndirectAlg::IndirectAlg(const initializer_list<Edge> & edges, const time_t & _keepTime, const Vector2 & _direction):
    frame(edges), keepTime(_keepTime), direction(_direction), mterminate(false) {
IndirectAlg::IndirectAlg(const initializer_list<Edge> & edges,const Vector2 & _direction, const time_t & _keepTime, const double _minDistance):
    frame(edges), keepTime(_keepTime), minDistance(_minDistance), direction(_direction), mterminate(false) {
    mthread = std::thread(std::bind(&IndirectAlg::threadRoutine, this));
}
IndirectAlg::IndirectAlg(const initializer_list<Point> & points, const time_t & _keepTime, const Vector2 & _direction):
    keepTime(_keepTime), direction(_direction), mterminate(false) {
IndirectAlg::IndirectAlg(const initializer_list<Point> & points, const Vector2 & _direction, const time_t & _keepTime, const double _minDistance):
    keepTime(_keepTime), minDistance(_minDistance), direction(_direction), mterminate(false) {
    if (points.size() > 0) {
        std::vector<Edge> edges;
        initializer_list<Point>::iterator iter;
@@ -81,18 +82,21 @@
    while (!mterminate.load()) {
        std::this_thread::sleep_for(std::chrono::seconds(this->keepTime * 2));
        //sleep(this->keepTime);
        for(iter = statusMap.begin(); iter != statusMap.end(); iter++) {
        for(iter = statusMap.begin(); iter != statusMap.end();) {
          
            status = iter->second;
            if (status != nullptr) {
                // cout<< "iter " << iter->first <<' '<< iter->second <<  status->lastTime << endl; 
               // printf("%ld, %ld, %ld\n", time(NULL), status->lastTime, (time(0) - status->lastTime));
                if(difftime(time(NULL), status->lastTime) > this->keepTime*2) {
                if(difftime(time(NULL), status->lastTime) > this->keepTime * 2) {
                    std::cout << status->id << "脱离监控区, remove from map\n";
                    delete status;
                    statusMap.erase(iter);
                }
                    iter = statusMap.erase(iter);
                    continue;
                }
            }
            iter++;
        }
    }
     
@@ -148,7 +152,8 @@
        status->lastCoordinate = record.coordinate;
    }
    if (currentDirection.x == 0 && currentDirection.y == 0) {
    if (getVecor2Len(currentDirection) <= minDistance) {
        //没动
        printRecord(3, record);
        return false;