From 27fc91fbe8f88b6885356e68828cfe1ce1db7601 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期三, 28 二月 2024 09:53:13 +0800
Subject: [PATCH] 坐标

---
 lib/src/main/cpp/test_items/park_edge.cpp |  519 +++++++++++++++------------------------------------------
 1 files changed, 135 insertions(+), 384 deletions(-)

diff --git a/lib/src/main/cpp/test_items/park_edge.cpp b/lib/src/main/cpp/test_items/park_edge.cpp
index 9ac9060..9c2a5c6 100644
--- a/lib/src/main/cpp/test_items/park_edge.cpp
+++ b/lib/src/main/cpp/test_items/park_edge.cpp
@@ -6,7 +6,7 @@
 //                  |                         |
 //                  |                         |
 //                  |                         |
-//  ________________|                         |___________1
+//  ________________|9                       8|___________1
 //  6               5                         2
 //
 //
@@ -27,425 +27,176 @@
 
 #include <vector>
 #include <cstdlib>
+#include <tuple>
 
 #define DEBUG(fmt, args...)     LOGD("<park_edge> <%s>: " fmt, __func__, ##args)
 
 using namespace std;
 
-enum {
-    TESTING,
-    TEST_FAIL,          // 鍥犺Е鍙戞煇浜涜鍒欙紝鍦ㄨ溅韬湭瀹屽叏绔嬪満鎯呭喌涓嬶紝鎻愬墠缁堟閮ㄥ垎娴嬭瘯
-    TEST_FINISH
-};
+static bool overpass_parkingspace;
+static bool check_parking_space;
 
 const uint32_t CHECK_PARK_DELAY = 400;
 
-static bool reportExamTimeout;
-static bool reportParkFail;
+static bool occurCrashRedLine;
+static bool firstMoveBack, checkLight;
 
-static uint32_t stopTimepoint = 0;
-static bool occurCrashRedLine1, occurCrashRedLine2, occurCrashRedLine3;
-static int prevMoveStatus, storeMoveStatusBeforeStop;
-static int parkStatus;
-static int gearAtStop;
-static bool occurMoveBack, checkPark, parkSuccess, checkLight;
-static uint32_t moveBackTimePoint;
-static int testStatus;
-static int exitAreaCfm;
-static int currGear;
-static double odo;
+static void ParkTimeout(apptimer_var_t val);
+static bool CrashRedLine(prime_t &prime);
+static bool CheckParkspace(prime_t &prime);
+static bool OverpassParkspace(prime_t &prime);
+static void MotionChange(move_status_t mv);
 
-static bool CrashRedLine1(const Polygon *map, const car_model_t *car);
-static bool CrashRedLine2(const Polygon *map, const car_model_t *car);
-static bool CrashRedLine3(const Polygon *map, const car_model_t *car);
-static bool EnterParking(const Polygon *map, const car_model_t *car);
-static bool ExitParkArea(const Polygon *map, const car_model_t *car);
-static bool ExitParkArea2(const Polygon *map, const car_model_t *car);
+enum {
+    PE_PREPARE_PARK,
+    PE_PARKING,
+    PE_EXIT
+};
 
 void StartParkEdge(prime_t &prime)
 {
     DEBUG("杩涘叆渚ф柟鍋滆溅鍦哄湴");
 
-    testStatus = TESTING;
-
-    occurCrashRedLine1 = occurCrashRedLine2 = occurCrashRedLine3 = false;        // 杩欎釜绉戠洰瑙勫畾鐗规畩鐐癸紝鍙戠敓涓�娆℃墸10鍒嗭紝鑰屼笉鐩存帴娣樻卑
-    reportExamTimeout = false;
-    reportParkFail = false;
-    prevMoveStatus = prime.pMotion->move;
-    parkSuccess = false;
-    parkStatus = 0;
-    occurMoveBack = false;
-    checkPark = false;
+    occurCrashRedLine = false;        // 杩欎釜绉戠洰瑙勫畾鐗规畩鐐癸紝鍙戠敓涓�娆℃墸10鍒嗭紝鑰屼笉鐩存帴娣樻卑
+    firstMoveBack = false;
     checkLight = false;
-    gearAtStop = -1;
-    stopTimepoint = 0;
-    odo = ReadOdo();
-    currGear = ReadCarStatus(GEAR);
-    exitAreaCfm = 0;
-
+    check_parking_space = false;
+    prime.examing_area.stage = PE_PREPARE_PARK;
     PlayTTS("鎮ㄥ凡杩涘叆渚ф柟鍋滆溅鍖哄煙", NULL);
-    // 浠呭綋鍙戠敓鍊掕溅锛屾墠鎰忓懗鐫�椤圭洰寮�濮�
-    /*if (moveStatus == -1) {
-        occurMoveBack = true;
-        moveBackTimePoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
-    }*/
 }
 
