From 148a951e0d44577997fd2790f889dcdd7dbd6889 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期五, 17 四月 2020 17:53:18 +0800
Subject: [PATCH] 坐标

---
 lib/src/main/cpp/test_items2/road_exam.cpp |  150 +++++++++++++++++++++++++++++++------------------
 1 files changed, 95 insertions(+), 55 deletions(-)

diff --git a/lib/src/main/cpp/test_items2/road_exam.cpp b/lib/src/main/cpp/test_items2/road_exam.cpp
index ee1456b..de97518 100644
--- a/lib/src/main/cpp/test_items2/road_exam.cpp
+++ b/lib/src/main/cpp/test_items2/road_exam.cpp
@@ -983,9 +983,30 @@
     }
     return -1;
 }
-#if 0
+
+#if 1
+
+typedef struct {
+    int road;
+    int segment;
+    int track;
+} CarOnTrackInfo_t;
+
+static CarOnTrackInfo_t CarOnTrackInfo;
+
 void TestRoadGeneral(struct road_exam2_map &map, const car_model *car, LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime)
 {
+    // 妫�娴嬭溅閬撳彉鏇�
+    CarOnTrackInfo_t newCarOnTrackInfo;
+
+    if (newCarOnTrackInfo.road == CarOnTrackInfo.road &&
+            newCarOnTrackInfo.segment == CarOnTrackInfo.segment &&
+            newCarOnTrackInfo.track != CarOnTrackInfo.track) {
+
+    }
+
+    CarOnTrackInfo = newCarOnTrackInfo;
+
 
 }
 
@@ -1075,19 +1096,6 @@
     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;
@@ -1096,12 +1104,11 @@
         carBody.point[i] = car->carXY[car->body[i]];
     }
 
-    if (IntersectionOf(&carBody, &roadArea) == GM_None) {
+    if (IntersectionOf(&carBody, &map.roads[currIndex].area) == GM_None) {
         ret = true;
     }
 
     free(carBody.point);
-    free(roadArea.point);
     return ret;
 }
 
@@ -1134,61 +1141,94 @@
     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;
 
+    CarOnTrackInfo_t newInfo;
+
     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();
+        int separate_line_num = map.roads[currIndex].separate[i].lines.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) {
-                        // 棣栧熬涓ょ锛屽簲閲囩敤寤堕暱绾跨殑鏂瑰紡
+        struct vrecord_ {
+            int valid;
+            int p1;
+            int p2;
+        };
+
+        vector<struct vrecord_> vrecord;
+        vrecord.clear();
+
+        bool match1 = false;
+        // 閬嶅巻褰撳墠鍒嗘鐨勬瘡涓�鏉$嚎
+        for (int j = 0; j < separate_line_num; ++j) {
+            Line theLine;
+            int p1 = 0;
+
+            struct vrecord_ v;
+            v.valid = 0;
+
+            // 鍗曠嫭鐨勪竴鏉¤櫄绾�
+            for (int p2 = 1; p2 < map.roads[currIndex].separate[i].lines[j].num; ++p2) {
+                MakeLine(&theLine, &map.roads[currIndex].separate[i].lines[j].point[p1],
+                         &map.roads[currIndex].separate[i].lines[j].point[p2]);
+                if (VerticalPointOnLine(car->basePoint, theLine)) {
+                    v.valid = 1;
+                    v.p1 = p1;
+                    v.p2 = p2;
+                    match1 = true;
+                    break;
+                }
+                p1 = p2;
+            }
+
+            vrecord.push_back(v);
+
+            track = separate_line_num;//
+        }
+
+
+
+        if (match1) {
+            for (int x = 0; x < vrecord.size(); ++x) {
+                if (vrecord[i].valid == 0) {
+                    // 棣栧熬涓ゆ绾跨殑寤剁敵蹇呮湁涓�涓瀭鐐�
+                    if (DistanceOf(car->carXY[ car->axial[AXIAL_FRONT] ], map.roads[currIndex].separate[i].lines[x].point[0]) <
+                        DistanceOf(car->carXY[ car->axial[AXIAL_FRONT] ], map.roads[currIndex].separate[i].lines[x].point[1])) {
+                        vrecord[x].p1 = 0;
+                        vrecord[x].p2 = 1;
+                    } else {
+                        vrecord[x].p1 = map.roads[currIndex].separate[i].lines[x].num - 2;
+                        vrecord[x].p2 = map.roads[currIndex].separate[i].lines[x].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;
+                int rel = IntersectionOfLine(map.roads[currIndex].separate[i].lines[x].point[vrecord[x].p1],
+                                             map.roads[currIndex].separate[i].lines[x].point[vrecord[x].p2],
+                                             car->basePoint);
+                if (rel != -1) {
+                    newInfo.road = currIndex;
+                    newInfo.segment = i;
+                    newInfo.track = x;
+                    break;
+                }
             }
+
+            newInfo.road = currIndex;
+            newInfo.segment = i;
+            newInfo.track = vrecord.size();
+
+            break;
         }
     }
-
-    DETECT_SEPARATE_END:
-    ;
 }
+
+
+
 #endif

--
Gitblit v1.8.0