#include "Sub2Judge05Qxxs.h" void Sub2Judge05Qxxs::dealDrawItem() { const TGPSPoints& left = m_model->left(); const TGPSPoints& right = m_model->right(); drawGpsLine(m_model->beg()); drawGpsLine(left); drawGpsLine(right); //drawGpsDashedLine(m_model->L1R1(), 5, false); drawGpsSign(left.front(), "L"); drawGpsSign(left.back(), "L"); drawGpsSign(right.front(), "R"); drawGpsSign(right.back(), "R"); } void Sub2Judge05Qxxs::dealJudgeItem() { HELP_COST_TIME(""); if(!m_car->rtkEnabled()) return; //不能后退 JUDGE_MARK_ITEM_EASY_ONCE(pureBackoff(), MARK_SUB2_QXXS_41); //中途停车扣分 JUDGE_MARK_ITEM_EASY_MORE(judgeStopover(), MARK_SUB2_QXXS_201); //必须在最小的外接矩形内(用于训练,考试只要不合格,项目就不继续了) JUDGE_MARK_ITEM_FORCED_END(!pureCarInItemArea(), MARK_SUB2_QXXS_41); //每个阶段评判 JUDGE_STAGE_DO(m_stage); //压线评判 judgeTouchLine(); //finally JUDGE_CHECK_END(); } JUDGE_STAGE_IMPL(Sub2Judge05Qxxs, Sub2QxxsStage0) { TGPSLine L1R1 = m_model->L1R1(); //L1R1的经纬度连线 if(IS_C1C2C5(m_carType)) { static constexpr int history = 2; //计算历史两帧的 if(pureCarTouchAnyLine(L1R1, history)) { m_stage = Sub2QxxsStage1; } } } JUDGE_STAGE_IMPL(Sub2Judge05Qxxs, Sub2QxxsStage1) { if(IS_A1A2A3B1B2(m_carType)) { int gears = m_car->historyGears(); //防止挡位传感器错误,如果挡位传感器错误,值就是0 //0不判,大车过曲线必须是大于1档即2档及以上 //car.LowGrade是特定车型的及格分数,小车科目二80分及格。(大车科目二90分合格)(科目三都是90分及格) JUDGE_MARK_ITEM_EASY_ONCE(gears == 1, MARK_SUB2_QXXS_202); } if(IS_C1C2C5(m_carType)) { if(pureJudgeLeave()) { m_stage = Sub2QxxsStage2; } } } JUDGE_STAGE_IMPL(Sub2Judge05Qxxs, Sub2QxxsStage2) { setState(itemStateEnd); //到达结束线阶段 } void Sub2Judge05Qxxs::judgeTouchLine() { const TGPSPoints& left = m_model->left(); const TGPSPoints& right = m_model->right(); if(IS_C1C2C5(m_carType)) { //1、车轮压线(纯粹车轮)只用车轮子计算 //注意:由于GPS可能漂移不能用这种方式计算,用历史车轮点判断会误判,无锡就出现这种情况 yhy 2025-04-23 //static constexpr int history = 2; //const PointSets& wheels = m_car->carModel()->wheelAll(); //JUDGE_MARK_ITEM_EASY_ONCE(pureCarTouchSomePoints(left, wheels, history), MARK_SUB2_QXXS_61); //JUDGE_MARK_ITEM_EASY_ONCE(pureCarTouchSomePoints(right, wheels, history), MARK_SUB2_QXXS_62); //2、排线和边线相交,也算压线 const PointPairs& wind = m_car->carModel()->wheelWindAll(); JUDGE_MARK_ITEM_EASY_ONCE(pureCarTouchPairsPoints(left, wind), MARK_SUB2_QXXS_61); JUDGE_MARK_ITEM_EASY_ONCE(pureCarTouchPairsPoints(right, wind), MARK_SUB2_QXXS_62); } } bool Sub2Judge05Qxxs::judgeStopover() { return pureStopover() && m_car->historyMoveState() == moveForward; }