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_bottom.cpp |  423 +++++++++++++++++++---------------------------------
 1 files changed, 159 insertions(+), 264 deletions(-)

diff --git a/lib/src/main/cpp/test_items/park_bottom.cpp b/lib/src/main/cpp/test_items/park_bottom.cpp
index 421ecf5..3424f6e 100644
--- a/lib/src/main/cpp/test_items/park_bottom.cpp
+++ b/lib/src/main/cpp/test_items/park_bottom.cpp
@@ -24,27 +24,15 @@
 #include "area_exam.h"
 #include "../test_common/car_sensor.h"
 #include "../test_common/odo_graph.h"
+#include "../teach/train.h"
+#include "../teach/teach.h"
 #include <vector>
 #include <cstdlib>
+#include <tuple>
 
 #define DEBUG(fmt, args...)     LOGD("<park_bottom> <%s>: " fmt, __func__, ##args)
 
 using namespace std;
-
-enum {
-    NONE,
-    FIRST_TOUCH_CTRL_LINE,
-    FIRST_PARK,
-    SECOND_TOUCH_CTRL_LINE,
-    SECOND_PARK,
-    THIRD_TOUCH_CTRL_LINE
-};
-
-enum {
-    TESTING,
-    TEST_FAIL,          // 鍥犺Е鍙戞煇浜涜鍒欙紝鍦ㄨ溅韬湭瀹屽叏绔嬪満鎯呭喌涓嬶紝鎻愬墠缁堟閮ㄥ垎娴嬭瘯
-    TEST_FINISH
-};
 
 typedef enum {
     NONE_CTRL_LINE,
@@ -52,151 +40,157 @@
     RIGHT_CTRL_LINE
 } ctrl_line_t;
 
-static bool reverseCar = false;
-
-const uint32_t CHECK_PARK_DELAY = 400;
-
-static uint32_t stopTimepoint;
-static int prevMoveDirect;
 static bool occurCrashRedLine;
-
-static uint32_t firstReverseTimepoint;
-
 static int parkCount;
-static char carray[3];
-static int darray[3];
-static int parkStatus[3];
-
-static int gearAtStop;
-static int currGear;
+static int reverseCnt = 0;
+static bool stopFlag;
 static ctrl_line_t prevCrossedCtrlLine;
-static double odo;
 
+static bool checkCtrlLine, checkParkspace;
+static int handleGearOb, handleMoveOb;
+
+static bool BodyCollidingLine(prime_t &prime);
 static ctrl_line_t CrossCtrlLine(prime_t &prime);
-static bool EnterParking(prime_t &prime);
-static bool CrashRedLine(prime_t &prime);
+static bool CheckParkspace(prime_t &prime);
+static void MoveOb(move_status_t curr, move_status_t prev, double distance);
+static void GearOb(int gear, int prevGear, double move_distance);
 
