From 148254bb1dc170db320bcb208ca79b0e252751d8 Mon Sep 17 00:00:00 2001 From: fctom1215 <fctom1215@outlook.com> Date: 星期三, 28 四月 2021 19:26:00 +0800 Subject: [PATCH] 修改科目三道路识别问题 --- lib/src/main/cpp/test_items/area_exam.cpp | 79 +++++++++++++++++++++++++++++---------- 1 files changed, 59 insertions(+), 20 deletions(-) diff --git a/lib/src/main/cpp/test_items/area_exam.cpp b/lib/src/main/cpp/test_items/area_exam.cpp index 8c95819..1eba15d 100644 --- a/lib/src/main/cpp/test_items/area_exam.cpp +++ b/lib/src/main/cpp/test_items/area_exam.cpp @@ -22,8 +22,8 @@ static int CurrExamMapIndex = -1; static int CurrEnterMapIndex = -1; -static void DetectEnterOrExitMap(const car_model *CarModel, LIST_CAR_MODEL &CarModelList, LIST_AREA_MAP &mapList); -static int EnterMap(const car_model *car, LIST_CAR_MODEL &CarModelList, LIST_AREA_MAP &mapList); +static void DetectEnterOrExitMap(int moveDirect, const car_model *CarModel, LIST_CAR_MODEL &CarModelList, LIST_AREA_MAP &mapList); +static int EnterMap(int moveDirect, const car_model *car, LIST_CAR_MODEL &CarModelList, LIST_AREA_MAP &mapList); static bool ExitMap(const car_model *car, int index, LIST_AREA_MAP &mapList); static bool CrashTriggerLine(Line triggerLine, const car_model *car, LIST_CAR_MODEL &CarModelList); static void ExecuteExam(int index, LIST_AREA_MAP &AreaMapList, const car_model *car, LIST_CAR_MODEL &CarModelList, double speed, int move, double azimuth, const struct RtkTime* rtkTime); @@ -43,7 +43,7 @@ { UpdataOdo(speed, moveDirect, rtkTime); - DetectEnterOrExitMap(car, CarModelList, AreaMapList); + DetectEnterOrExitMap(moveDirect, car, CarModelList, AreaMapList); ExecuteExam(CurrExamMapIndex, AreaMapList, car, CarModelList, speed, moveDirect, azimuth, rtkTime); } @@ -103,11 +103,11 @@ array.push_back(rd); } -static void DetectEnterOrExitMap(const car_model *car, LIST_CAR_MODEL &CarModelList, LIST_AREA_MAP &mapList) +static void DetectEnterOrExitMap(int moveDirect, const car_model *car, LIST_CAR_MODEL &CarModelList, LIST_AREA_MAP &mapList) { if (CurrExamMapIndex < 0) { if (CurrEnterMapIndex < 0) { - CurrEnterMapIndex = EnterMap(car, CarModelList, mapList); + CurrEnterMapIndex = EnterMap(moveDirect, car, CarModelList, mapList); if (CurrEnterMapIndex >= 0) { DEBUG("杩涘叆鏌愪釜瀛愰」鐩� idx = %d", CurrEnterMapIndex); CurrExamMapIndex = CurrEnterMapIndex; @@ -199,7 +199,7 @@ } } -static int EnterMap(const car_model *car, LIST_CAR_MODEL &CarModelList, LIST_AREA_MAP &mapList) +static int EnterMap(int moveDirect, const car_model *car, LIST_CAR_MODEL &CarModelList, LIST_AREA_MAP &mapList) { vector<int> score(mapList.size(), 0); // 鍦哄湴閲嶅悎鏃讹紝杞﹀ご灏鹃兘鍦ㄥ唴鐨勪紭鍏� @@ -222,7 +222,7 @@ triggerLine.X2 = x9; triggerLine.Y2 = y9; - if (CrashTriggerLine(triggerLine, car, CarModelList)) + if (moveDirect > 0 && CrashTriggerLine(triggerLine, car, CarModelList)) return i; } if (mapList[i].type == MAP_TYPE_PARK_BUTTOM) { @@ -230,14 +230,33 @@ MakeLine(&triggerLine, &(mapList[i].map.point[1]), &(mapList[i].map.point[0])); - if (CrashTriggerLine(triggerLine, car, CarModelList)) + if (moveDirect > 0 && CrashTriggerLine(triggerLine, car, CarModelList)) return i; MakeLine(&triggerLine, &(mapList[i].map.point[7]), &(mapList[i].map.point[6])); - if (CrashTriggerLine(triggerLine, car, CarModelList)) + if (moveDirect > 0 && CrashTriggerLine(triggerLine, car, CarModelList)) return i; + // 鍏ㄨ溅鍦ㄥ満鍦板唴 + if (moveDirect == 0) { + Polygon carBody; + bool ret = false; + carBody.num = car->bodyNum; + carBody.point = (PointF *) malloc(carBody.num * sizeof(PointF)); + for (int i = 0; i < carBody.num; ++i) { + carBody.point[i] = car->carXY[car->body[i]]; + } + + if (IntersectionOf(&carBody, &mapList[i].map) == GM_Containment) { + ret = true; + } + + free(carBody.point); + + if (ret) + return i; + } // // 杞﹀ご椤剁偣鍦ㄥ満鍦板唴 // if (IntersectionOf(car->carXY[ car->axial[AXIAL_FRONT] ], &mapList[i].map) == GM_Containment) { // Line enterLine1, enterLine2; @@ -266,8 +285,28 @@ MakeLine(&triggerLine, &(mapList[i].map.point[1]), &(mapList[i].map.point[0])); - if (CrashTriggerLine(triggerLine, car, CarModelList)) + if (moveDirect > 0 && CrashTriggerLine(triggerLine, car, CarModelList)) return i; + + // 鍏ㄨ溅鍦ㄥ満鍦板唴 + if (moveDirect == 0) { + Polygon carBody; + bool ret = false; + carBody.num = car->bodyNum; + carBody.point = (PointF *) malloc(carBody.num * sizeof(PointF)); + for (int i = 0; i < carBody.num; ++i) { + carBody.point[i] = car->carXY[car->body[i]]; + } + + if (IntersectionOf(&carBody, &mapList[i].map) == GM_Containment) { + ret = true; + } + + free(carBody.point); + + if (ret) + return i; + } // // 杞﹀ご椤剁偣鍦ㄥ満鍦板唴 // if (IntersectionOf(car->carXY[ car->axial[AXIAL_FRONT] ], &mapList[i].map) == GM_Containment) { // Line enterLine; @@ -293,7 +332,7 @@ MakeLine(&triggerLine, &(mapList[i].map.point[0]), &(mapList[i].map.point[1])); - if (CrashTriggerLine(triggerLine, car, CarModelList)) + if (moveDirect > 0 && CrashTriggerLine(triggerLine, car, CarModelList)) return i; } if (mapList[i].type == MAP_TYPE_CURVE) { @@ -301,7 +340,7 @@ Line triggerLine; MakeLine(&triggerLine, &mapList[i].map2.point[0], &mapList[i].map.point[0]); - if (CrashTriggerLine(triggerLine, car, CarModelList)) + if (moveDirect > 0 && CrashTriggerLine(triggerLine, car, CarModelList)) return i; } } @@ -424,8 +463,8 @@ car_model *c1 = *iter; - trace.point[pn] = c1->carXY[c1->left_front_tire[TIRE_OUTSIDE]]; - trace2.point[pn++] = c1->carXY[c1->left_rear_tire[TIRE_OUTSIDE]]; + trace.point[pn] = centerOfTwoPoint(c1->carXY[c1->left_front_tire[TIRE_OUTSIDE]], c1->carXY[c1->right_front_tire[TIRE_OUTSIDE]]); + trace2.point[pn++] = centerOfTwoPoint(c1->carXY[c1->left_rear_tire[TIRE_OUTSIDE]], c1->carXY[c1->right_rear_tire[TIRE_OUTSIDE]]); ++iter; @@ -435,8 +474,8 @@ uint32_t tdiff = TimeGetDiff(c1->tm.hh, c1->tm.mm, c1->tm.ss, c1->tm.mss * 10, c2->tm.hh, c2->tm.mm, c2->tm.ss, c2->tm.mss*10); if (tdiff >= D_SEC(1)) { - trace.point[pn] = c2->carXY[c2->left_front_tire[TIRE_OUTSIDE]]; - trace2.point[pn++] = c2->carXY[c2->left_rear_tire[TIRE_OUTSIDE]]; + trace.point[pn] = centerOfTwoPoint(c2->carXY[c2->left_front_tire[TIRE_OUTSIDE]], c2->carXY[c2->right_front_tire[TIRE_OUTSIDE]]); + trace2.point[pn++] = centerOfTwoPoint(c2->carXY[c2->left_rear_tire[TIRE_OUTSIDE]], c2->carXY[c2->right_rear_tire[TIRE_OUTSIDE]]); c1 = c2; } ++iter; @@ -457,11 +496,11 @@ MakeLine(&trace2_line, &trace2.point[pp], &trace2.point[p]); if ((IntersectionOf(trace_line, triggerLine) == GM_Intersection && - IntersectionOfLine(p1, p2, car->carXY[car->left_front_tire[TIRE_OUTSIDE]]) == -1 && - DistanceOf(car->carXY[car->left_front_tire[TIRE_OUTSIDE]], triggerLine) > 0.1) || + IntersectionOfLine(p1, p2, centerOfTwoPoint(car->carXY[car->left_front_tire[TIRE_OUTSIDE]], car->carXY[car->right_front_tire[TIRE_OUTSIDE]])) == -1 && + DistanceOf(centerOfTwoPoint(car->carXY[car->left_front_tire[TIRE_OUTSIDE]], car->carXY[car->right_front_tire[TIRE_OUTSIDE]]), triggerLine) > 0.1) || (IntersectionOf(trace2_line, triggerLine) == GM_Intersection && - IntersectionOfLine(p1, p2, car->carXY[car->left_rear_tire[TIRE_OUTSIDE]]) == -1 && - DistanceOf(car->carXY[car->left_rear_tire[TIRE_OUTSIDE]], triggerLine) > 0.1) ) { + IntersectionOfLine(p1, p2, centerOfTwoPoint(car->carXY[car->left_rear_tire[TIRE_OUTSIDE]], car->carXY[car->right_rear_tire[TIRE_OUTSIDE]])) == -1 && + DistanceOf(centerOfTwoPoint(car->carXY[car->left_rear_tire[TIRE_OUTSIDE]], car->carXY[car->right_rear_tire[TIRE_OUTSIDE]]), triggerLine) > 0.1) ) { // 纰板埌瑙﹀彂绾� DEBUG("纰版挒瑙﹀彂绾� 寮曞彂鍦板浘"); trigger = true; -- Gitblit v1.8.0