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