+enum {
+    PREPARE_REVERSE,
+    REVERSE_LEFT,
+    REVERSE_RIGHT,
+    OBVERSE_LEFT,
+    OBVERSE_RIGHT
+};
+
+/*
+1. 杩涘叆 --- 棣栨鍊掑簱鍓�
+2. 鍊掑簱 ---- 鍋滆溅鍒颁綅鍓嶏紙鍙冲�掑簱锛�
+3. 宸﹀嚭搴�
+4. 鍊掑簱 ---- 鍋滆溅鍒颁綅鍓嶏紙宸﹀�掑簱锛�
+5. 鍙冲嚭搴�(绂诲紑鍦哄湴)
+*/
 
 void StartParkBottom(prime_t &prime)
 {
-    DEBUG("StartParkBottom");
-
-    reverseCar = false;
-    memset(carray, 0, sizeof(carray));
-    memset(darray, 0, sizeof(darray));
-    memset(parkStatus, 0, sizeof(parkStatus));
-    prevMoveDirect = prime.pMotion->move;
-
-    firstReverseTimepoint = 0;
-
+    DEBUG("杩涘叆鍊掑簱鍦哄湴");
+    stopFlag = false;
     parkCount = 0;
-
+    reverseCnt = 0;
+    checkCtrlLine = false;
+    checkParkspace = false;
     occurCrashRedLine = false;
-
-    currGear = ReadCarStatus(GEAR);
+    prime.examing_area.stage = PREPARE_REVERSE;
+    testAll();
+    LoadStageTips(prime);
     prevCrossedCtrlLine = NONE_CTRL_LINE;
-    stopTimepoint = 0;
-
-    odo = ReadOdo();
-
+    handleGearOb = RegisterShiftObserver(GearOb);
+    handleMoveOb = RegisterCarMoveObserver(MoveOb);
     PlayTTS("鎮ㄥ凡杩涘叆鍊掕溅鍏ュ簱鍖哄煙", NULL);
+}
+
+static void ParkTimeout(apptimer_var_t var)
+{
+    DEBUG("椤圭洰瓒呮椂");
+    AddExamFault(20105);
+}
+
+static void MoveOb(move_status_t curr, move_status_t prev, double distance)
+{
+    // 杞﹁締鐢辫繍鍔ㄥ埌鍋滄锛岃褰曚竴涓嬶紝褰撴崲鎸″彂鐢熸椂锛岄伩鍏嶅師鍦版潵鍥炴崲鎸¢�犳垚璇垽
+    if (curr == STOP && distance > 0.5) {
+        stopFlag = true;
+    }
+}
+
+static void GearOb(int gear, int prevGear, double move_distance)
+{
+    DEBUG("GearOb %d %f", gear, move_distance);
+
+    if (gear == GEAR_R && stopFlag) {   // 绉诲叆鍊掓尅
+        stopFlag = false;
+        reverseCnt++;
+        if (reverseCnt == 1) {
+            AppTimer_delete(ParkTimeout);
+            AppTimer_add(ParkTimeout, GetPrime().examParam.park_bottom_limit_time);
+        }
+        checkCtrlLine = true;
+    } else if (prevGear == GEAR_R && stopFlag) {    // 浠庡�掓尅绉诲嚭
+        stopFlag = false;
+        checkParkspace = true;
+    }
+}
+
+void StopParkBottom(prime_t &prime)
+{
+    if (prime.examing_area.type != MAP_TYPE_PARK_BUTTOM)
+        return;
+
+    DEBUG("绂诲紑鍊掑簱鍦哄湴");
+
+    if (parkCount < 2) {
+        DEBUG("鐩存帴椹剁娴嬭瘯鍖�,涓嶆寜鑰冭瘯鍛樻寚浠ら┚椹�");
+        AddExamFault(10103);
+    }
+    AppTimer_delete(ParkTimeout);
+    prime.examing_area.type = MAP_TYPE_NONE;
+    UnregisterShiftObserver(handleGearOb);
+    UnregisterCarMoveObserver(handleMoveOb);
 }
 
 void TestParkBottom(prime_t &prime)
 {
-    ctrl_line_t crossCtrlLine = NONE_CTRL_LINE;
-    uint32_t tp = AppTimer_GetTickCount();
+    if (prime.examing_area.type != MAP_TYPE_PARK_BUTTOM)
+        return;
 
-    vector<double> dtox;
-    vector<Line> line_set;
-    Line distance_line;
+    train(prime);
 
-    bool gear_change = false;
-    int gear = ReadCarStatus(GEAR);
+    if (checkCtrlLine) {
+        ctrl_line_t crossCtrlLine = CrossCtrlLine(prime);
 
-    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 (gear_change) {
-        // 妫�鏌ヤ笂涓�娆℃尅浣嶇殑琛岄┒璺濈锛岃繃灏忓氨鏀惧純锛岄伩寮�瀛﹀憳鍘熷湴鎸傛尅閲嶈瘯
-        double run_distance = ReadOdo() - odo;
-
-        DEBUG("2娆℃尅浣嶈繍琛岃窛绂� %f", run_distance);
-
-        if (run_distance < 1) {
-            gear_change = false;
-            DEBUG("2娆℃尅浣嶈繍琛岃窛绂昏繃灏忥紝蹇界暐");
-        }
-        odo = ReadOdo();
-    }
-
-    if (gear_change) {
-        if (currGear == GEAR_R) {
-            // 鎸傚�掓尅,妫�娴嬫槸鍚﹁繃鎺у埗绾�
-            DEBUG("寮�濮嬫寕鍊掓尅");
-            if (!reverseCar) {
-                DEBUG("寮�濮嬮杞叆搴�");
-                reverseCar = true;
-                MA_EnterMap(prime.pMap->park_button_map[prime.curr_exam_map.map_idx].id, MAP_TYPE_PARK_BUTTOM, 1);
-                firstReverseTimepoint = tp;             // 寮�濮�210绉掕鏃�
-            }
-            crossCtrlLine = CrossCtrlLine(prime);
-
-            if (parkCount >= 2) {
-                DEBUG("寮�濮嬫杞叆搴�");
-                parkCount = 0;
-                MA_EnterMap(prime.pMap->park_button_map[prime.curr_exam_map.map_idx].id, MAP_TYPE_PARK_BUTTOM, 1);
-                firstReverseTimepoint = tp;             // 寮�濮�210绉掕鏃�
-            }
-
-            if (crossCtrlLine == NONE_CTRL_LINE) {
-                // 鍊掕溅鍓嶏紝鍓嶈疆鏈┒杩囨帶鍒剁嚎
-                AddExamFault(20104);
-                DEBUG("鍊掕溅鍓嶏紝鍓嶈疆鏈┒杩囨帶鍒剁嚎");
-            } else if (crossCtrlLine == prevCrossedCtrlLine) {
-                // 閲嶅璺ㄨ秺鍚屼竴鎺у埗绾匡紝涓嶆寜瑙勫畾绾胯矾锛岄『搴忓舰寮忥紝涓嶅悎鏍�
-                AddExamFault(20101);
-                DEBUG("涓嶆寜瑙勫畾绾胯矾锛岄『搴忓舰寮忥紝 鍚� %c 渚�", prevCrossedCtrlLine);
-            } else {
-                prevCrossedCtrlLine = crossCtrlLine;
-                DEBUG("寮�濮� %c 渚� 鍊掑簱", prevCrossedCtrlLine);
-            }
+        if (crossCtrlLine == NONE_CTRL_LINE) {
+            // 鍊掕溅鍓嶏紝鍓嶈疆鏈┒杩囨帶鍒剁嚎
+            DEBUG("鍊掕溅鍓嶏紝鍓嶈疆鏈┒杩囨帶鍒剁嚎");
+            AddExamFault(20104);
+        } else if (crossCtrlLine == prevCrossedCtrlLine) {
+            // 閲嶅璺ㄨ秺鍚屼竴鎺у埗绾匡紝涓嶆寜瑙勫畾绾胯矾锛岄『搴忓舰寮忥紝涓嶅悎鏍�
+            AddExamFault(20101);
+            DEBUG("涓嶆寜瑙勫畾绾胯矾锛岄『搴忓舰寮忥紝 鍚� %d 渚�", prevCrossedCtrlLine);
         } else {
-            // 浠庡�掓尅绉诲嚭锛屾娴嬫槸鍚﹀叆搴�
-            DEBUG("浠庡�掓尅绉诲嚭");
-
-            parkCount++;
-
-            DEBUG("搴撲綅妫�鏌ユ鏁� = %d", parkCount);
-
-            if (EnterParking(prime)) {
-                DEBUG("鍊掑簱鎴愬姛");
-            } else {
-                AddExamFault(20103);
-                DEBUG("鍊掑簱涓嶅叆");
-            }
+            prevCrossedCtrlLine = crossCtrlLine;
+            DEBUG("寮�濮� %d 渚� 鍊掑簱", prevCrossedCtrlLine);
         }
+
+        if (DeltaYaw(YawOf(std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[3],
+                           std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[4]), prime.pModeling[prime.curr_modeling_index].yaw) < 90) {
+            DEBUG("鍙充晶鍊掑簱");
+            prime.examing_area.stage = REVERSE_RIGHT;
+        } else {
+            DEBUG("宸︿晶鍊掑簱");
+            prime.examing_area.stage = REVERSE_LEFT;
+        }
+        LoadStageTips(prime);
+        checkCtrlLine = false;
     }
 
-    if (ExitParkArea(prime)) {
-        // 绂诲紑鍦哄湴
-        DEBUG("绂诲紑鍦哄湴");
-        if (parkCount < 2) {
-            AddExamFault(10103);
-            DEBUG("鐩存帴椹剁娴嬭瘯鍖�,涓嶆寜鑰冭瘯鍛樻寚浠ら┚椹�");
+    if (checkParkspace) {
+        if (CheckParkspace(prime)) {
+            DEBUG("鍊掑簱鎴愬姛");
+        } else {
+            DEBUG("鍊掑簱涓嶅叆");
+            AddExamFault(20103);
         }
-        prime.curr_exam_map.type = 0;
-        goto TEST_END;
+        parkCount++;
+        if (prime.examing_area.stage == REVERSE_RIGHT) {
+            prime.examing_area.stage = OBVERSE_LEFT;       // 浠庡乏渚у�掑簱
+        } else {
+            prime.examing_area.stage = OBVERSE_RIGHT;      // 绂诲紑鍦哄湴
+        }
+        LoadStageTips(prime);
+        checkParkspace = false;
     }
 
-    if (BodyCollidingLine(prime) >= 0) {
+    if (BodyCollidingLine(prime)) {
         if (!occurCrashRedLine) {
             occurCrashRedLine = true;
             // 杞﹁韩鍑虹嚎锛屼笉鍚堟牸
@@ -207,76 +201,35 @@
         occurCrashRedLine = false;
     }
 
-    if (prime.pMotion->move != prevMoveDirect) {
-        if (prime.pMotion->move == STOP) {
-            stopTimepoint = tp;
-            gearAtStop = (currGear == GEAR_R ? 1 : 0);
-            DEBUG("鍋滆溅浜�");
-            DEBUG("鍋滆溅鏃舵尅浣� = %d", gearAtStop);
-        } else if (prevMoveDirect == STOP && stopTimepoint > 0) {
-            DEBUG("缁х画琛岄┒");
-
-            DEBUG("鍋滆溅鏃堕棿 %ld", tp - stopTimepoint);
-            DEBUG("鍐嶆绉诲姩鏃舵尅浣� = %d", currGear == GEAR_R ? 1 : 0);
-
-            if (tp - stopTimepoint >= CorrectPauseCriteria(examParam.park_bottom_pause_criteria)
-                && gearAtStop == (currGear == GEAR_R ? 1 : 0)) {
-                // 鍋滆溅瓒�2绉掞紝姣忔鎵�5鍒�
-                AddExamFault(20106);
-                DEBUG("涓�斿仠杞�");
-            }
-        }
-
-        prevMoveDirect = prime.pMotion->move;
-    }
-TEST_END:
-    DEBUG("鍊掑簱缁撴潫");
-    MA_EnterMap(prime.pMap->park_button_map[prime.curr_exam_map.map_idx].id, MAP_TYPE_PARK_BUTTOM, 0);
+    teach(prime);
 }
 
-static int BodyCollidingLine(prime_t &prime)
+// 杞﹁韩鎴栬溅杞殕涓嶅緱纰拌Е瀹炵嚎
+static bool BodyCollidingLine(prime_t &prime)
 {
-    vector<Line> lines;
+    MakePolygon car_body(prime.pModel->body.size());
 
-    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]];
+    for (int i = 0; i < prime.pModel->body.size(); ++i) {
+        car_body.AddPoint(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->body[i]]);
     }
 
-    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);
+    Line frontAxle, rearAxle;
 
-    int idx = 0;
+    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 (auto line: lines) {
-        if (IntersectionOf(line, &car_body) != GM_None) {
-            break;
+    const int red_lines[][2] = {{0, 7}, {1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 6}};
+
+    for (int i = 0; i < sizeof(red_lines) / sizeof(red_lines[0]); ++i) {
+        Line red_line;
+        MAKE_LINE(red_line, std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[red_lines[i][0]], std::get<MAP_TYPE_PARK_BUTTOM>(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, car_body.GetPolygon()) != GM_None) {
+            return true;
         }
-        idx++;
     }
-    delete []car_body.point;
-    return idx < lines.size()? idx : -1;
+    return false;
 }
 
 // 妫�娴�2鍓嶈疆鏄惁姝e悜瓒婅繃宸﹀彸鎺у埗绾�
@@ -291,95 +244,37 @@
     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]);
+    MAKE_LINE(left_ctrl, std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[1], std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[0]);
+    MAKE_LINE(right_ctrl, std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[6], std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[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) {
+            IntersectionOfLine(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]], left_ctrl) == REL_POS_LEFT) {
         return LEFT_CTRL_LINE;
     }
 
     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) {
+        IntersectionOfLine(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]], right_ctrl) == REL_POS_RIGHT) {
         return RIGHT_CTRL_LINE;
     }
 
     return NONE_CTRL_LINE;
 }
 
