From 4ff195404b21f74ca11e26a69cbf0418eaa4595f Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期二, 17 三月 2020 17:57:03 +0800
Subject: [PATCH] 科目三草案实现

---
 lib/src/main/cpp/master/comm_if.cpp |  249 +++++++++++++++++--------------------------------
 1 files changed, 89 insertions(+), 160 deletions(-)

diff --git a/lib/src/main/cpp/master/comm_if.cpp b/lib/src/main/cpp/master/comm_if.cpp
index 6101577..9f52d64 100644
--- a/lib/src/main/cpp/master/comm_if.cpp
+++ b/lib/src/main/cpp/master/comm_if.cpp
@@ -490,30 +490,100 @@
             doc.Parse(value);
 
             if (!doc.HasParseError()) {
-                const Value &a = doc.GetArray();
-                if (a.IsArray()) {
+                CleanRoadMap();
+
+                vector<double> mapPoints;
+                mapPoints.clear();
+
+                if (doc.HasMember("points")) {
+                    const Value &s = doc["points"];
+                    // X-Y鍧愭爣闆嗗悎
+                    for (Value::ConstValueIterator itr2 = s.Begin();
+                             itr2 != s.End(); ++itr2) {
+                        mapPoints.push_back((*itr2).GetDouble());
+                    }
+
+                    SetRoadMapPoints(mapPoints);
+                }
+
+                if (doc.HasMember("maps")) {
+                    const Value &a = doc["maps"];
+
                     for (Value::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) {
                         if (itr->IsObject()) {
                             // a Map
-                            int id, type, pointNum = 0;
+                            int id, type;
                             int stop_flag = 0;
-                            char *tts = NULL;
-                            double (*map)[2] = NULL;
+                            string tts;
 
-                            int redLineNum = 0, greenLineNum = 0, triggerLineNum = 0, redAreaNum = 0;
-                            int **redLine = NULL, **greenLine = NULL, **triggerLine = NULL, **redArea = NULL;
+                            vector<vector<int>> redLines;
+                            vector<vector<int>> greenLines;
+                            vector<vector<int>> triggerLines;
+                            vector<vector<int>> redAreas;
 
-                            struct line_t {
-                                int point_num;
-                                int *points;
-                            };
+                            tts.clear();
+                            redLines.clear();
+                            greenLines.clear();
+                            triggerLines.clear();
+                            redAreas.clear();
 
-                            struct trigger_area {
-                                int map_id;
-                                int lineNum;
-                                int *line;
-                            } *triggerArea = NULL;         // 瑙﹀彂鍚勫瓙椤圭殑绾�
-                            int triggerAreaNum;
+                            vector<int> points;
+
+                            if (itr->HasMember("red_line")) {
+                                const Value &s = (*itr)["red_line"];
+
+                                for (Value::ConstValueIterator itrLine = s.Begin();
+                                     itrLine != s.End(); ++itrLine) {
+                                    points.clear();
+                                    for (Value::ConstValueIterator itrPoint = (*itrLine).Begin();
+                                         itrPoint != (*itrLine).End(); ++itrPoint) {
+                                        points.push_back((*itrPoint).GetInt());
+                                    }
+                                    redLines.push_back(points);
+                                }
+                            }
+
+                            if (itr->HasMember("green_line")) {
+                                const Value &s = (*itr)["green_line"];
+
+                                for (Value::ConstValueIterator itrLine = s.Begin();
+                                     itrLine != s.End(); ++itrLine) {
+                                    points.clear();
+                                    for (Value::ConstValueIterator itrPoint = (*itrLine).Begin();
+                                         itrPoint != (*itrLine).End(); ++itrPoint) {
+                                        points.push_back((*itrPoint).GetInt());
+                                    }
+                                    greenLines.push_back(points);
+                                }
+                            }
+
+                            if (itr->HasMember("trigger_line")) {
+                                const Value &s = (*itr)["trigger_line"];
+
+                                for (Value::ConstValueIterator itrLine = s.Begin();
+                                     itrLine != s.End(); ++itrLine) {
+                                    points.clear();
+                                    for (Value::ConstValueIterator itrPoint = (*itrLine).Begin();
+                                         itrPoint != (*itrLine).End(); ++itrPoint) {
+                                        points.push_back((*itrPoint).GetInt());
+                                    }
+                                    triggerLines.push_back(points);
+                                }
+                            }
+
+                            if (itr->HasMember("red_area")) {
+                                const Value &s = (*itr)["red_area"];
+
+                                for (Value::ConstValueIterator itrLine = s.Begin();
+                                     itrLine != s.End(); ++itrLine) {
+                                    points.clear();
+                                    for (Value::ConstValueIterator itrPoint = (*itrLine).Begin();
+                                         itrPoint != (*itrLine).End(); ++itrPoint) {
+                                        points.push_back((*itrPoint).GetInt());
+                                    }
+                                    redAreas.push_back(points);
+                                }
+                            }
 
                             if (itr->HasMember("id")) {
                                 const Value &s = (*itr)["id"];
@@ -532,151 +602,10 @@
 
                             if (itr->HasMember("tts")) {
                                 const Value &s = (*itr)["tts"];
-                                tts = new char[s.GetStringLength() + 1];
-                                strcpy(tts, s.GetString());
+                                tts = s.GetString();
                             }
 
-                            // X-Y鍧愭爣闆嗗悎
-                            if (itr->HasMember("map")) {
-                                const Value &s = (*itr)["map"];
-                                int i = 0, j = 0;
-
-                                pointNum = s.Size() / 2;
-                                map = (double (*)[2]) new double[pointNum][2];
-
-                                for (Value::ConstValueIterator itr2 = s.Begin();
-                                     itr2 != s.End(); ++itr2) {
-                                    map[i][j] = (*itr2).GetDouble();
-                                    if (++j == 2) {
-                                        j = 0;
-                                        i++;
-                                    }
-                                }
-                            }
-
-                            //AddMap(id, type, map, pointNum, redLineNum, redLine, greenLine, redArea, triggerLine);
-                            // 绾㈢嚎闆嗗悎
-                            if (itr->HasMember("red_line")) {
-                                const Value &s = (*itr)["red_line"];
-
-                                redLineNum = s.Size();
-                                redLine = new int *[redLineNum];
-                                int x = 0;
-                                for (Value::ConstValueIterator itr2 = s.Begin();
-                                     itr2 != s.End(); ++itr2) {
-                                    // 鍙互杩炴帴涓轰竴鏉$嚎鐨勭偣
-                                    const Value &s2 = (*itr2)["line"];
-
-                                    redLine[x] = new int[s2.Size()];
-                                    int y = 0;
-                                    for (Value::ConstValueIterator itr3 = s2.Begin();
-                                         itr3 != s2.End(); ++itr3) {
-                                        redLine[x][y++] = (*itr3).GetInt();
-                                    }
-                                    x++;
-                                }
-                            }
-                            // 缁跨嚎闆嗗悎
-                            if (itr->HasMember("green_line")) {
-                                const Value &s = (*itr)["green_line"];
-
-                                greenLineNum = s.Size();
-                                greenLine = new int *[greenLineNum];
-                                int x = 0;
-                                for (Value::ConstValueIterator itr2 = s.Begin();
-                                     itr2 != s.End(); ++itr2) {
-                                    // 鍙互杩炴帴涓轰竴鏉$嚎鐨勭偣
-                                    const Value &s2 = (*itr2)["line"];
-
-                                    greenLine[x] = new int[s2.Size()];
-                                    int y = 0;
-                                    for (Value::ConstValueIterator itr3 = s2.Begin();
-                                         itr3 != s2.End(); ++itr3) {
-                                        greenLine[x][y++] = (*itr3).GetInt();
-                                    }
-                                    x++;
-                                }
-                            }
-                            // 绾㈠尯闆嗗悎
-                            if (itr->HasMember("red_area")) {
-                                const Value &s = (*itr)["red_area"];
-
-                                redAreaNum = s.Size();
-                                redArea = new int *[redAreaNum];
-                                int x = 0;
-                                for (Value::ConstValueIterator itr2 = s.Begin();
-                                     itr2 != s.End(); ++itr2) {
-                                    // 鍙互杩炴帴涓轰竴鏉$嚎鐨勭偣
-                                    const Value &s2 = (*itr2)["area"];
-
-                                    redArea[x] = new int[s2.Size()];
-                                    int y = 0;
-                                    for (Value::ConstValueIterator itr3 = s2.Begin();
-                                         itr3 != s2.End(); ++itr3) {
-                                        redArea[x][y++] = (*itr3).GetInt();
-                                    }
-                                    x++;
-                                }
-                            }
-                            // 瑙﹀彂绾块泦鍚�
-                            if (itr->HasMember("trigger_line")) {
-                                const Value &s = (*itr)["trigger_line"];
-
-                                triggerAreaNum = s.Size();
-                                triggerArea = new struct trigger_area[triggerAreaNum];
-
-                                int x = 0;
-                                for (Value::ConstValueIterator itr2 = s.Begin();
-                                     itr2 != s.End(); ++itr2) {
-                                    // 鍙互杩炴帴涓轰竴鏉$嚎鐨勭偣
-                                    const Value &s2 = (*itr2)["line"];
-                                    const Value &s3 = (*itr2)["map_id"];
-
-                                    triggerArea[x].line = new int[s2.Size()];
-                                    triggerArea[x].lineNum = s2.Size();
-                                    triggerArea[x].map_id = s3.GetInt();
-
-                                    int y = 0;
-                                    for (Value::ConstValueIterator itr3 = s2.Begin();
-                                         itr3 != s2.End(); ++itr3) {
-                                        triggerArea[x].line[y++] = (*itr3).GetInt();
-                                    }
-                                    x++;
-                                }
-                            }
-
-                            if (type == 100) {
-
-                            } else {
-
-                            }
-
-                            if (map != NULL)
-                                delete []map;
-                            if (tts != NULL)
-                                delete []tts;
-                            if (redLineNum > 0) {
-                                for(int i=0; i < redLineNum; i++)
-                                    delete[] redLine[i];
-                                delete[] redLine;
-                            }
-                            if (greenLineNum > 0) {
-                                for(int i=0; i < greenLineNum; i++)
-                                    delete[] greenLine[i];
-                                delete[] greenLine;
-                            }
-                            if (redAreaNum > 0) {
-                                for(int i=0; i < redAreaNum; i++)
-                                    delete[] redArea[i];
-                                delete[] redArea;
-                            }
-                            if (triggerAreaNum > 0) {
-                                for (int i = 0; i < triggerAreaNum; ++i) {
-                                    delete [](triggerArea[i].line);
-                                }
-                                delete []triggerArea;
-                            }
-                            ///////////////////////
+                            AddRoadMapParent(id, type, tts, redLines, redAreas, greenLines, triggerLines);
                         }
                     }
                 }

--
Gitblit v1.8.0