From a073dc3c983b4c56c5da92642c9ad11995bdb844 Mon Sep 17 00:00:00 2001 From: yy1717 <fctom1215@outlook.com> Date: 星期一, 11 五月 2020 18:05:31 +0800 Subject: [PATCH] 新的科目三 --- lib/src/main/cpp/test_items2/road_exam.cpp | 674 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 663 insertions(+), 11 deletions(-) diff --git a/lib/src/main/cpp/test_items2/road_exam.cpp b/lib/src/main/cpp/test_items2/road_exam.cpp index de97518..f712b10 100644 --- a/lib/src/main/cpp/test_items2/road_exam.cpp +++ b/lib/src/main/cpp/test_items2/road_exam.cpp @@ -18,6 +18,7 @@ #include <vector> #include <list> +#include <map> #include <string> #include <cstdlib> @@ -39,6 +40,9 @@ static const int TURN_CHECK_INTERVAL = 500; const double SLIDE_DISTANCE_THRESHOLD_RED = 0.3; const double SLIDE_DISTANCE_THRESHOLD_YELLOW = 0.1; + +static const int FIND_POSITION = -2; +static const int INVALID_POSITION = -1; static bool occurCrashRedLine; static bool occurCrashGreenLine; @@ -76,9 +80,16 @@ static bool handBreakActive = false; static bool reportRPMOver = false; +static int currCarOnRoadIndex; + static const uint32_t TURN_ERROR_COLD_TIME = D_SEC(10); static bool turnError13Cold, turnError14Cold; +static struct car_on_lane { + int road; + int separate; + int lane; +} CarOnLane; static const int MAX_ENGINE_RPM = 2500; static const double START_CAR_MOVE_DISTANCE = 10.0; @@ -90,10 +101,16 @@ static const uint32_t CRASH_DOTTED_LINE_TIMEOUT = D_SEC(10); static const uint32_t TURN_SIGNAL_LAMP_ADVANCE = D_SEC(3); +static const int CRL_NONE = 0; +static const int CRL_SEP_DOTTED = 1; +static const int CRL_SEP_SOLID = 2; +static const int CRL_EDGE_DOTTED = 3; +static const int CRL_EDGE_SOLID = 4; + static const double MAX_SPEED = 40.0 * 1000.0 / 3600.0; static const int SPEED_GEAR_TABLE[][2] = {{0, 20}, {5, 30}, {15, 40}, {25, 10000}, {35, 10000}}; -static void TestRoadStartCar(const car_model *car, double speed, int moveDirect, const struct RtkTime *rtkTime); +static int TestRoadStartCar(const car_model *car, double speed, int moveDirect, const struct RtkTime *rtkTime); static char isTurn(int currYaw, int prevYaw, int &ang); static char CheckCarTurn(LIST_CAR_MODEL &CarModelList); @@ -106,8 +123,12 @@ static void TurnSignalError13ColdTimer(union sigval sig); static void TurnSignalError14ColdTimer(union sigval sig); static void ReportTurnSignalError(int err, const struct RtkTime *rtkTime); +static bool UpdateLane(struct car_on_lane &out, road_t &road, const car_model *car); +static int CrashRoadLine(road_t &road, const car_model *car); +static bool LaneIsSame(struct car_on_lane lane1, struct car_on_lane lane2); +static bool LaneIsValid(struct car_on_lane lane); -void InitRoadExam(void) +void InitRoadExam(road_exam_map &RoadMap) { DEBUG("Start road_exam"); @@ -132,7 +153,7 @@ prevGearNSlide = false; gearNSlideTime = 0; - currExamMapIndex = -1; + currExamMapIndex = FIND_POSITION; startCar = START_CAR_NOT_DO; @@ -143,6 +164,12 @@ checkStartCarSignal = startCarLeftTurnSignal = false; turnError13Cold = turnError14Cold = true; + + currCarOnRoadIndex = FIND_POSITION; + + CarOnLane.road = CarOnLane.separate = CarOnLane.lane = -1; + + InitThroughSomething(RoadMap); } void TerminateRoadExam(void) @@ -188,7 +215,7 @@ } } -static void TestRoadStartCar(const car_model *car, double speed, int moveDirect, const struct RtkTime *rtkTime) +static int TestRoadStartCar(const car_model *car, double speed, int moveDirect, const struct RtkTime *rtkTime) { double moveDistance; @@ -256,6 +283,558 @@ } else { } + + return startCar; +} + +void TestRoadGeneral(road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime) +{ + // 璧锋妫�娴� + TestRoadStartCar(car, speed, moveDirect, rtkTime); + + // 瓒呴�熸娴� + if (moveDirect != 0 && speed > MAX_SPEED) { + if (!occurOverSpeed) { + occurOverSpeed = true; + // 瓒呴�燂紝涓嶅悎鏍� + AddExamFault(10, rtkTime); + } + } else { + occurOverSpeed = false; + } + + // 鍓埞杞︽娴� + if (ReadCarStatus(SECOND_BREAK) == BREAK_ACTIVE) { + // 鍓埞杞﹁俯涓嬶紝涓嶅悎鏍� + if (!occurSecondBreak) { + DEBUG("鍓埞杞﹀姩浣滀簡"); + occurSecondBreak = true; + AddExamFault(17, rtkTime); + } + } else { + occurSecondBreak = false; + } + + // 鎸′綅鍖归厤妫�娴� + bool currGearError = false; + bool currGearNSlide = false; + + switch (ReadCarStatus(GEAR)) { + case GEAR_N: + if (moveDirect != 0) { + // 绌烘。婊戣 + currGearNSlide = true; + } + break; + case GEAR_1: + if (ConvertMs2KMh(speed) < SPEED_GEAR_TABLE[0][0] || ConvertMs2KMh(speed) > SPEED_GEAR_TABLE[0][1]) { + currGearError = true; + } + break; + case GEAR_2: + if (ConvertMs2KMh(speed) < SPEED_GEAR_TABLE[1][0] || ConvertMs2KMh(speed) > SPEED_GEAR_TABLE[1][1]) { + currGearError = true; + } + break; + case GEAR_3: + if (ConvertMs2KMh(speed) < SPEED_GEAR_TABLE[2][0] || ConvertMs2KMh(speed) > SPEED_GEAR_TABLE[2][1]) { + currGearError = true; + } + break; + case GEAR_4: + if (ConvertMs2KMh(speed) < SPEED_GEAR_TABLE[3][0] || ConvertMs2KMh(speed) > SPEED_GEAR_TABLE[3][1]) { + currGearError = true; + } + break; + case GEAR_5: + if (ConvertMs2KMh(speed) < SPEED_GEAR_TABLE[4][0] || ConvertMs2KMh(speed) > SPEED_GEAR_TABLE[4][1]) { + currGearError = true; + } + break; + default:break; + } + // 绌烘。婊戣瓒呮椂 + if (currGearNSlide && prevGearNSlide) { + gearNSlideTime += TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10, + gearNSlideTimePoint.hour, gearNSlideTimePoint.min, gearNSlideTimePoint.sec, gearNSlideTimePoint.msec*10); + } + if (gearNSlideTime > GEAR_N_SLIDE_TIMEOUT) { + // 绌烘。婊戣瓒�5绉掞紝涓嶅悎鏍� + DEBUG("鎸′綅婊戣锛岃秴杩�5绉�"); + AddExamFault(8, rtkTime); + gearNSlideTime = 0; + } + + prevGearNSlide = currGearNSlide; + if (prevGearNSlide) { + Rtk2DriveTimer(gearNSlideTimePoint, rtkTime); + } else { + gearNSlideTime = 0; + } + // 鎸′綅涓嶅尮閰嶈秴鏃� + if (currGearError && prevGearError) { + gearErrorTime += TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10, + gearErrorTimePoint.hour, gearErrorTimePoint.min, gearErrorTimePoint.sec, gearErrorTimePoint.msec*10); + } + if (gearErrorTime > GEAR_ERROR_TIMEOUT) { + // 绱15绉掞紝鎸′綅-杞﹂�熶笉鍖归厤锛屼笉鍚堟牸 + DEBUG("鎸′綅閿欒瓒呰繃15绉�"); + AddExamFault(6, rtkTime); + gearErrorTime = 0; + } + + prevGearError = currGearError; + if (prevGearError) { + Rtk2DriveTimer(gearErrorTimePoint, rtkTime); + } + + // 璧锋鍚庢粦 + if (moveDirect != prevMoveDirect) { + if (moveDirect == 0) { + stopTimepoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10); + reportStopCarOnRedArea = false; + + DEBUG("鍋滆溅浜� %d %d %d %d %d %d %d", rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss); + } else if (moveDirect == -1 && prevMoveDirect == 0) { + DEBUG("寮�濮嬪悗婊�"); + stopPoint = car->basePoint; + occurSlide = true; + } + prevMoveDirect = moveDirect; + } else if (moveDirect == 0) { + uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10); + + /*if (tp - stopTimepoint >= STOP_CAR_TIME && !reportStopCarOnRedArea && CrashRedArea(RoadMapList, car)) { + // 鍋滆溅瓒�2绉掞紝鍋滃湪绾㈠尯锛屼笉鍚堟牸 + AddExamFault(16, rtkTime); + DEBUG("绂佸仠鍖哄仠杞�"); + reportStopCarOnRedArea = true; + }*/ + } else if (moveDirect == -1) { + if (occurSlide) { + double slideDistance = DistanceOf(stopPoint, car->basePoint); + + if (slideDistance > SLIDE_DISTANCE_THRESHOLD_YELLOW) { + slideNormalDistance = true; + } + + if (slideDistance > SLIDE_DISTANCE_THRESHOLD_RED && !slideLongDistance) { + // 鍚庢粦瓒呰繃30鍘樼背, 涓嶅悎鏍� + AddExamFault(5, rtkTime); + DEBUG("鍚庢粦瓒呰繃30鍘樼背"); + slideLongDistance = true; + } + } + } else { + if (slideNormalDistance) { + // 鍚庢粦锛屾墸10鍒� + AddExamFault(18, rtkTime); + DEBUG("鍚庢粦瓒呰繃10鍘樼背, 浣嗕笉瓒呰繃30鍘樼背"); + } + + slideNormalDistance = false; + slideLongDistance = false; + occurSlide = false; + } + + // 妫�娴嬮�氳繃璺彛銆佷汉琛岄亾绛夊尯鍩熸椂锛岄噴鏀惧埞杞︽垨鍑忛�� + CheckBreakActive(RoadMap, car, CarModelList); + + // 妫�娴嬬寮�姝よ矾娈碉紝鍏ㄨ溅闇�涓嶅湪鑼冨洿鍐� + if (currExamMapIndex >= 0) { + Polygon area; + int n = 0; + + area.num = 0; + + for (int j = 0; j < RoadMap.roads[currExamMapIndex].leftEdge.size(); ++j) { + if (j > 0) { + area.num += RoadMap.roads[currExamMapIndex].leftEdge[j].points.size() - 1; + } else { + area.num += RoadMap.roads[currExamMapIndex].leftEdge[j].points.size(); + } + } + for (int j = 0; j < RoadMap.roads[currExamMapIndex].rightEdge.size(); ++j) { + if (j > 0) { + area.num += RoadMap.roads[currExamMapIndex].rightEdge[j].points.size() - 1; + } else { + area.num += RoadMap.roads[currExamMapIndex].rightEdge[j].points.size(); + } + } + + area.point = (PointF *) malloc(area.num * sizeof(PointF)); + + for (int j = 0; j < RoadMap.roads[currExamMapIndex].leftEdge.size(); ++j) { + for (int k = (j>0?1:0); k < RoadMap.roads[currExamMapIndex].leftEdge[j].points.size(); ++k) { + area.point[n++] = RoadMap.roads[currExamMapIndex].leftEdge[j].points[k]; + } + } + + for (int j = RoadMap.roads[currExamMapIndex].rightEdge.size() - 1; j >= 0; --j) { + if (j == RoadMap.roads[currExamMapIndex].rightEdge.size() - 1) { + for (int k = RoadMap.roads[currExamMapIndex].rightEdge[j].points.size() - 1; k >= 0; --k) { + area.point[n++] = RoadMap.roads[currExamMapIndex].rightEdge[j].points[k]; + } + } else { + for (int k = RoadMap.roads[currExamMapIndex].rightEdge[j].points.size() - 2; k >= 0; --k) { + area.point[n++] = RoadMap.roads[currExamMapIndex].rightEdge[j].points[k]; + } + } + } + + // 鍏ㄨ溅閮介渶涓嶅湪鍦板浘涓� + 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, &area) == GM_None) { + DEBUG("绂诲紑璺 id = %d", RoadMap.roads[currExamMapIndex].id); + currExamMapIndex = FIND_POSITION; + } + + free(carBody.point); + free(area.point); + } + if (currExamMapIndex == FIND_POSITION) { + for (int i = 0; i < RoadMap.roads.size(); ++i) { + Polygon area; + int n = 0; + + area.num = 0; + + for (int j = 0; j < RoadMap.roads[i].leftEdge.size(); ++j) { + if (j > 0) { + area.num += RoadMap.roads[i].leftEdge[j].points.size() - 1; + } else { + area.num += RoadMap.roads[i].leftEdge[j].points.size(); + } + } + for (int j = 0; j < RoadMap.roads[i].rightEdge.size(); ++j) { + if (j > 0) { + area.num += RoadMap.roads[i].rightEdge[j].points.size() - 1; + } else { + area.num += RoadMap.roads[i].rightEdge[j].points.size(); + } + } + + area.point = (PointF *) malloc(area.num * sizeof(PointF)); + + for (int j = 0; j < RoadMap.roads[i].leftEdge.size(); ++j) { + for (int k = (j>0?1:0); k < RoadMap.roads[i].leftEdge[j].points.size(); ++k) { + area.point[n++] = RoadMap.roads[i].leftEdge[j].points[k]; + } + } + + for (int j = RoadMap.roads[i].rightEdge.size() - 1; j >= 0; --j) { + if (j == RoadMap.roads[i].rightEdge.size() - 1) { + for (int k = RoadMap.roads[i].rightEdge[j].points.size() - 1; k >= 0; --k) { + area.point[n++] = RoadMap.roads[i].rightEdge[j].points[k]; + } + } else { + for (int k = RoadMap.roads[i].rightEdge[j].points.size() - 2; k >= 0; --k) { + area.point[n++] = RoadMap.roads[i].rightEdge[j].points[k]; + } + } + } + + if (IntersectionOf(car->carXY[car->axial[AXIAL_FRONT]], &area) == GM_Containment) { + currExamMapIndex = i; + DEBUG("杩涘叆閬撹矾 id = %d", RoadMap.roads[i].id); + break; + } + + free(area.point); + } + if (currExamMapIndex < 0) { + currExamMapIndex = INVALID_POSITION; + DEBUG("鎼滃鏈灉"); + } + } else if (currExamMapIndex == INVALID_POSITION) { + for (int i = 0; i < RoadMap.roads.size(); ++i) { + if (CrashTheLine(RoadMap.roads[i].startLine, car, CarModelList)) { + currExamMapIndex = i; + DEBUG("杩涘叆閬撹矾 id = %d", RoadMap.roads[i].id); + break; + } + } + } + + if (currExamMapIndex >= 0) { + int crl = CrashRoadLine(RoadMap.roads[currExamMapIndex], car); + + if (crl == CRL_NONE) { + DEBUG("浠�涔堥兘娌″帇"); + } else if (crl == CRL_SEP_DOTTED) { + DEBUG("鍘嬪垎閬撹櫄绾�"); + } else if (crl == CRL_SEP_SOLID) { + DEBUG("鍘嬪垎閬撳疄绾�"); + } else if (crl == CRL_EDGE_DOTTED) { + DEBUG("鍘嬭竟娌胯櫄绾�"); + } else if (crl == CRL_EDGE_SOLID) { + DEBUG("鍘嬭竟娌垮疄绾�"); + } + + if (crl != CRL_SEP_DOTTED || crl != CRL_SEP_SOLID) { + struct car_on_lane lane; + UpdateLane(lane, RoadMap.roads[currExamMapIndex], car); + if (!LaneIsSame(lane, CarOnLane)) { + if (LaneIsValid(CarOnLane)) { + // 杞﹂亾鍙樻崲 + DEBUG("鍙樻洿杞﹂亾"); + } + CarOnLane = lane; + } + } + } +} + +/************************************************************* + * 妫�娴嬪綋鍓嶈溅閬擄紝浠ヨ溅澶翠腑鐐逛负鍩哄噯 + * @param road + * @param car + */ +static bool UpdateLane(struct car_on_lane &out, road_t &road, const car_model *car) +{ + bool leftExt = false, rightExt = false; + Line leftExtLine, rightExtLine; + struct car_on_lane lane; + + for (int i = 0; i < road.leftEdge.size(); ++i) { + PointF p1, p2; + Line edge; + + p1 = road.leftEdge[i].points[0]; + for (int j = 1; j < road.leftEdge[i].points.size(); ++j) { + p2 = road.leftEdge[i].points[j]; + MakeLine(&edge, &p1, &p2); + + PointF vp; + if (VerticalPointOnLine(car->carXY[car->axial[AXIAL_FRONT]], edge, vp)) { + leftExt = true; + MakeLine(&leftExtLine, &car->carXY[car->axial[AXIAL_FRONT]], &vp); + goto LEFT_EXT_CMP; + } + p1 = p2; + } + } +LEFT_EXT_CMP: + for (int i = 0; i < road.rightEdge.size(); ++i) { + PointF p1, p2; + Line edge; + + p1 = road.rightEdge[i].points[0]; + for (int j = 1; j < road.rightEdge[i].points.size(); ++j) { + p2 = road.rightEdge[i].points[j]; + MakeLine(&edge, &p1, &p2); + + PointF vp; + if (VerticalPointOnLine(car->carXY[car->axial[AXIAL_FRONT]], edge, vp)) { + rightExt = true; + MakeLine(&rightExtLine, &car->carXY[car->axial[AXIAL_FRONT]], &vp); + goto RIGHT_EXT_CMP; + } + p1 = p2; + } + } +RIGHT_EXT_CMP: + + if (!leftExt || !rightExt) { + return false; + } + + bool orthogonalInSegment = false; + + for (int i = 0; i < road.separate.size(); ++i) { // 娈� + PointF p1, p2; + Line sep; + + map<int, int> orthogonal; + + // 涓�娈靛垎閬撶粍鍐咃紝鏈変竴鏉℃浜わ紝灏卞繀椤讳繚璇佸悓缁勭殑鍏ㄩ兘姝d氦锛屽惁鍒欑洿鎺ラ��鍑� + for (int j = 0; j < road.separate[i].lines.size(); ++j) { // 绾跨粍 + bool intersection = false; + + for (int k = 0; !intersection && k < road.separate[i].lines[j].size(); ++k) { // 鑺� + + p1 = road.separate[i].lines[j][k].points[0]; + for (int m = 1; m < road.separate[i].lines[j][k].points.size(); ++m) { + p2 = road.separate[i].lines[j][k].points[m]; + MakeLine(&sep, &p1, &p2); + + if (IntersectionOf(leftExtLine, sep) == GM_Intersection) { + orthogonal.insert(pair<int, int>(j, 1)); + orthogonalInSegment = true; + intersection = true; + DEBUG("鍒嗛亾绾� %d 宸︽浜�", j); + break; + } else if (IntersectionOf(rightExtLine, sep) == GM_Intersection) { + orthogonal.insert(pair<int, int>(j, 2)); + orthogonalInSegment = true; + intersection = true; + DEBUG("鍒嗛亾绾� %d 鍙虫浜�", j); + break; + } + p1 = p2; + } + } + } + DEBUG("鐩爣 %d 褰撳墠 %d", road.separate[i].lines.size(), orthogonal.size()); + + if (orthogonal.size() > 0) { + if (orthogonal.size() == road.separate[i].lines.size()) { + // 寰楀埌褰撳墠鍦ㄧ鍑犱釜杞﹂亾 + int x = 0; + for (x = 0; x < orthogonal.size(); ++x) { + auto itx = orthogonal.find(x); + if (itx != orthogonal.end()) { + if (itx->second != 1) { + lane.road = road.id; + lane.separate = i; + lane.lane = itx->first; + + DEBUG("璺� %d 娈� %d 杞﹂亾 %d", lane.road, lane.separate, lane.lane); + break; + } + } + } + if (x >= orthogonal.size()) { + lane.road = road.id; + lane.separate = i; + lane.lane = orthogonal.size(); + + DEBUG("璺� %d 娈� %d 杞﹂亾 %d", lane.road, lane.separate, lane.lane); + } + out = lane; + return true; + } else { + // 涓嶅畬鍏ㄦ浜わ紝鐩存帴閫�鍑� + } + return false; + } + } + return false; +} + +/************************************************************************* + * 纰拌Е杞﹂亾绾垮瀷 + * @param road + * @param car + */ +static int CrashRoadLine(road_t &road, const car_model *car) +{ + 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]]); + + // 妫�鏌ラ亾璺竟缂� + for (int i = 0; i < road.leftEdge.size(); ++i) { + PointF p1, p2; + Line edge; + + p1 = road.leftEdge[i].points[0]; + for (int j = 1; j < road.leftEdge[i].points.size(); ++j) { + p2 = road.leftEdge[i].points[j]; + MakeLine(&edge, &p1, &p2); + + if (IntersectionOf(edge, frontAxle) == GM_Intersection || + IntersectionOf(edge, rearAxle) == GM_Intersection) { + // 鍘嬮亾璺乏杈圭嚎 + if (road.leftEdge[i].character != LINE_SOLID) { + return CRL_EDGE_DOTTED; + } + return CRL_EDGE_SOLID; + } + p1 = p2; + } + } + + for (int i = 0; i < road.rightEdge.size(); ++i) { + PointF p1, p2; + Line edge; + + p1 = road.rightEdge[i].points[0]; + for (int j = 1; j < road.rightEdge[i].points.size(); ++j) { + p2 = road.rightEdge[i].points[j]; + MakeLine(&edge, &p1, &p2); + + if (IntersectionOf(edge, frontAxle) == GM_Intersection || + IntersectionOf(edge, rearAxle) == GM_Intersection) { + // 鍘嬮亾璺彸杈圭嚎 + if (road.rightEdge[i].character != LINE_SOLID) { + return CRL_EDGE_DOTTED; + } + return CRL_EDGE_SOLID; + } + p1 = p2; + } + } + + // 妫�鏌ュ垎閬撶嚎 + for (int i = 0; i < road.separate.size(); ++i) { + // 娈� + PointF p1, p2; + Line sep; + + for (int j = 0; j < road.separate[i].lines.size(); ++j) { + // 绾� + for (int k = 0; k < road.separate[i].lines[j].size(); ++k) { + // 鑺� + p1 = road.separate[i].lines[j][k].points[0]; + + for (int m = 1; m < road.separate[i].lines[j][k].points.size(); ++m) { + p2 = road.separate[i].lines[j][k].points[m]; + MakeLine(&sep, &p1, &p2); + + if (IntersectionOf(sep, frontAxle) == GM_Intersection || + IntersectionOf(sep, rearAxle) == GM_Intersection) { + // 妫�鏌ラ亾璺垎闅旂嚎绫诲瀷 + if (road.separate[i].lines[j][k].character == LINE_DOTTED) { + // 鍘嬭櫄绾� + return CRL_SEP_DOTTED; + } else if (road.separate[i].lines[j][k].character == LINE_SOLID) { + // 鍘嬪疄绾� + return CRL_SEP_SOLID; + } else if (road.separate[i].lines[j][k].character == LINE_HALF_SOLID_LEFT) { + if (LaneIsValid(CarOnLane) && CarOnLane.lane <= j) { + return CRL_SEP_SOLID; + } + return CRL_SEP_DOTTED; + } else if (road.separate[i].lines[j][k].character == LINE_HALF_SOLID_RIGHT) { + if (LaneIsValid(CarOnLane) && CarOnLane.lane > j) { + return CRL_SEP_SOLID; + } + return CRL_SEP_DOTTED; + } + } + + p1 = p2; + } + } + } + } + + return CRL_NONE; +} + +static bool LaneIsSame(struct car_on_lane lane1, struct car_on_lane lane2) +{ + if (lane1.road == lane2.road && lane1.separate == lane2.separate && lane1.lane == lane2.lane) { + return true; + } + return false; +} + +static bool LaneIsValid(struct car_on_lane lane) +{ + if (lane.road >= 0 && lane.separate >= 0 && lane.lane >= 0) { + return true; + } + return false; } void TestRoadGeneral(LIST_ROAD_MAP &RoadMapList, const car_model *car, LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime) @@ -974,6 +1553,28 @@ return map_idx; } +bool CrashTheLine(Line line, const car_model *car, LIST_CAR_MODEL &CarModelList) +{ + if (CarModelList.size() < 2) + return false; + + list<car_model *>::iterator iter = CarModelList.begin(); + + Line trace; + PointF p1, p2; + + p1 = ((car_model *)(*iter))->carXY[((car_model *)(*iter))->axial[AXIAL_FRONT]]; + ++iter; + p2 = ((car_model *)(*iter))->carXY[((car_model *)(*iter))->axial[AXIAL_FRONT]]; + MakeLine(&trace, &p1, &p2); + + if (IntersectionOf(trace, line) == GM_Intersection && + IntersectionOfLine(p1, line) == -1) { + return true; + } + return false; +} + static int FindMapIndexById(int id, LIST_ROAD_MAP &RoadMapList) { for (int i = 0; i < RoadMapList.size(); ++i) { @@ -984,12 +1585,63 @@ return -1; } -#if 1 +/********************************************************************* + * 璁$畻鏌愮偣鍒伴亾璺乏杈圭嚎鐨勬渶杩戝瀭鐐� + * @param edge + * @param road + * @param point + * @return + */ +PointF GetSELine(vector<edge_t> &edge, PointF point) +{ + PointF p1, p2; + PointF px; + + vector<PointF> vps; + + Line line; + + for (int i = 0; i < edge.size(); ++i) { + p1 = edge[i].points[0]; + for (int j = 1; j < edge[i].points.size(); ++j) { + p2 = edge[i].points[j]; + MakeLine(&line, &p1, &p2); + + PointF vp; + if (VerticalPointOnLine(point, line, vp)) { + vps.push_back(vp); + } + + p1 = p2; + } + } + + if (vps.size() == 0) { + if (DistanceOf(point, edge[0].points[0]) < DistanceOf(point, edge[edge.size() - 1].points[edge[edge.size() - 1].points.size() - 1])) { + px = GetVerticalPoint(edge[0].points[0], edge[0].points[1], point); + } else { + px = GetVerticalPoint(edge[edge.size() - 1].points[edge[edge.size() - 1].points.size() - 2], edge[edge.size() - 1].points[edge[edge.size() - 1].points.size() - 1], point); + } + } else if (vps.size() == 1) { + px = vps[0]; + } else { + px = vps[0]; + for (int i = 1; i < vps.size(); ++i) { + if (DistanceOf(point, vps[i]) < DistanceOf(point, px)) { + px = vps[i]; + } + } + } + + return px; +} + +#if 0 typedef struct { int road; int segment; - int track; + int lane; } CarOnTrackInfo_t; static CarOnTrackInfo_t CarOnTrackInfo; @@ -1001,7 +1653,7 @@ if (newCarOnTrackInfo.road == CarOnTrackInfo.road && newCarOnTrackInfo.segment == CarOnTrackInfo.segment && - newCarOnTrackInfo.track != CarOnTrackInfo.track) { + newCarOnTrackInfo.lane != CarOnTrackInfo.lane) { } @@ -1145,7 +1797,7 @@ static void DetectSeparate(int currIndex, struct road_exam2_map &map, const car_model *car) { int segment; - int track = -1; + int lane = -1; CarOnTrackInfo_t newInfo; @@ -1190,7 +1842,7 @@ vrecord.push_back(v); - track = separate_line_num;// + lane = separate_line_num;// } @@ -1215,14 +1867,14 @@ if (rel != -1) { newInfo.road = currIndex; newInfo.segment = i; - newInfo.track = x; + newInfo.lane = x; break; } } newInfo.road = currIndex; newInfo.segment = i; - newInfo.track = vrecord.size(); + newInfo.lane = vrecord.size(); break; } -- Gitblit v1.8.0