-// 闇�瑕佸簱鍏ュ彛绾垮璁$畻鍦ㄥ唴
-static bool EnterParking(prime_t &prime) {
-    bool succ = false;
+static bool CheckParkspace(prime_t &prime) {
+    MakePolygon car_body(prime.pModel->body.size());
 
-    Polygon park_area;
-    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]];
+    for (int i = 0; i < prime.pModel->body.size(); ++i) {
+        car_body.AddPoint(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->body[i]]);
     }
 
-    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]));
+    MakePolygon park_area({std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[8],
+                           std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[3],
+                           std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[4],
+                           std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[9]});
 
-    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(&park_area);
-    free(car_body.point);
-
-    DEBUG("妫�鏌ュ�掑簱鐘舵�� %s", succ ? "鎴愬姛" : "澶辫触");
-
-    return succ;
+    return (bool) (IntersectionOf(car_body.GetPolygon(), park_area.GetPolygon()) == GM_Containment);
 }
 
-// 4涓溅杞拰杞﹀ご鐐逛笉鍦ㄥ満鍦颁腑
-bool ExitParkArea(prime_t &prime)
-{
-    Polygon polygon;
-
-    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];
-    }
-
-    int num = 0;
-
-    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++;
-    }
-
-    delete []polygon.point;
-
-    return num == 5? true : false;
-}

--
Gitblit v1.8.0