-int TestParkEdge(prime_t &prime)
+void StopParkEdge(prime_t &prime)
 {
-    vector<double> dtox;
-    vector<Line> line_set;
-    Line distance_line;
+    if (prime.examing_area.type != MAP_TYPE_PARK_EDGE)
+        return;
+    DEBUG("绂诲紑渚ф柟鍋滆溅鍦哄湴");
 
-    bool gear_change = false;
-    int gear = ReadCarStatus(GEAR);
-
-    if (gear == GEAR_R) {
-        if (currGear != GEAR_R) {
-            gear_change = true;
-            currGear = GEAR_R;
-        }
-    } else if (currGear == GEAR_R) {
-        gear_change = true;
-        currGear = gear;
+    if (!check_parking_space) {
+        DEBUG("鐩存帴椹剁娴嬭瘯鍖�,涓嶆寜鑰冭瘯鍛樻寚浠ら┚椹�");
+        AddExamFault(10103);
     }
+    prime.examing_area.type = MAP_TYPE_NONE;
 
-    if (gear_change) {
-        // 妫�鏌ヤ笂涓�娆℃尅浣嶇殑琛岄┒璺濈锛岃繃灏忓氨鏀惧純锛岄伩寮�瀛﹀憳鍘熷湴鎸傛尅閲嶈瘯
-        double run_distance = ReadOdo() - odo;
-
-        DEBUG("2娆℃尅浣嶈繍琛岃窛绂� %f", run_distance);
-
-        if (run_distance < 1) {
-            gear_change = false;
-            DEBUG("2娆℃尅浣嶈繍琛岃窛绂昏繃灏忥紝蹇界暐");
-        }
-        odo = ReadOdo();
-    }
-
-    // 棣栨鎸傚�掓尅锛� 鎵嶆剰鍛崇潃椤圭洰寮�濮�
-    if (testStatus == TESTING && gear_change) {
-        if (currGear == GEAR_R) {
-            if (!occurMoveBack) {
-                DEBUG("棣栨渚ф柟鍋滆溅");
-            } else {
-                DEBUG("鍐嶆渚ф柟鍋滆溅");
-            }
-
-            {
-                checkPark = false;
-                occurMoveBack = true;
-                moveBackTimePoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss,
-                                                      rtkTime->mss * 10);      // 寮�濮嬭鏃�
-                MA_EnterMap(mapIndex, MAP_TYPE_PARK_EDGE, 1);
-            }
-        } else {
-            if (occurMoveBack && !checkPark) {
-                // 妫�鏌ヨ溅韬叆搴撴儏鍐�
-                DEBUG("妫�鏌ヨ溅韬叆搴撴儏鍐�");
-                checkPark = true;
-                checkLight = false;
-                if (EnterParking(map, car)) {
-                    parkStatus = 1;
-                    parkSuccess = true;
-                } else {
-                    // 鍋滄鍚庯紝杞﹁韩鍑虹嚎锛屼笉鍚堟牸
-                    AddExamFault(20401, rtkTime);
-                    parkSuccess = false;
-                    DEBUG("绉诲簱涓嶅叆");
-                }
-            }
-        }
-    }
-
-    if (CrashRedLine1(map, car)) {
-        if (!occurCrashRedLine1 /*&& occurMoveBack*/) {
-            // 杞﹁疆鍘嬭竟绾匡紝姣忔鎵�10鍒�
-            AddExamFault(20403, rtkTime);
-            DEBUG("杞﹁疆鍘嬭竟绾�");
-            occurCrashRedLine1 = true;
-        }
-    } else {
-        occurCrashRedLine1 = false;
-    }
-
-    if (CrashRedLine2(map, car)) {
-        if (!occurCrashRedLine2 /*&& occurMoveBack*/) {
-            // 杞﹁韩鍘嬪簱浣嶇嚎锛屾瘡娆℃墸10鍒�
-            AddExamFault(20404, rtkTime);
-            DEBUG("杞﹁韩鍘嬪簱浣嶇嚎");
-            occurCrashRedLine2 = true;
-        }
-    } else {
-        occurCrashRedLine2 = false;
-    }
-
-    if (CrashRedLine3(map, car)) {
-        if (!occurCrashRedLine3 && !occurMoveBack && moveStatus == 1) {
-            // 杞﹁韩鍘嬪簱浣嶇嚎锛屾瘡娆℃墸10鍒�
-            AddExamFault(20407, rtkTime);
-            DEBUG("杞﹁韩鍘嬪簱浣嶇嚎");
-            occurCrashRedLine3 = true;
-        }
-    } else {
-        occurCrashRedLine3 = false;
-    }
-
-    if (ExitParkArea2(map, car)) {
-        /*if (!parkSuccess && occurMoveBack && !reportParkFail) {
-            // 鐩存帴椹剁娴嬭瘯鍖猴紝璁や负绉诲簱涓嶅叆
-            AddExamFault(10103, rtkTime);
-            reportParkFail = true;
-            DEBUG("鐩存帴椹剁娴嬭瘯鍖�,涓嶆寜鑰冭瘯鍛樻寚浠ら┚椹�");
-        }*/
-        if (occurMoveBack && !checkPark) {
-            // 鍊掕溅鐩存帴椹剁娴嬭瘯鍖�
-            AddExamFault(10103, rtkTime);
-            DEBUG("鐩存帴椹剁娴嬭瘯鍖�,涓嶆寜鑰冭瘯鍛樻寚浠ら┚椹�");
-        }
-
-        testStatus = TEST_FINISH;
-        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 (testStatus == TESTING && !occurMoveBack && ExitParkArea(map, car)) {
-        // 鍏ュ簱鍚庝竴鐩村墠杩涳紝杞﹀ご绉诲嚭椹剁绾�
-        if (++exitAreaCfm >= 4) {       // 閬垮厤淇″彿婕傜Щ閫犳垚鐨勮鍒�
-            AddExamFault(10103, rtkTime);
-            DEBUG("鐩存帴椹剁娴嬭瘯鍖�,涓嶆寜鑰冭瘯鍛樻寚浠ら┚椹�");
-            testStatus = TEST_FAIL;
-        }
-    } else {
-        exitAreaCfm = 0;
-    }
-
-    if (occurMoveBack) {
-        uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
-
-        if (!reportExamTimeout && tp - moveBackTimePoint >= examParam.park_edge_limit_time) {
-            // 瓒呮椂90绉掞紝涓嶅悎鏍�
-            AddExamFault(20402, rtkTime);
-            reportExamTimeout = true;
-            DEBUG("绉诲簱90绉掕秴鏃�");
-        }
-    }
-
-    if (moveStatus != prevMoveStatus) {
-        if (moveStatus == 0) {
-            parkStatus = 0;
-            stopTimepoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
-            storeMoveStatusBeforeStop = prevMoveStatus;
-            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("鍋滆溅鏃舵尅浣� = %d", gearAtStop);
-        } else if (prevMoveStatus == 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);
-            uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
-
-            DEBUG("鍋滆溅鏃堕棿 %ld", tp - stopTimepoint);
-            DEBUG("鍐嶆绉诲姩鏃舵尅浣� = %d", currGear == GEAR_R ? 1 : 0);
-
-            if (tp - stopTimepoint >= CorrectPauseCriteria(examParam.park_edge_pause_criteria)
-            && occurMoveBack
-            && gearAtStop == (currGear == GEAR_R ? 1 : 0)) {
-                // 鍋滆溅瓒�2绉掞紝姣忔鎵�5鍒�
-                AddExamFault(20406, rtkTime);
-                DEBUG("鍋滆溅瓒呮椂");
-            }
-
-            if (moveStatus == 1 && checkPark && !checkLight) {
-                // 鍦ㄨ繖閲屾鏌ヨ浆鍚戠伅鐘舵��
-                checkLight = true;
-                if (ReadCarStatus(TURN_SIGNAL_LAMP) != LEFT_TURN_LIGHT) {
-                    // 涓嶅紑杞悜鐏紝鎵�10鍒�
-                    AddExamFault(20405, rtkTime);
-                    DEBUG("鏈紑鍚浆鍚戠伅");
-                }
-            }
-
-            /*if (moveStatus == storeMoveStatusBeforeStop) {
-                // 鍚屾柟鍚戝啀鍚姩锛岀户缁垽鏂槸鍚﹀仠杞﹁秴鏃�
-                if (tp - stopTimepoint >= CorrectPauseCriteria(examParam.park_edge_pause_criteria) && occurMoveBack) {
-                    // 鍋滆溅瓒�2绉掞紝姣忔鎵�5鍒�
-                    AddExamFault(20406, rtkTime);
-                    DEBUG("鍋滆溅瓒呮椂");
-                }
-            } else {
-                // 鍊掕溅鍒囨崲鍒板墠杩�
-                if (moveStatus == 1 && tp - stopTimepoint >= CHECK_PARK_DELAY) {
-                    if (parkStatus == 0) {
-                        if (EnterParking(map, car)) {
-                            parkStatus = 1;
-                            parkSuccess = true;
-                        }
-                    }
-
-                    if (!parkSuccess && !reportParkFail) {
-                        // 鍋滄鍚庯紝杞﹁韩鍑虹嚎锛屼笉鍚堟牸
-                        AddExamFault(20401, rtkTime);
-                        reportParkFail = true;
-                        DEBUG("绉诲簱涓嶅叆");
-                    }
-
-                    // 鍦ㄨ繖閲屾鏌ヨ浆鍚戠伅鐘舵��
-                    if (ReadCarStatus(TURN_SIGNAL_LAMP) != LEFT_TURN_LIGHT) {
-                        // 涓嶅紑杞悜鐏紝鎵�10鍒�
-                        AddExamFault(20405, rtkTime);
-                        DEBUG("鏈紑鍚浆鍚戠伅");
-                    }
-                }
-            }*/
-
-           /* if (moveStatus == -1 && !occurMoveBack) {
-                DEBUG("寮�濮嬪�掕溅");
-                occurMoveBack = true;
-                moveBackTimePoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
-                MA_EnterMap(mapIndex, MAP_TYPE_PARK_EDGE, 1);
-            }*/
-        }
-
-        prevMoveStatus = moveStatus;
-    } /*else if (moveStatus == 0 && parkStatus == 0) {
-        uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
-
-        if (tp - stopTimepoint >= CHECK_PARK_DELAY) {
-            if (EnterParking(map, car)) {
-                parkStatus = 1;
-                parkSuccess = true;
-            } else {
-                parkStatus = -1;
-            }
-        }
-    }*/
-
-TEST_END:
-    if (testStatus == TEST_FINISH) {
-        DEBUG("渚ф柟鍋滆溅缁撴潫");
-        MA_EnterMap(mapIndex, MAP_TYPE_PARK_EDGE, 0);
-        return 0;
-    }
-    return 1;
+    AppTimer_delete(ParkTimeout);
 }
 
