具体场景内部Lane之间关系的建立
这一部分工作在距离场景的构造函数中初始化Lane的部分进行,下面以Straight为例说明:
Straight::Straight(QPointF globalPos, //相对原点
int num_laneR, //右侧车道数
int num_laneL, //左侧车道数
double len_lane, //车道长度
double wid_lane, //车道宽
double dir, //场景方向初始化为0
double scale) //比例尺
{
SceneType = Scene::Straight;
GlobalPos = globalPos;
Num_laneR = num_laneR;
Num_laneL = num_laneL;
Len_lane = len_lane;
Wid_lane = wid_lane;
Dir = dir;
Scale = scale;
//初始化Interface和Lanes
QMatrix matrix; //变换矩阵
matrix.rotate(-Dir); //顺时针旋转-Dir°
Interfaces<<new Interface(QPointF(GlobalPos+QPointF(-Len_lane/2,0)*matrix), Num_laneR , Num_laneL , Dir)
<<new Interface(QPointF(GlobalPos+QPointF(Len_lane/2,0)*matrix), Num_laneL , Num_laneR , Dir+180);//>360 ? Dir-180 : Dir
/****************************从此处开始********************************/
//计算出lane的参数,初始化lane
int num_lanes = Num_laneL+Num_laneR;
double x0 = -Len_lane/2;
double y0 = -(Wid_lane*num_lanes/2 - Wid_lane/2);
QPointF startPoint;
QPointF endPoint;
for(int i=0; i<Num_laneL; ++i){
startPoint = QPointF(GlobalPos+QPointF(x0+Len_lane,y0+i*Wid_lane)*matrix);
endPoint = QPointF(GlobalPos+QPointF(x0,y0+i*Wid_lane)*matrix);
Interfaces.at(0)->Lanes<<new Lane(startPoint,endPoint);
}
double y = y0 + Wid_lane*Num_laneL;
for(int i=0; i<Num_laneR; ++i){
startPoint = QPointF(GlobalPos+QPointF(x0,y+i*Wid_lane)*matrix);
endPoint = QPointF(GlobalPos+QPointF(x0+Len_lane,y+i*Wid_lane)*matrix);
Interfaces.at(0)->Lanes<<new Lane(startPoint,endPoint);
}
for(int i=Interfaces.at(0)->Lanes.size()-1; i>=0; --i){
Interfaces.at(1)->Lanes<<Interfaces.at(0)->Lanes.at(i);
}
//qDebug()<<"初始车道点:"<<Interfaces.at(0)->Lanes.at(0)->StartPoint<<Interfaces.at(0)->Lanes.at(0)->EndPoint;
/****************************到此处结束********************************/
}
场景之间Interface吸附时Lane之间关系的建立
这一部分工作在Scene类中的searchInterface(Interface* p)函数终进行:
QPointF Scene::searchInterface(Interface* p)
{
for(int i = 0; i < Interfaces.size(); ++i){
if((Interfaces.at(i)->FlagPoint - p->FlagPoint).manhattanLength() < 3 &&
(Interfaces.at(i)->FlagPoint - p->FlagPoint).manhattanLength() > 1e-10 &&
Interfaces.at(i)->Num_lanesGo == p->Num_lanesBack &&
Interfaces.at(i)->Num_lanesBack == p->Num_lanesGo &&
abs(Interfaces.at(i)->Dir - p->Dir) == 180)
{
/****************************从此处开始********************************/
/****************************到此处结束********************************/
return Interfaces.at(i)->FlagPoint - p->FlagPoint;
}
}
return QPoint(-99,-99);
}