From 0820c9f0ffa19ba234bcc6858961c9e824f0ffa9 Mon Sep 17 00:00:00 2001 From: yy1717 <fctom1215@outlook.com> Date: 星期四, 16 四月 2020 18:10:26 +0800 Subject: [PATCH] 科目三 --- lib/src/main/cpp/test_items2/road_exam.cpp | 209 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 209 insertions(+), 0 deletions(-) diff --git a/lib/src/main/cpp/test_items2/road_exam.cpp b/lib/src/main/cpp/test_items2/road_exam.cpp index 1a86093..ee1456b 100644 --- a/lib/src/main/cpp/test_items2/road_exam.cpp +++ b/lib/src/main/cpp/test_items2/road_exam.cpp @@ -33,6 +33,8 @@ START_CAR_DONE }; +static const int INVALID_ROAD = -1; + static const int TURN_THRESHOLD = 1; static const int TURN_CHECK_INTERVAL = 500; const double SLIDE_DISTANCE_THRESHOLD_RED = 0.3; @@ -981,5 +983,212 @@ } return -1; } +#if 0 +void TestRoadGeneral(struct road_exam2_map &map, const car_model *car, LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime) +{ +} +/************************************************** + * 杞﹁締褰撳墠鎵�鍦ㄨ矾娈碉紝杞﹀ご闇�瓒婅繃璧峰绾夸竴瀹氳窛绂� + * @param currIndex + * @param map + * @param car + */ +static void EnterRoad(int &currIndex, struct road_exam2_map &map, const car_model *car) +{ + Polygon carBody; + + 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]]; + } + + Polygon roadArea; + roadArea.num = 0; + roadArea.point = NULL; + + for (int i = 0; i < map.roads.size(); ++i) { + if (roadArea.point != NULL) { + free(roadArea.point); + } + + for (int x = 0; x < map.roads[i].leftEdge.size(); ++x) { + roadArea.num += map.roads[i].leftEdge[x].points.size(); + } + for (int x = 0; x < map.roads[i].rightEdge.size(); ++x) { + roadArea.num += map.roads[i].rightEdge[x].points.size(); + } + roadArea.point = (PointF *) malloc(roadArea.num * sizeof(PointF)); + + int n = 0; + for (int j = 0; j < map.roads[i].leftEdge.size(); j++) { + for (int x = 0; x < map.roads[i].leftEdge[j].points.size(); ++x) { + if (n > 0 && x == 0 && isEqual2(roadArea.point[n-1].X, map.roads[i].leftEdge[j].points[x].X) && + isEqual2(roadArea.point[n-1].Y, map.roads[i].leftEdge[j].points[x].Y)) { + // 绗竴涓偣宸茬粡瀛樺湪浜庝笂涓�鏉$嚎 + } else { + roadArea.point[n++] = map.roads[i].leftEdge[j].points[x]; + } + } + } + for (int j = map.roads[i].rightEdge.size(); j > 0; j--) { + for (int x = map.roads[i].rightEdge[j].points.size(); x > 0; --x) { + if (n > 0 && x == map.roads[i].rightEdge[j].points.size() && + isEqual2(roadArea.point[n-1].X, map.roads[i].rightEdge[j - 1].points[x-1].X) && + isEqual2(roadArea.point[n-1].Y, map.roads[i].rightEdge[j - 1].points[x-1].Y)) { + // 绗竴涓偣宸茬粡瀛樺湪浜庝笂涓�鏉$嚎 + } else { + roadArea.point[n++] = map.roads[i].rightEdge[j - 1].points[x - 1]; + } + } + } + roadArea.num = n; + + if (IntersectionOf(car->carXY[car->axial[AXIAL_FRONT]], &roadArea) == GM_Containment) { + currIndex = i; + goto CHECK_CAR_ON_ROAD_END; + } + } + currIndex = INVALID_ROAD; + + CHECK_CAR_ON_ROAD_END: + if (roadArea.point != NULL) { + free(roadArea.point); + } + free(carBody.point); +} + +/****************************************************** + * 鍏ㄨ溅閮介渶绂诲紑杩欎釜鍖哄煙 + * @param currIndex + * @param map + * @param car + * @return + */ +static bool ExitRoad(int currIndex, struct road_exam2_map &map, const car_model *car) +{ + // 鍏ㄨ溅閮介渶涓嶅湪鍦板浘涓� + bool ret = false; + + if (currIndex == INVALID_ROAD || currIndex >= map.roads.size()) + return ret; + + Polygon roadArea; + + roadArea.num = map.roads[currIndex].leftEdge.size() + map.roads[currIndex].rightEdge.size();; + roadArea.point = (PointF *) malloc(roadArea.num * sizeof(PointF));; + + int n = 0; + for (int j = 0; j < map.roads[currIndex].leftEdge.size(); j++) { + roadArea.point[n++] = map.roads[i].leftEdge[j]; + } + for (int j = map.roads[currIndex].rightEdge.size(); j > 0; j--) { + roadArea.point[n++] = map.roads[i].rightEdge[j - 1]; + } + + Polygon carBody; + + 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, &roadArea) == GM_None) { + ret = true; + } + + free(carBody.point); + free(roadArea.point); + return ret; +} + +static bool CrashSeparateLine(int currIndex, struct road_exam2_map &map, const car_model *car) +{ + Line frontAxle, rearAxle; + + if (currIndex == INVALID_ROAD || currIndex >= map.roads.size()) + return false; + + MakeLine(&frontAxle, &car->carXY[car->left_front_tire[TIRE_OUTSIDE]], &car->carXY[car->right_front_tire[TIRE_OUTSIDE]]); + MakeLine(&rearAxle, &car->carXY[car->left_rear_tire[TIRE_OUTSIDE]], &car->carXY[car->right_rear_tire[TIRE_OUTSIDE]]); + + // 鍒嗘 + for (int i = 0; i < map.roads[currIndex].separate.size(); i++) { + // 鍒嗘涓殑姣忔潯绾� + for (int j = 0; j < map.roads[currIndex].separate[i].line.size(); j++) { + Line theLine; + int p1 = 0; + for (int p2 = 1; p2 < map.roads[currIndex].separate[i].line[j].num; ++p2) { + MakeLine(&theLine, &map.roads[currIndex].separate[i].line[j].point[p1], &map.roads[currIndex].separate[i].line[j].point[p2]); + if (IntersectionOf(theLine, frontAxle) == GM_Intersection || + IntersectionOf(theLine, rearAxle) == GM_Intersection) { + return true; + } + p1 = p2; + } + } + } + return false; +} + +struct { + int road; + int segment; + int track; +} CarOnTrackInfo; + +static void DetectSeparate(int currIndex, struct road_exam2_map &map, const car_model *car) +{ + int segment; + int track = -1; + + if (currIndex == INVALID_ROAD || currIndex >= map.roads.size()) + return; + + for (int i = 0; i < map.roads[currIndex].separate.size(); i++) { + if (map.roads[currIndex].separate[i].character == 0) { + int separate_line_num = map.roads[currIndex].separate[i].line.size(); + + // 閬嶅巻褰撳墠鍒嗘鐨勬瘡涓�鏉$嚎 + for (int j = 0; j < separate_line_num; ++j) { + Line theLine; + int p1 = 0; + bool match_line = false; + // 鍗曠嫭鐨勪竴鏉¤櫄绾� + for (int p2 = 1; p2 < map.roads[currIndex].separate[i].line[j].num; ++p2) { + MakeLine(&theLine, &map.roads[currIndex].separate[i].line[j].point[p1], &map.roads[currIndex].separate[i].line[j].point[p2]); + if (p1 == 0 || p2 == map.roads[currIndex].separate[i].line[j].num - 1) { + // 棣栧熬涓ょ锛屽簲閲囩敤寤堕暱绾跨殑鏂瑰紡 + } + if (VerticalPointOnLine(car->basePoint, theLine)) { + match_line = true; + int rel = IntersectionOfLine(map.roads[currIndex].separate[i].line[j].point[p1], + map.roads[currIndex].separate[i].line[j].point[p2], + car->basePoint); + // 璁板綍鎵�鍦ㄩ亾璺紝鍒嗛亾娈碉紝鍒嗛亾鎯呭喌 + if (rel == 1) { // 鍦ㄥ乏渚� + segment = i; + track = j; + goto DETECT_SEPARATE_END; + } else if (rel != -1) { // 鍦ㄧ嚎涓� + segment = i; + track = j; + goto DETECT_SEPARATE_END; + } + break; + } + p1 = p2; + } + + track = separate_line_num; + } + } + } + + DETECT_SEPARATE_END: + ; +} +#endif -- Gitblit v1.8.0