-int EnterParkEdge(prime_t &prime) {
-    if (prime.prev_modeling_index == -1 || prime.curr_modeling_index == -1) {
-        return -1;
-    }
-
-    PointF &lp1 = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]];
-    PointF &lp2 = prime.pModeling[prime.prev_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]];
-    PointF &rp1 = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_front_tire[TIRE_OUTSIDE]];
-    PointF &rp2 = prime.pModeling[prime.prev_modeling_index].points[prime.pModel->right_front_tire[TIRE_OUTSIDE]];
-
-    Line left_trace, right_trace;
-
-    MAKE_LINE(left_trace, lp1, lp2);
-    MAKE_LINE(right_trace, rp1, rp2);
-
-    // 涓嶅悓鍦板尯宸﹀彸鍊掑簱娆″簭鍙兘涓嶅悓锛屾墍浠ヤ袱涓柟鍚戦兘鍙互杩涘叆
-    for (int i = 0; i < prime.pMap->park_button_map.size(); ++i) {
-        Line left_entrance_line;
-
-        MAKE_LINE(left_entrance_line, prime.pMap->park_button_map[i].map[1], prime.pMap->park_button_map[i].map[0]);
-
-        if (IntersectionOf(left_trace, left_entrance_line) == GM_Intersection
-            && IntersectionOfLine(lp1, left_entrance_line) == RELATION_RIGHT) {
-            return i;
-        }
-    }
-    return -1;
-}
-
-// 杞﹁疆鏄惁鍘嬮亾璺竟绾�
-static bool CrashRedLine1(const Polygon *map, const car_model_t *car)
+static void ParkTimeout(apptimer_var_t val)
 {
-    bool ret = false;
+    // 瓒呮椂90绉掞紝涓嶅悎鏍�
+    DEBUG("绉诲簱90绉掕秴鏃�");
+    AddExamFault(20402);
+}
 
