From 4bd08f0355b6b2cf3c027202d5ad301b4e182953 Mon Sep 17 00:00:00 2001 From: yy1717 <fctom1215@outlook.com> Date: 星期五, 31 三月 2023 17:16:22 +0800 Subject: [PATCH] 科目二修改 --- lib/src/main/cpp/test_items/park_bottom.cpp | 475 ++++++++++++++++++++++------------------------------------- 1 files changed, 177 insertions(+), 298 deletions(-) diff --git a/lib/src/main/cpp/test_items/park_bottom.cpp b/lib/src/main/cpp/test_items/park_bottom.cpp index d1bb652..421ecf5 100644 --- a/lib/src/main/cpp/test_items/park_bottom.cpp +++ b/lib/src/main/cpp/test_items/park_bottom.cpp @@ -1,6 +1,17 @@ // // Created by YY on 2019/10/23. // +// +// 0 ____________________________________7 +// +// +// 1 _____________2 5_________________6 +// 8| |9 +// | | +// | | +// | | +// 3--------4 +// #include "park_bottom.h" #include "../common/apptimer.h" @@ -35,19 +46,22 @@ TEST_FINISH }; -static int testStatus; +typedef enum { + NONE_CTRL_LINE, + LEFT_CTRL_LINE, + RIGHT_CTRL_LINE +} ctrl_line_t; + static bool reverseCar = false; -static int mapIndex = 0; const uint32_t CHECK_PARK_DELAY = 400; static uint32_t stopTimepoint; -static int prevMoveDirect, storeMoveDirectBeforeStop; +static int prevMoveDirect; static bool occurCrashRedLine; -static bool checkPartStatus; + static uint32_t firstReverseTimepoint; -static bool reportExamTimeout, reportParkFail; -static bool crossCtrlLineSw; + static int parkCount; static char carray[3]; static int darray[3]; @@ -55,49 +69,44 @@ static int gearAtStop; static int currGear; -static char prevCrossedCtrlLine; +static ctrl_line_t prevCrossedCtrlLine; static double odo; -static int exitAreaCfm; -static char CrossCtrlLine(const Polygon *map, const car_model *car, const car_model *prev_car); -static bool EnterParking(const Polygon *map, const car_model *car); -static bool CrashRedLine(const Polygon *map, const car_model *car, int &who); -static bool ExitParkArea(const Polygon *map, const car_model *car); -static bool AllTireExitParkArea(const Polygon *map, const car_model *car); -void StartParkBottom(int index, int moveDirect, const struct RtkTime *rtkTime) +static ctrl_line_t CrossCtrlLine(prime_t &prime); +static bool EnterParking(prime_t &prime); +static bool CrashRedLine(prime_t &prime); + + +void StartParkBottom(prime_t &prime) { DEBUG("StartParkBottom"); - testStatus = TESTING; reverseCar = false; - mapIndex = index; memset(carray, 0, sizeof(carray)); memset(darray, 0, sizeof(darray)); memset(parkStatus, 0, sizeof(parkStatus)); - prevMoveDirect = moveDirect; + prevMoveDirect = prime.pMotion->move; - checkPartStatus = false; firstReverseTimepoint = 0; - reportExamTimeout = false; + parkCount = 0; - crossCtrlLineSw = false; - reportParkFail = false; + occurCrashRedLine = false; currGear = ReadCarStatus(GEAR); - prevCrossedCtrlLine = 0; + prevCrossedCtrlLine = NONE_CTRL_LINE; stopTimepoint = 0; - exitAreaCfm = 0; + odo = ReadOdo(); PlayTTS("鎮ㄥ凡杩涘叆鍊掕溅鍏ュ簱鍖哄煙", NULL); } -int TestParkBottom(const Polygon *map, const car_model *car, const car_model *carPrev, double speed, int moveDirect, const struct RtkTime *rtkTime) +void TestParkBottom(prime_t &prime) { - char crossCtrlLine = 0; - uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10); - int who = 0; + ctrl_line_t crossCtrlLine = NONE_CTRL_LINE; + uint32_t tp = AppTimer_GetTickCount(); + vector<double> dtox; vector<Line> line_set; Line distance_line; @@ -128,32 +137,32 @@ odo = ReadOdo(); } - if (testStatus == TESTING && gear_change) { + if (gear_change) { if (currGear == GEAR_R) { // 鎸傚�掓尅,妫�娴嬫槸鍚﹁繃鎺у埗绾� DEBUG("寮�濮嬫寕鍊掓尅"); if (!reverseCar) { DEBUG("寮�濮嬮杞叆搴�"); reverseCar = true; - MA_EnterMap(mapIndex, MAP_TYPE_PARK_BUTTOM, 1); + MA_EnterMap(prime.pMap->park_button_map[prime.curr_exam_map.map_idx].id, MAP_TYPE_PARK_BUTTOM, 1); firstReverseTimepoint = tp; // 寮�濮�210绉掕鏃� } - crossCtrlLine = CrossCtrlLine(map, car, carPrev); + crossCtrlLine = CrossCtrlLine(prime); if (parkCount >= 2) { DEBUG("寮�濮嬫杞叆搴�"); parkCount = 0; - MA_EnterMap(mapIndex, MAP_TYPE_PARK_BUTTOM, 1); + MA_EnterMap(prime.pMap->park_button_map[prime.curr_exam_map.map_idx].id, MAP_TYPE_PARK_BUTTOM, 1); firstReverseTimepoint = tp; // 寮�濮�210绉掕鏃� } - if (crossCtrlLine == 0) { + if (crossCtrlLine == NONE_CTRL_LINE) { // 鍊掕溅鍓嶏紝鍓嶈疆鏈┒杩囨帶鍒剁嚎 - AddExamFault(20104, rtkTime); + AddExamFault(20104); DEBUG("鍊掕溅鍓嶏紝鍓嶈疆鏈┒杩囨帶鍒剁嚎"); } else if (crossCtrlLine == prevCrossedCtrlLine) { // 閲嶅璺ㄨ秺鍚屼竴鎺у埗绾匡紝涓嶆寜瑙勫畾绾胯矾锛岄『搴忓舰寮忥紝涓嶅悎鏍� - AddExamFault(20101, rtkTime); + AddExamFault(20101); DEBUG("涓嶆寜瑙勫畾绾胯矾锛岄『搴忓舰寮忥紝 鍚� %c 渚�", prevCrossedCtrlLine); } else { prevCrossedCtrlLine = crossCtrlLine; @@ -167,78 +176,45 @@ DEBUG("搴撲綅妫�鏌ユ鏁� = %d", parkCount); - if (EnterParking(map, car)) { + if (EnterParking(prime)) { DEBUG("鍊掑簱鎴愬姛"); } else { - AddExamFault(20103, rtkTime); + AddExamFault(20103); DEBUG("鍊掑簱涓嶅叆"); } } } - - if (testStatus == TESTING && parkCount < 2 && AllTireExitParkArea(map, car)) { - if (++exitAreaCfm >= 4) { // 閬垮厤淇″彿婕傜Щ閫犳垚鐨勮鍒� - testStatus = TEST_FAIL; - AddExamFault(10103, rtkTime); + + if (ExitParkArea(prime)) { + // 绂诲紑鍦哄湴 + DEBUG("绂诲紑鍦哄湴"); + if (parkCount < 2) { + AddExamFault(10103); DEBUG("鐩存帴椹剁娴嬭瘯鍖�,涓嶆寜鑰冭瘯鍛樻寚浠ら┚椹�"); } - } else { - exitAreaCfm = 0; - } - - if (ExitParkArea(map, car)) { - DEBUG("绂诲紑鍦哄湴"); - // 绂诲紑鍦哄湴 - testStatus = TEST_FINISH; - /*if ((parkStatus[0] != 1 || parkStatus[1] != 1) && !reportParkFail && reverseCar) { - // 鍊掑簱涓嶅叆锛屼笉鍚堟牸 - reportParkFail = true; - AddExamFault(20103, rtkTime); - DEBUG("鍊掑簱涓嶅叆"); - }*/ + prime.curr_exam_map.type = 0; goto TEST_END; } - // 璺濈妫�娴� - MakeLine(&distance_line, &map->point[0], &map->point[7]); - line_set.push_back(distance_line); - MakeLine(&distance_line, &map->point[1], &map->point[2]); - line_set.push_back(distance_line); - MakeLine(&distance_line, &map->point[2], &map->point[3]); - line_set.push_back(distance_line); - MakeLine(&distance_line, &map->point[3], &map->point[4]); - line_set.push_back(distance_line); - MakeLine(&distance_line, &map->point[4], &map->point[5]); - line_set.push_back(distance_line); - MakeLine(&distance_line, &map->point[5], &map->point[6]); - line_set.push_back(distance_line); - DistanceOfTire2X(dtox, car, line_set); - MA_SendDistance(dtox[0], dtox[1]); - - if (CrashRedLine(map, car, who)) { - if (!occurCrashRedLine /*&& reverseCar*/) { + if (BodyCollidingLine(prime) >= 0) { + if (!occurCrashRedLine) { occurCrashRedLine = true; // 杞﹁韩鍑虹嚎锛屼笉鍚堟牸 - AddExamFault(10116, rtkTime); - DEBUG("杞﹁疆鍘嬬嚎"); - /*if (who == 1) { - PlayTTS("鍘嬪乏搴撲綅绾�", NULL); - } else if (who == 2) { - PlayTTS("鍘嬪彸搴撲綅绾�", NULL); - }*/ + AddExamFault(10116); + DEBUG("杞﹁韩鍑虹嚎"); } } else { occurCrashRedLine = false; } - if (moveDirect != prevMoveDirect) { - if (moveDirect == 0) { + if (prime.pMotion->move != prevMoveDirect) { + if (prime.pMotion->move == STOP) { stopTimepoint = tp; gearAtStop = (currGear == GEAR_R ? 1 : 0); - DEBUG("鍋滆溅浜� %d %d %d %d %d %d %d", rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss); + DEBUG("鍋滆溅浜�"); DEBUG("鍋滆溅鏃舵尅浣� = %d", gearAtStop); - } else if (prevMoveDirect == 0 && stopTimepoint > 0) { - DEBUG("缁х画琛岄┒ %d %d %d %d %d %d %d", rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss); + } else if (prevMoveDirect == STOP && stopTimepoint > 0) { + DEBUG("缁х画琛岄┒"); DEBUG("鍋滆溅鏃堕棿 %ld", tp - stopTimepoint); DEBUG("鍐嶆绉诲姩鏃舵尅浣� = %d", currGear == GEAR_R ? 1 : 0); @@ -246,176 +222,122 @@ if (tp - stopTimepoint >= CorrectPauseCriteria(examParam.park_bottom_pause_criteria) && gearAtStop == (currGear == GEAR_R ? 1 : 0)) { // 鍋滆溅瓒�2绉掞紝姣忔鎵�5鍒� - AddExamFault(20106, rtkTime); + AddExamFault(20106); DEBUG("涓�斿仠杞�"); } } - prevMoveDirect = moveDirect; + prevMoveDirect = prime.pMotion->move; } - -/* crossCtrlLine = CrossCtrlLine(map, car, carPrev); - if (crossCtrlLine > 0 && !crossCtrlLineSw) { - crossCtrlLineSw = true; - if (parkCount == 0) { - carray[0] = crossCtrlLine; - } else if (parkCount == 1) { - if (carray[0] == crossCtrlLine) { - // 涓嶆寜瑙勫畾绾胯矾锛岄『搴忓舰寮忥紝涓嶅悎鏍� - AddExamFault(20101, rtkTime); - DEBUG("涓嶆寜瑙勫畾绾胯矾锛岄『搴忓舰寮�"); - } - carray[1] = crossCtrlLine; - } else if (parkCount == 2) { - if (carray[0] != crossCtrlLine) { - // 涓嶆寜瑙勫畾绾胯矾锛岄『搴忓舰寮忥紝涓嶅悎鏍� - AddExamFault(20101, rtkTime); - DEBUG("涓嶆寜瑙勫畾绾胯矾锛岄『搴忓舰寮�"); - } else { - // 绂诲紑娴嬭瘯鍖猴紝鍋滄璁℃椂 - DEBUG("绂诲紑娴嬭瘯鍖猴紝鍋滄璁℃椂"); - testStatus = false; - goto TEST_END; - } - carray[2] = crossCtrlLine; - } - } - - if (testStatus && darray[0] > 0 && tp - firstReverseTimepoint >= examParam.park_bottom_limit_time) { - // 瀹屾垚瓒呮椂锛屼笉鍚堟牸 - if (!reportExamTimeout) { - reportExamTimeout = true; - AddExamFault(20105, rtkTime); - DEBUG("椤圭洰瓒呮椂"); - } - } - - if (moveDirect != prevMoveDirect) { - if (moveDirect == 0) { - stopTimepoint = tp; - storeMoveDirectBeforeStop = prevMoveDirect; - if (prevMoveDirect == -1) { - checkPartStatus = true; // 姣忔鍊掕溅鍋滄锛岃Е鍙戝叆搴撴鏌� - } - - DEBUG("鍋滆溅浜� %d %d %d %d %d %d %d", rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss); - } else { - DEBUG("缁х画琛岄┒ %d %d %d %d %d %d %d", rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss); - - DEBUG("鍋滆溅鏃堕棿 %ld", tp - stopTimepoint); - - if (moveDirect == storeMoveDirectBeforeStop) { - // 鍚屾柟鍚戝啀鍚姩锛岀户缁垽鏂槸鍚﹀仠杞﹁秴鏃� - if (tp - stopTimepoint >= CorrectPauseCriteria(examParam.park_bottom_pause_criteria) && reverseCar) { - // 鍋滆溅瓒�2绉掞紝姣忔鎵�5鍒� - AddExamFault(20106, rtkTime); - DEBUG("涓�斿仠杞�"); - } - } else if (moveDirect == -1) { - // 鍒囨崲涓哄�掕溅 - if (!reverseCar) { - reverseCar = true; - MA_EnterMap(mapIndex, MAP_TYPE_PARK_BUTTOM, 1); - } - if (darray[parkCount] == 0) { - if (!crossCtrlLineSw) { - // 鍊掕溅鍓嶏紝鍓嶈疆鏈┒杩囨帶鍒剁嚎 - AddExamFault(20104, rtkTime); - DEBUG("鍊掕溅鍓嶏紝鍓嶈疆鏈┒杩囨帶鍒剁嚎"); - } - darray[parkCount] = 1; - firstReverseTimepoint = tp; // 棣栨鍊掕溅锛屾墠鎰忓懗鐫�姝ら」鐩紑濮� - } - } else { - // 鍒囨崲涓哄墠杩� - DEBUG("鍒囨崲涓哄墠杩�"); - - if (tp - stopTimepoint >= CHECK_PARK_DELAY) { - if (crossCtrlLineSw) { - if (parkStatus[parkCount] != 1) { - // 鍊掑簱涓嶅叆锛屼笉鍚堟牸 - reportParkFail = true; - AddExamFault(20103, rtkTime); - DEBUG("鍊掑簱涓嶅叆"); - } - } - - crossCtrlLineSw = false; - - if (parkCount < 2) - parkCount++; - } - } - } - prevMoveDirect = moveDirect; - } else if (moveDirect == -1) { - if (darray[parkCount] == 0) { - // 鍒囨崲涓哄�掕溅 - if (!crossCtrlLineSw) { - // 鍊掕溅鍓嶏紝鍓嶈疆鏈┒杩囨帶鍒剁嚎 - AddExamFault(20104, rtkTime); - DEBUG("鍊掕溅鍓嶏紝鍓嶈疆鏈┒杩囨帶鍒剁嚎"); - } - darray[parkCount] = 1; - firstReverseTimepoint = tp; - } - } else if (moveDirect == 0 && crossCtrlLineSw) { - if (tp - stopTimepoint >= CHECK_PARK_DELAY && checkPartStatus) { - if (EnterParking(map, car)) { - parkStatus[parkCount] = 1; - } - checkPartStatus = false; - } - }*/ - TEST_END: - if (testStatus == TEST_FINISH) { - DEBUG("鍊掑簱缁撴潫"); - MA_EnterMap(mapIndex, MAP_TYPE_PARK_BUTTOM, 0); - return 0; + DEBUG("鍊掑簱缁撴潫"); + MA_EnterMap(prime.pMap->park_button_map[prime.curr_exam_map.map_idx].id, MAP_TYPE_PARK_BUTTOM, 0); +} + +static int BodyCollidingLine(prime_t &prime) +{ + vector<Line> lines; + + Polygon car_body; + + car_body.num = prime.pModel->body.size(); + car_body.point = new PointF[car_body.num]; + + for (int i = 0; i < car_body.num; ++i) { + car_body.point[i] = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->body[i]]; } - return 1; + + Line line; + MAKE_LINE(line, prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[0], + prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[7]); + lines.push_back(line); + MAKE_LINE(line, prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[1], + prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[2]); + lines.push_back(line); + MAKE_LINE(line, prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[2], + prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[3]); + lines.push_back(line); + MAKE_LINE(line, prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[3], + prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[4]); + lines.push_back(line); + MAKE_LINE(line, prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[4], + prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[5]); + lines.push_back(line); + MAKE_LINE(line, prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[5], + prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[6]); + lines.push_back(line); + + int idx = 0; + + for (auto line: lines) { + if (IntersectionOf(line, &car_body) != GM_None) { + break; + } + idx++; + } + delete []car_body.point; + return idx < lines.size()? idx : -1; } // 妫�娴�2鍓嶈疆鏄惁姝e悜瓒婅繃宸﹀彸鎺у埗绾� -static char CrossCtrlLine(const Polygon *map, const car_model *car, const car_model *prev_car) +static ctrl_line_t CrossCtrlLine(prime_t &prime) { // 杩囧彸鎺у埗绾� - if ((IntersectionOfLine(map->point[6], map->point[7], car->carXY[car->left_front_tire[TIRE_OUTSIDE]]) == -1) && - (IntersectionOfLine(map->point[6], map->point[7], car->carXY[car->right_front_tire[TIRE_OUTSIDE]]) == -1) && - (IntersectionOfLine(map->point[6], map->point[7], car->carXY[car->axial[AXIAL_REAR]]) == 1)) { - return 'R'; + Line left_trace, right_trace; + Line left_ctrl, right_ctrl; + + MAKE_LINE(left_trace, prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]], + prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_rear_tire[TIRE_OUTSIDE]]); + MAKE_LINE(right_trace, prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_front_tire[TIRE_OUTSIDE]], + prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_rear_tire[TIRE_OUTSIDE]]); + + MAKE_LINE(left_ctrl, prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[1], prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[0]); + MAKE_LINE(right_ctrl, prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[6], prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[7]); + + + if (IntersectionOf(left_trace, left_ctrl) == GM_Intersection && + IntersectionOf(right_trace, left_ctrl) == GM_Intersection && + IntersectionOfLine(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]], left_ctrl) == RELATION_LEFT) { + return LEFT_CTRL_LINE; } - // 杩囧乏鎺у埗绾� - if ((IntersectionOfLine(map->point[1], map->point[0], car->carXY[car->left_front_tire[TIRE_OUTSIDE]]) == 1) && - (IntersectionOfLine(map->point[1], map->point[0], car->carXY[car->right_front_tire[TIRE_OUTSIDE]]) == 1) && - (IntersectionOfLine(map->point[1], map->point[0], car->carXY[car->axial[AXIAL_REAR]]) == -1)) { - return 'L'; + if (IntersectionOf(left_trace, right_ctrl) == GM_Intersection && + IntersectionOf(right_trace, right_ctrl) == GM_Intersection && + IntersectionOfLine(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]], right_ctrl) == RELATION_RIGHT) { + return RIGHT_CTRL_LINE; } - return 0; + return NONE_CTRL_LINE; } -static bool EnterParking(const Polygon *map, const car_model *car) { +// 闇�瑕佸簱鍏ュ彛绾垮璁$畻鍦ㄥ唴 +static bool EnterParking(prime_t &prime) { bool succ = false; - Polygon parking; + Polygon park_area; Polygon car_body; - car_body.num = car->bodyNum; - car_body.point = (PointF *) malloc(sizeof(PointF) * car_body.num); + car_body.num = prime.pModel->body.size(); + car_body.point = new PointF[car_body.num]; for (int i = 0; i < car_body.num; ++i) { - car_body.point[i] = car->carXY[car->body[i]]; + car_body.point[i] = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->body[i]]; } - MakePolygon(&parking, {map->point[2], map->point[3], map->point[4], map->point[5]}); + PointF p8 = PointExtend(prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[2], + prime.pMap->park_button_map[prime.curr_exam_map.map_idx].line_width, + YawOf(prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[2], prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[3])); - if (IntersectionOf(&car_body, &parking) == GM_Containment) { + PointF p9 = PointExtend(prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[5], + prime.pMap->park_button_map[prime.curr_exam_map.map_idx].line_width, + YawOf(prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[5], prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[4])); + + MakePolygon(&park_area, {p8, prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[3], prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[4], p9}); + + if (IntersectionOf(&car_body, &park_area) == GM_Containment) { succ = true; } - CleanPolygon(&parking); + CleanPolygon(&park_area); free(car_body.point); DEBUG("妫�鏌ュ�掑簱鐘舵�� %s", succ ? "鎴愬姛" : "澶辫触"); @@ -423,84 +345,41 @@ return succ; } -static bool CrashRedLine(const Polygon *map, const car_model *car, int &who) +// 4涓溅杞拰杞﹀ご鐐逛笉鍦ㄥ満鍦颁腑 +bool ExitParkArea(prime_t &prime) { - bool ret = false; + Polygon polygon; - Line red_line; - const int red_lines[][2] = {{0, 7}, {1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 6}}; - - Polygon car_body; - - car_body.num = car->bodyNum; - car_body.point = (PointF *) malloc(sizeof(PointF) * car_body.num); - for (int i = 0; i < car_body.num; ++i) { - car_body.point[i] = car->carXY[car->body[i]]; + polygon.num = prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map.size(); + polygon.point = new PointF[polygon.num]; + for (int i = 0; i < polygon.num; ++i) { + polygon.point[i] = prime.pMap->park_button_map[prime.curr_exam_map.map_idx].map[i]; } - for (int i = 0; i < sizeof(red_lines) / sizeof(red_lines[0]); ++i) { - MakeLine(&red_line, &(map->point[red_lines[i][0]]), &(map->point[red_lines[i][1]])); - if (IntersectionOf(red_line, &car_body) != GM_None) { - if (i == 2 || i == 1) { - who = 1; - } else if (i == 4 || i == 5) { - who = 2; - } + int num = 0; - ret = true; - break; - } + if (IntersectionOf(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]], + &polygon) == GM_None) { + num++; + } + if (IntersectionOf(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_front_tire[TIRE_OUTSIDE]], + &polygon) == GM_None) { + num++; + } + if (IntersectionOf(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_rear_tire[TIRE_OUTSIDE]], + &polygon) == GM_None) { + num++; + } + if (IntersectionOf(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_rear_tire[TIRE_OUTSIDE]], + &polygon) == GM_None) { + num++; + } + if (IntersectionOf(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->body[prime.pModel->axial[AXIAL_FRONT]]], + &polygon) == GM_None) { + num++; } - free(car_body.point); - return ret; -} + delete []polygon.point; -static bool ExitParkArea(const Polygon *map, const car_model *car) -{ -// 鍏ㄨ溅閮介渶涓嶅湪鍦板浘涓� - bool ret = false; - - 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, map) == GM_None) { - ret = true; - } - - free(carBody.point); - - return ret; -} - -// 鍙屽墠杞拰鍙屽悗杞笉鍦ㄥ尯鍩� -static bool AllTireExitParkArea(const Polygon *map, const car_model *car) -{ - int tireExitNum = 0; - - if (IntersectionOf(car->carXY[ car->left_front_tire[TIRE_OUTSIDE] ], map) == GM_None) { - tireExitNum++; - } - - if (IntersectionOf(car->carXY[ car->right_front_tire[TIRE_OUTSIDE] ], map) == GM_None) { - tireExitNum++; - } - - if (IntersectionOf(car->carXY[ car->left_rear_tire[TIRE_OUTSIDE] ], map) == GM_None) { - tireExitNum++; - } - - if (IntersectionOf(car->carXY[ car->right_rear_tire[TIRE_OUTSIDE] ], map) == GM_None) { - tireExitNum++; - } - - if (tireExitNum >= 4) { - return true; - } - return false; + return num == 5? true : false; } -- Gitblit v1.8.0