-    Line red_line;
-    const int red_lines[][2] = {{0, 7}, {1, 2}, {5, 6}};
+void TestParkEdge(prime_t &prime)
+{
+    if (prime.examing_area.type != MAP_TYPE_PARK_EDGE)
+        return;
+    // 妫�娴嬪悗杞槸鍚﹂┒杩囧簱浣嶅墠娈�
+    if (!overpass_parkingspace) {
+        overpass_parkingspace = OverpassParkspace(prime);
+    }
+
+    if (prime.pMotion->move == BACKWARD && prime.sensor.gear == GEAR_R) {
+        if (!firstMoveBack) {
+            // 寮�濮嬫寕鍊掓尅鍊掕溅
+            firstMoveBack = true;
+            if (!overpass_parkingspace) {
+                DEBUG("鍚庤疆娌℃湁寮�杩囧簱浣嶇嚎灏卞紑濮嬪�掕溅");
+                AddExamFault(10103);
+            }
+            prime.examing_area.stage = PE_PARKING;
+            AppTimer_delete(ParkTimeout);
+            AppTimer_add(ParkTimeout, prime.examParam.park_edge_limit_time);
+        }
+    }
+
+    //浠庡�掕溅鐘舵�侊紝鐪嬫槸鍚︿粠鍊掓尅閫�鍑�(濡傛灉鍙槸鐪嬪仠杞︾姸鎬侊紝鏃犳硶鍜屼腑閫斿仠杞︽湁鏁堝尯鍒�)
+    if (firstMoveBack && prime.sensor.gear != GEAR_R) {
+        if (!check_parking_space) {
+            check_parking_space = true;
+            if (!CheckParkspace(prime)) {
+                // 鍋滄鍚庯紝杞﹁韩鍑虹嚎锛屼笉鍚堟牸
+                DEBUG("杞﹁韩鍑虹嚎");
+                AddExamFault(20401);
+            }
+            prime.examing_area.stage = PE_EXIT;
+        }
+    }
+
+    // 妫�娴嬪乏杞悜鐏�
+    if (check_parking_space && prime.pMotion->move == FORWARD && !checkLight) {
+        checkLight = true;
+        if (prime.sensor.turn_signal_lamp != LEFT_TURN_LIGHT) {
+            // 涓嶅紑杞悜鐏紝鎵�10鍒�
+            DEBUG("鏈紑鍚浆鍚戠伅");
+            AddExamFault(20405);
+        }
+    }
+
+    if (CrashRedLine(prime)) {
+        if (!occurCrashRedLine) {
+            // 杞﹁韩鍘嬪簱浣嶇嚎锛屾瘡娆℃墸10鍒�
+            DEBUG("杞﹁韩鍘嬪簱浣嶇嚎");
+            AddExamFault(20404);
+            occurCrashRedLine = true;
+        }
+    } else {
+        occurCrashRedLine = false;
+    }
+}
+
+// 杞﹁疆鎴栬溅韬槸鍚﹀帇閬撹矾杈圭嚎
+static bool CrashRedLine(prime_t &prime)
+{
+    const int red_lines[][2] = {{0, 7}, {1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 6}};
 
     Line frontAxle, rearAxle;
 
-    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]]);
+    MAKE_LINE(frontAxle, prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]], prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_front_tire[TIRE_OUTSIDE]]);
+    MAKE_LINE(rearAxle, prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_rear_tire[TIRE_OUTSIDE]], prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_rear_tire[TIRE_OUTSIDE]]);
 
-    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, frontAxle) == GM_Intersection ||
-            IntersectionOf(red_line, rearAxle) == GM_Intersection) {
-            ret = true;
-            break;
-        }
-    }
-
-    return ret;
-}
-
-// 杞﹁韩鏄惁鍘嬪簱浣嶇嚎
-static bool CrashRedLine2(const Polygon *map, const car_model_t *car)
-{
-    bool ret = false;
-
-    Line red_line;
-    const int red_lines[][2] = {{0, 7}, {2, 3}, {3, 4}, {4, 5}};
-
-    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]];
+    MakePolygon body(prime.pModel->body.size());
+    for (int i = 0; i < prime.pModel->body.size(); ++i) {
+        body.AddPoint(prime.pModeling->points[prime.pModel->body[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) {
-            ret = true;
-            break;
-        }
-    }
-
-    free(car_body.point);
-    return ret;
-}
-
-static bool CrashRedLine3(const Polygon *map, const car_model_t *car) {
-    bool ret = false;
-
-    if (!occurMoveBack) {
-        // 鍊掕溅鍓嶏紝杞﹁韩涓嶅緱鍘嬪簱浣嶈櫄绾�
-        Polygon car_body;
         Line red_line;
-
-        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]];
+        MAKE_LINE(red_line, std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[prime.examing_area.idx].points[red_lines[i][0]], std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[prime.examing_area.idx].points[red_lines[i][1]]);
+        if (IntersectionOf(red_line, frontAxle) == GM_Intersection
+            || IntersectionOf(red_line, rearAxle) == GM_Intersection
+            || IntersectionOf(red_line, body.GetPolygon()) != GM_None) {
+            return true;
         }
-
-        MakeLine(&red_line, &map->point[2], &map->point[5]);
-        if (IntersectionOf(red_line, &car_body) != GM_None) {
-            ret = true;
-        }
-
-        free(car_body.point);
     }
 
-    return ret;
+    return false;
+}
+
+static bool CheckParkspace(prime_t &prime) {
+    DEBUG("妫�鏌ュ仠杞﹀埌浣�...");
+
+    MakePolygon area({std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[prime.examing_area.idx].points[8],
+                      std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[prime.examing_area.idx].points[3],
+                      std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[prime.examing_area.idx].points[4],
+                      std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[prime.examing_area.idx].points[9]});
+    MakePolygon car_body(prime.pModel->body.size());
+    for (int i = 0; i < prime.pModel->body.size(); ++i) {
+        car_body.AddPoint(prime.pModeling->points[prime.pModel->body[i]]);
+    }
+
+    return (IntersectionOf(car_body.GetPolygon(), area.GetPolygon()) == GM_Containment)? true : false;
+}
+
+static bool OverpassParkspace(prime_t &prime)
+{
+    Line parkspace_top;
+
+    MAKE_LINE(parkspace_top, std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[prime.examing_area.idx].points[4], std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[prime.examing_area.idx].points[5]);
+
+    if (IntersectionOfLine(prime.pModeling->points[prime.pModel->left_rear_tire[TIRE_OUTSIDE]], parkspace_top) == REL_POS_RIGHT
+        && IntersectionOfLine(prime.pModeling->points[prime.pModel->left_rear_tire[TIRE_OUTSIDE]], parkspace_top) == REL_POS_RIGHT) {
+        return true;
+    }
+    return false;
 }

--
Gitblit v1.8.0