|
@@ -1,8 +1,12 @@
|
|
|
#include "autoroadcontact.h"
|
|
|
|
|
|
+#include "mainwindow.h"
|
|
|
+
|
|
|
#include <math.h>
|
|
|
#include <iostream>
|
|
|
|
|
|
+extern MainWindow * gw;
|
|
|
+
|
|
|
#include "xodrfunc.h"
|
|
|
#include "xodrdijkstra.h"
|
|
|
|
|
@@ -308,6 +312,7 @@ int AutoRoadContact::CalcContact(Road *pRoad1, Road *pRoad2,int & contacttype,in
|
|
|
if((nindex1<0)||(nindex2<0))
|
|
|
{
|
|
|
std::cout<<"can't find driving lane"<<std::endl;
|
|
|
+ return -3;
|
|
|
}
|
|
|
if(bTurnRight)
|
|
|
{
|
|
@@ -375,6 +380,7 @@ int AutoRoadContact::CalcContact(Road *pRoad1, Road *pRoad2,int & contacttype,in
|
|
|
if((nindex1<0)||(nindex2<0))
|
|
|
{
|
|
|
std::cout<<"can't find driving lane"<<std::endl;
|
|
|
+ return -3;
|
|
|
}
|
|
|
Lane * pLane1 = xroad1rightlane.at(nindex1);
|
|
|
Lane * pLane2 = xroad2rightlane.at(nindex2);
|
|
@@ -656,7 +662,7 @@ int AutoRoadContact::MakeAllContact(OpenDrive *pxodr, const double fDisTolerance
|
|
|
}
|
|
|
|
|
|
int RCUSize = xvectorRCU.size();
|
|
|
- for(i=0;i<RCUSize;i++)
|
|
|
+ for(i=0;i<xvectorRCU.size();i++)
|
|
|
{
|
|
|
int nlr1 = 0;
|
|
|
int nlr2 = 0;
|
|
@@ -700,11 +706,635 @@ int AutoRoadContact::MakeAllContact(OpenDrive *pxodr, const double fDisTolerance
|
|
|
std::cout<<std::endl;
|
|
|
xvectorRCU.erase(xvectorRCU.begin()+i);
|
|
|
i = i-1;
|
|
|
+
|
|
|
+ if(xvp.size() == 3)
|
|
|
+ {
|
|
|
+ int nroadid = xvp[1].mroadid;
|
|
|
+ std::cout<<" found junction road . id: "<<nroadid<<std::endl;
|
|
|
+ int k = 0;
|
|
|
+ bool bdel = false;
|
|
|
+ for(k=0;k<xvectorRCU.size();k++)
|
|
|
+ {
|
|
|
+ if((atoi(xvectorRCU[k].mpRoad1->GetRoadId().data()) == nroadid)||(atoi(xvectorRCU[k].mpRoad2->GetRoadId().data()) == nroadid))
|
|
|
+ {
|
|
|
+ xvectorRCU.erase(xvectorRCU.begin() + k);
|
|
|
+ k = k-1;
|
|
|
+ bdel = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(bdel)
|
|
|
+ {
|
|
|
+ i = -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
+ std::cout<<" RCU Size is "<<xvectorRCU.size()<<std::endl;
|
|
|
+
|
|
|
+// for(i=0;i<xvectorRCU.size();i++)
|
|
|
+ std::vector<std::vector<iv::roadcontact>> xvectorrcs;
|
|
|
+ for(i=0;i<xvectorRCU.size();i++)
|
|
|
+ {
|
|
|
+ std::vector<iv::roadcontact> xvectorrc;
|
|
|
+ xvectorrc.clear();
|
|
|
+ iv::roadcontact rc;
|
|
|
+ if((xvectorRCU[i].mcontactype == 0) ||(xvectorRCU[i].mcontactype == 1))
|
|
|
+ {
|
|
|
+ rc.mncon1 = 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ rc.mncon1 = 1;
|
|
|
+ }
|
|
|
+ if((xvectorRCU[i].mcontactype == 0) ||(xvectorRCU[i].mcontactype == 2))
|
|
|
+ {
|
|
|
+ rc.mncon2 = 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ rc.mncon2 = 1;
|
|
|
+ }
|
|
|
+ rc.mnroad1id = atoi(xvectorRCU[i].mpRoad1->GetRoadId().data());
|
|
|
+ rc.mnroad2id = atoi(xvectorRCU[i].mpRoad2->GetRoadId().data());
|
|
|
+ unsigned int j;
|
|
|
+ for(j=0;j<xvectorRCU[i].mARCLane.size();j++)
|
|
|
+ {
|
|
|
+ iv::lanecontact lt;
|
|
|
+ lt.ml1 = xvectorRCU[i].mARCLane[j].from;
|
|
|
+ lt.ml2 = xvectorRCU[i].mARCLane[j].to;
|
|
|
+ rc.mvectorlc.push_back(lt);
|
|
|
+ }
|
|
|
+ for(j=0;j<xvectorRCU[i].mARCOpLane.size();j++)
|
|
|
+ {
|
|
|
+ iv::lanecontact lt;
|
|
|
+ lt.ml1 = xvectorRCU[i].mARCOpLane[j].from;
|
|
|
+ lt.ml2 = xvectorRCU[i].mARCOpLane[j].to;
|
|
|
+ rc.mvectorlcop.push_back(lt);
|
|
|
+ }
|
|
|
+ xvectorrc.push_back(rc);
|
|
|
+ xvectorrcs.push_back(xvectorrc);
|
|
|
+// CreateContactRoad(xvectorrc,pxodr,xvectorRCU[i].mturnstraight);
|
|
|
+ }
|
|
|
+
|
|
|
+ for(i=0;i<xvectorrcs.size();i++)
|
|
|
+ {
|
|
|
+ CreateContactRoad(xvectorrcs[i],pxodr,xvectorRCU[i].mturnstraight);
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+void AutoRoadContact::CreateContactRoad(std::vector<iv::roadcontact> & xvectorrc,OpenDrive * pxodr,int nConType)
|
|
|
+{
|
|
|
+ if(xvectorrc.size()<1)return;
|
|
|
+
|
|
|
+ Road * p1, *p2;
|
|
|
+ int nroad1index;
|
|
|
+ int nroad2index;
|
|
|
+
|
|
|
+ int i;
|
|
|
+ bool bhavep1 = false;
|
|
|
+ bool bhavep2 = false;
|
|
|
+ for(i=0;i<pxodr->GetRoadCount();i++)
|
|
|
+ {
|
|
|
+ if(xvectorrc[0].mnroad1id == atoi(pxodr->GetRoad(i)->GetRoadId().data()))
|
|
|
+ {
|
|
|
+ bhavep1 = true;
|
|
|
+ p1 = pxodr->GetRoad(i);
|
|
|
+ nroad1index = i;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(bhavep1 == false)
|
|
|
+ {
|
|
|
+ std::cout<<"Road not found"<<std::endl;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ double off1,off2;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ for(i=0;i<pxodr->GetRoadCount();i++)
|
|
|
+ {
|
|
|
+ if(xvectorrc[0].mnroad2id == atoi(pxodr->GetRoad(i)->GetRoadId().data()))
|
|
|
+ {
|
|
|
+ bhavep2 = true;
|
|
|
+ p2 = pxodr->GetRoad(i);
|
|
|
+ nroad2index = i;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(bhavep2 == false)
|
|
|
+ {
|
|
|
+ std::cout<<"Road not found"<<std::endl;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(xvectorrc[0].mvectorlc.size()<1)
|
|
|
+ {
|
|
|
+ std::cout<<"No Lane Contact."<<std::endl;;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ double startx,starty,starthdg;
|
|
|
+ double endx,endy,endhdg;
|
|
|
+
|
|
|
+ double startheight,endheight;
|
|
|
+
|
|
|
+ bool bFromstart,bTostart;
|
|
|
+ if(xvectorrc[0].mncon1 == 0)
|
|
|
+ {
|
|
|
+ bFromstart = true;
|
|
|
+ starthdg = p1->GetGeometryBlock(0)->GetGeometryAt(0)->GetHdg();
|
|
|
+ off1 = MainWindow::getoff(p1,xvectorrc[0].mvectorlc[0].ml1,true);
|
|
|
+ startx = p1->GetGeometryBlock(0)->GetGeometryAt(0)->GetX();
|
|
|
+ starty = p1->GetGeometryBlock(0)->GetGeometryAt(0)->GetY();
|
|
|
+
|
|
|
+ if(p1->GetLaneOffsetCount()>0)
|
|
|
+ {
|
|
|
+ off1 = off1 - p1->GetLaneOffset(0)->Geta();
|
|
|
+ }
|
|
|
+ startx = startx + off1 * cos(starthdg -M_PI/2.0);
|
|
|
+ starty = starty + off1 * sin(starthdg -M_PI/2.0);
|
|
|
+
|
|
|
+ startheight = 0;
|
|
|
+ if(p1->GetElevationCount()>0)
|
|
|
+ {
|
|
|
+ startheight = p1->GetElevation(0)->GetA();
|
|
|
+ }
|
|
|
+
|
|
|
+ // if(mvectorrc[0].mvectorlc[0].ml1<0)
|
|
|
+ starthdg = starthdg +M_PI;if(starthdg >=2.0*M_PI)starthdg = starthdg -2.0*M_PI;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ bFromstart = false;
|
|
|
+ if(GetEndPoint(p1,startx,starty,starthdg) != 0)
|
|
|
+ {
|
|
|
+ std::cout<<"Get End Point Error."<<std::endl;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ off1 = MainWindow::getoff(p1,xvectorrc[0].mvectorlc[0].ml1,false);
|
|
|
+ if(p1->GetLaneOffsetCount()>0)
|
|
|
+ {
|
|
|
+ LaneOffset * pLO = p1->GetLaneOffset(p1->GetLaneOffsetCount()-1);
|
|
|
+ double froadlen = p1->GetRoadLength();
|
|
|
+ double sdis = froadlen - pLO->GetS();
|
|
|
+ double foffset = pLO->Geta() + pLO->Getb()*(sdis) + pLO->Getc() * sdis * sdis
|
|
|
+ +pLO->Getd() * sdis * sdis * sdis;
|
|
|
+ off1 = off1 - foffset;
|
|
|
+ }
|
|
|
+ startx = startx + off1 * cos(starthdg -M_PI/2.0);
|
|
|
+ starty = starty + off1 * sin(starthdg -M_PI/2.0);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ startheight = 0;
|
|
|
+ if(p1->GetElevationCount()>0)
|
|
|
+ {
|
|
|
+ startheight = p1->GetElevation(0)->GetA()
|
|
|
+ +p1->GetElevation(0)->GetB() * pow(p1->GetRoadLength(),1)
|
|
|
+ +p1->GetElevation(0)->GetC() * pow(p1->GetRoadLength(),2)
|
|
|
+ +p1->GetElevation(0)->GetD() * pow(p1->GetRoadLength(),3);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(xvectorrc[0].mncon2 == 0)
|
|
|
+ {
|
|
|
+ bTostart = true;
|
|
|
+ off2 = MainWindow::getoff(p2,xvectorrc[0].mvectorlc[0].ml2,true);
|
|
|
+ endx = p2->GetGeometryBlock(0)->GetGeometryAt(0)->GetX();
|
|
|
+ endy = p2->GetGeometryBlock(0)->GetGeometryAt(0)->GetY();
|
|
|
+ endhdg = p2->GetGeometryBlock(0)->GetGeometryAt(0)->GetHdg();
|
|
|
+
|
|
|
+ if(p2->GetLaneOffsetCount()>0)
|
|
|
+ {
|
|
|
+ off2 = off2 - p2->GetLaneOffset(0)->Geta();
|
|
|
+ }
|
|
|
+ endx = endx + off2 * cos(endhdg -M_PI/2.0);
|
|
|
+ endy = endy + off2 * sin(endhdg -M_PI/2.0);
|
|
|
+
|
|
|
+ endheight = 0;
|
|
|
+ if(p2->GetElevationCount()>0)
|
|
|
+ {
|
|
|
+ endheight = p2->GetElevation(0)->GetA();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ bTostart = false;
|
|
|
+ off2 = MainWindow::getoff(p2,xvectorrc[0].mvectorlc[0].ml2,false);
|
|
|
+ if(GetEndPoint(p2,endx,endy,endhdg) != 0)
|
|
|
+ {
|
|
|
+ std::cout<<"get end error."<<std::endl;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(p2->GetLaneOffsetCount()>0)
|
|
|
+ {
|
|
|
+ LaneOffset * pLO = p2->GetLaneOffset(p2->GetLaneOffsetCount()-1);
|
|
|
+ double froadlen = p2->GetRoadLength();
|
|
|
+ double sdis = froadlen - pLO->GetS();
|
|
|
+ double foffset = pLO->Geta() + pLO->Getb()*(sdis) + pLO->Getc() * sdis * sdis
|
|
|
+ +pLO->Getd() * sdis * sdis * sdis;
|
|
|
+ off2 = off2 - foffset;
|
|
|
+ }
|
|
|
+ endx = endx + off2 * cos(endhdg -M_PI/2.0);
|
|
|
+ endy = endy + off2 * sin(endhdg -M_PI/2.0);
|
|
|
+ endhdg = endhdg +M_PI;if(endhdg >=2.0*M_PI)endhdg = endhdg -2.0*M_PI;
|
|
|
+
|
|
|
+ endheight = 0;
|
|
|
+ if(p2->GetElevationCount()>0)
|
|
|
+ {
|
|
|
+ endheight = p2->GetElevation(0)->GetA()
|
|
|
+ +p2->GetElevation(0)->GetB() * pow(p2->GetRoadLength(),1)
|
|
|
+ +p2->GetElevation(0)->GetC() * pow(p2->GetRoadLength(),2)
|
|
|
+ +p2->GetElevation(0)->GetD() * pow(p2->GetRoadLength(),3);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //Create Geo
|
|
|
+ double R = 6.0;
|
|
|
+ std::vector<geobase> xvectorgeo;
|
|
|
+ std::vector<geobase> xvectorgeo1,xvectorgeo2;
|
|
|
+ switch(nConType)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ xvectorgeo = geofit::CreateTurnGeo(startx,starty,starthdg,endx,endy,endhdg,R);
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ xvectorgeo = geofit::CreateLineGeo(startx,starty,starthdg,endx,endy,endhdg);
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ xvectorgeo = geofit::CreateUTurnGeo(startx,starty,starthdg,endx,endy,endhdg,R);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(nConType == 2)
|
|
|
+ {
|
|
|
+ for(i=0;i<xvectorgeo.size()/2;i++)
|
|
|
+ {
|
|
|
+ xvectorgeo1.push_back(xvectorgeo.at(i));
|
|
|
+ }
|
|
|
+ for(i=xvectorgeo.size()/2;i<xvectorgeo.size();i++)
|
|
|
+ {
|
|
|
+ xvectorgeo2.push_back(xvectorgeo.at(i));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(xvectorgeo.size() == 0)
|
|
|
+ {
|
|
|
+ std::cout<<"Waring Create Road Fail."<<std::endl;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ double xroadlen = 0;
|
|
|
+
|
|
|
+ if(nConType != 2)
|
|
|
+ {
|
|
|
+ for(i=0;i<xvectorgeo.size();i++)xroadlen = xroadlen + xvectorgeo[i].mfLen;
|
|
|
+
|
|
|
+ pxodr->AddRoad("",xroadlen, QString::number(gw->CreateRoadID()).toStdString(),"-1");
|
|
|
+ Road * p = pxodr->GetRoad(pxodr->GetRoadCount() - 1);
|
|
|
+
|
|
|
+ p->AddElevation(0,startheight,(endheight-startheight)/xroadlen,0,0);
|
|
|
+
|
|
|
+ p1 = pxodr->GetRoad(nroad1index);
|
|
|
+ p2 = pxodr->GetRoad(nroad2index);
|
|
|
+
|
|
|
+ double s = 0;
|
|
|
+ int j;
|
|
|
+ j= 0;
|
|
|
+ for(j=0;j<xvectorgeo.size();j++)
|
|
|
+ {
|
|
|
+ p->AddGeometryBlock();
|
|
|
+ GeometryBlock * pgb = p->GetGeometryBlock(j);
|
|
|
+
|
|
|
+ geobase * pline;
|
|
|
+ geobase * pbez;
|
|
|
+ geobase * parc;
|
|
|
+ switch(xvectorgeo[j].mnType)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ pline = &xvectorgeo[j];
|
|
|
+ pgb->AddGeometryLine(s,pline->mfX,pline->mfY,pline->mfHdg,pline->mfLen);
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ parc = &xvectorgeo[j];
|
|
|
+ pgb->AddGeometryArc(s,parc->mfX,parc->mfY,parc->mfHdgStart,parc->mfLen,1.0/parc->mR);
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ pbez = &xvectorgeo[j];
|
|
|
+ std::cout<<"u0:"<<pbez->mfu[0]<<std::endl;
|
|
|
+ pgb->AddGeometryParamPoly3(s,pbez->mfX,pbez->mfY,
|
|
|
+ pbez->mfHdg,pbez->mfLen,pbez->mfu[0],
|
|
|
+ pbez->mfu[1],pbez->mfu[2],pbez->mfu[3],pbez->mfv[0],
|
|
|
+ pbez->mfv[1],pbez->mfv[2],pbez->mfv[3]);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ s = s + xvectorgeo[j].mfLen;
|
|
|
+ }
|
|
|
+
|
|
|
+ p->AddLaneSection(0);
|
|
|
+ LaneSection * pLS = p->GetLaneSection(0);
|
|
|
+ pLS->SetS(0);
|
|
|
+ pLS->AddLane(0,0,"none",false);
|
|
|
+
|
|
|
+ double * pswidth,*pewidth;
|
|
|
+ std::vector<std::string> strvectorlanetype;
|
|
|
+ int nlanecount = xvectorrc[0].mvectorlc.size();
|
|
|
+ pswidth = new double[nlanecount];
|
|
|
+ pewidth = new double[nlanecount];
|
|
|
+ std::shared_ptr<double> ppswidth,ppewidth;
|
|
|
+ ppswidth.reset(pswidth);
|
|
|
+ ppewidth.reset(pewidth);
|
|
|
+
|
|
|
+ for(i=0;i<nlanecount;i++)
|
|
|
+ {
|
|
|
+ pswidth[i] = gw->getlanewidth(p1,xvectorrc[0].mvectorlc.at(i).ml1,bFromstart);
|
|
|
+ strvectorlanetype.push_back(gw->getlanetype(p1,xvectorrc[0].mvectorlc.at(i).ml1,bFromstart));
|
|
|
+
|
|
|
+ }
|
|
|
+ for(i=0;i<nlanecount;i++)
|
|
|
+ {
|
|
|
+ pewidth[i] = gw->getlanewidth(p2,xvectorrc[0].mvectorlc.at(i).ml2,bTostart);
|
|
|
+ }
|
|
|
+
|
|
|
+ double * pa,*pb;
|
|
|
+ pa = new double[nlanecount];
|
|
|
+ pb = new double[nlanecount];
|
|
|
+ std::shared_ptr<double> ppa,ppb;
|
|
|
+ ppa.reset(pa);
|
|
|
+ ppb.reset(pb);
|
|
|
+
|
|
|
+ for(i=0;i<nlanecount;i++)
|
|
|
+ {
|
|
|
+ pa[i] = pswidth[i];
|
|
|
+ pb[i] = (pewidth[i] - pa[i])/xroadlen;
|
|
|
+ }
|
|
|
+
|
|
|
+ for(i=0;i<nlanecount;i++)
|
|
|
+ {
|
|
|
+ pLS->AddLane(-1,(i+1)*(-1),strvectorlanetype[i],false,false);
|
|
|
+ Lane * pLL = pLS->GetLane(pLS->GetLaneCount() - 1);
|
|
|
+
|
|
|
+ pLL->AddWidthRecord(0,pa[i],pb[i],
|
|
|
+ 0,0);
|
|
|
+ pLL->AddRoadMarkRecord(0,"solid","standard","standard",0.15,"false");
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ int noplanecount = xvectorrc[0].mvectorlcop.size();
|
|
|
+ if(noplanecount > 0)
|
|
|
+ {
|
|
|
+ pswidth = new double[noplanecount];
|
|
|
+ pewidth = new double[noplanecount];
|
|
|
+ ppswidth.reset(pswidth);
|
|
|
+ ppewidth.reset(pewidth);
|
|
|
+
|
|
|
+ strvectorlanetype.clear();
|
|
|
+ for(i=0;i<noplanecount;i++)
|
|
|
+ {
|
|
|
+ pswidth[i] = gw->getlanewidth(p1,xvectorrc[0].mvectorlcop.at(i).ml1,bFromstart);
|
|
|
+ strvectorlanetype.push_back(gw->getlanetype(p1,xvectorrc[0].mvectorlcop.at(i).ml1,bFromstart));
|
|
|
+ }
|
|
|
+ for(i=0;i<noplanecount;i++)
|
|
|
+ {
|
|
|
+ pewidth[i] = gw->getlanewidth(p2,xvectorrc[0].mvectorlcop.at(i).ml2,bTostart);
|
|
|
+ }
|
|
|
+
|
|
|
+ pa = new double[noplanecount];
|
|
|
+ pb = new double[noplanecount];
|
|
|
+ ppa.reset(pa);
|
|
|
+ ppb.reset(pb);
|
|
|
+
|
|
|
+ for(i=0;i<noplanecount;i++)
|
|
|
+ {
|
|
|
+ pa[i] = pswidth[i];
|
|
|
+ pb[i] = (pewidth[i] - pa[i])/xroadlen;
|
|
|
+ }
|
|
|
+
|
|
|
+ for(i=0;i<noplanecount;i++)
|
|
|
+ {
|
|
|
+ pLS->AddLane(1,(i+1),strvectorlanetype[i],false,false);
|
|
|
+ Lane * pLL = pLS->GetLane(pLS->GetLaneCount() - 1);
|
|
|
+
|
|
|
+ pLL->AddWidthRecord(0,pa[i],pb[i],
|
|
|
+ 0,0);
|
|
|
+ pLL->AddRoadMarkRecord(0,"solid","standard","standard",0.15,"false");
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ double xroadlen1 = 0;
|
|
|
+ double xroadlen2 = 0;
|
|
|
+ for(i=0;i<xvectorgeo1.size();i++)xroadlen1 = xroadlen1 + xvectorgeo1[i].mfLen;
|
|
|
+ for(i=0;i<xvectorgeo2.size();i++)xroadlen2 = xroadlen2 + xvectorgeo2[i].mfLen;
|
|
|
+
|
|
|
+ int index1 = pxodr->AddRoad("",xroadlen1, QString::number(gw->CreateRoadID()).toStdString(),"-1");
|
|
|
+ int index2 = pxodr->AddRoad("",xroadlen2, QString::number(gw->CreateRoadID()).toStdString(),"-1");
|
|
|
+ Road * proad2 = pxodr->GetRoad(index2);
|
|
|
+ Road * proad1 = pxodr->GetRoad(index1);
|
|
|
+
|
|
|
+ proad1->AddElevation(0,startheight,(endheight-startheight)/(xroadlen1+xroadlen2),0,0);
|
|
|
+ proad2->AddElevation(0,startheight+xroadlen1*(endheight-startheight)/(xroadlen1+xroadlen2),
|
|
|
+ (endheight-startheight)/(xroadlen1+xroadlen2),
|
|
|
+ 0,0);
|
|
|
+
|
|
|
+ p1 = pxodr->GetRoad(nroad1index);
|
|
|
+ p2 = pxodr->GetRoad(nroad2index);
|
|
|
+
|
|
|
+// OpenDrive * px = &mxodr;
|
|
|
+ double s = 0;
|
|
|
+ int j;
|
|
|
+ j= 0;
|
|
|
+ for(j=0;j<xvectorgeo1.size();j++)
|
|
|
+ {
|
|
|
+ proad1->AddGeometryBlock();
|
|
|
+ GeometryBlock * pgb = proad1->GetGeometryBlock(j);
|
|
|
+
|
|
|
+ geobase * pline;
|
|
|
+ geobase * pbez;
|
|
|
+ geobase * parc;
|
|
|
+ switch(xvectorgeo1[j].mnType)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ pline = &xvectorgeo1[j];
|
|
|
+ pgb->AddGeometryLine(s,pline->mfX,pline->mfY,pline->mfHdg,pline->mfLen);
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ parc = &xvectorgeo1[j];
|
|
|
+ pgb->AddGeometryArc(s,parc->mfX,parc->mfY,parc->mfHdgStart,parc->mfLen,1.0/parc->mR);
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ pbez = &xvectorgeo1[j];
|
|
|
+ std::cout<<"u0:"<<pbez->mfu[0]<<std::endl;
|
|
|
+ pgb->AddGeometryParamPoly3(s,pbez->mfX,pbez->mfY,
|
|
|
+ pbez->mfHdg,pbez->mfLen,pbez->mfu[0],
|
|
|
+ pbez->mfu[1],pbez->mfu[2],pbez->mfu[3],pbez->mfv[0],
|
|
|
+ pbez->mfv[1],pbez->mfv[2],pbez->mfv[3]);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ s = s + xvectorgeo1[j].mfLen;
|
|
|
+ }
|
|
|
+
|
|
|
+ s=0.0;
|
|
|
+ for(j=0;j<xvectorgeo2.size();j++)
|
|
|
+ {
|
|
|
+ proad2->AddGeometryBlock();
|
|
|
+ GeometryBlock * pgb = proad2->GetGeometryBlock(j);
|
|
|
+
|
|
|
+ geobase * pline;
|
|
|
+ geobase * pbez;
|
|
|
+ geobase * parc;
|
|
|
+ switch(xvectorgeo2[j].mnType)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ pline = &xvectorgeo2[j];
|
|
|
+ pgb->AddGeometryLine(s,pline->mfX,pline->mfY,pline->mfHdg,pline->mfLen);
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ parc = &xvectorgeo2[j];
|
|
|
+ pgb->AddGeometryArc(s,parc->mfX,parc->mfY,parc->mfHdgStart,parc->mfLen,1.0/parc->mR);
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ pbez = &xvectorgeo2[j];
|
|
|
+ std::cout<<"u0:"<<pbez->mfu[0]<<std::endl;
|
|
|
+ pgb->AddGeometryParamPoly3(s,pbez->mfX,pbez->mfY,
|
|
|
+ pbez->mfHdg,pbez->mfLen,pbez->mfu[0],
|
|
|
+ pbez->mfu[1],pbez->mfu[2],pbez->mfu[3],pbez->mfv[0],
|
|
|
+ pbez->mfv[1],pbez->mfv[2],pbez->mfv[3]);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ s = s + xvectorgeo2[j].mfLen;
|
|
|
+ }
|
|
|
+
|
|
|
+ proad1->AddLaneSection(0);
|
|
|
+ LaneSection * pLS1 = proad1->GetLaneSection(0);
|
|
|
+ pLS1->SetS(0);
|
|
|
+ pLS1->AddLane(0,0,"none",false);
|
|
|
+
|
|
|
+ proad2->AddLaneSection(0);
|
|
|
+ LaneSection * pLS2 = proad2->GetLaneSection(0);
|
|
|
+ pLS2->SetS(0);
|
|
|
+ pLS2->AddLane(0,0,"none",false);
|
|
|
+
|
|
|
+ double * pswidth,*pewidth;
|
|
|
+ int nlanecount = xvectorrc[0].mvectorlc.size();
|
|
|
+ std::vector<std::string> strvectorlanetype;
|
|
|
+ pswidth = new double[nlanecount];
|
|
|
+ pewidth = new double[nlanecount];
|
|
|
+ std::shared_ptr<double> ppswidth,ppewidth;
|
|
|
+ ppswidth.reset(pswidth);
|
|
|
+ ppewidth.reset(pewidth);
|
|
|
+
|
|
|
+ for(i=0;i<nlanecount;i++)
|
|
|
+ {
|
|
|
+ pswidth[i] = gw->getlanewidth(p1,xvectorrc[0].mvectorlc.at(i).ml1,bFromstart);
|
|
|
+ strvectorlanetype.push_back(gw->getlanetype(p1,xvectorrc[0].mvectorlc.at(i).ml1,bFromstart));
|
|
|
+
|
|
|
+ }
|
|
|
+ for(i=0;i<nlanecount;i++)
|
|
|
+ {
|
|
|
+ pewidth[i] = gw->getlanewidth(p2,xvectorrc[0].mvectorlc.at(i).ml2,bTostart);
|
|
|
+ }
|
|
|
+
|
|
|
+ double * pa,*pb;
|
|
|
+ pa = new double[nlanecount];
|
|
|
+ pb = new double[nlanecount];
|
|
|
+ std::shared_ptr<double> ppa,ppb;
|
|
|
+ ppa.reset(pa);
|
|
|
+ ppb.reset(pb);
|
|
|
+
|
|
|
+ for(i=0;i<nlanecount;i++)
|
|
|
+ {
|
|
|
+ pa[i] = pswidth[i];
|
|
|
+ pb[i] = (pewidth[i] - pa[i])/(xroadlen1+xroadlen2);
|
|
|
+ }
|
|
|
+
|
|
|
+ for(i=0;i<nlanecount;i++)
|
|
|
+ {
|
|
|
+ pLS1->AddLane(-1,(i+1)*(-1),strvectorlanetype[i],false,false);
|
|
|
+ Lane * pLL = pLS1->GetLane(pLS1->GetLaneCount() - 1);
|
|
|
+
|
|
|
+ pLL->AddWidthRecord(0,pa[i],pb[i],
|
|
|
+ 0,0);
|
|
|
+ pLL->AddRoadMarkRecord(0,"solid","standard","standard",0.15,"false");
|
|
|
+
|
|
|
+ pLS2->AddLane(-1,(i+1)*(-1),strvectorlanetype[i],false,false);
|
|
|
+ pLL = pLS2->GetLane(pLS2->GetLaneCount() - 1);
|
|
|
+
|
|
|
+ pLL->AddWidthRecord(0,pa[i]+pb[i]*xroadlen1 ,pb[i],
|
|
|
+ 0,0);
|
|
|
+ pLL->AddRoadMarkRecord(0,"solid","standard","standard",0.15,"false");
|
|
|
+
|
|
|
+ }
|
|
|
+ int noplanecount = xvectorrc[0].mvectorlcop.size();
|
|
|
+ if(noplanecount > 0)
|
|
|
+ {
|
|
|
+ pswidth = new double[noplanecount];
|
|
|
+ pewidth = new double[noplanecount];
|
|
|
+ ppswidth.reset(pswidth);
|
|
|
+ ppewidth.reset(pewidth);
|
|
|
+
|
|
|
+ strvectorlanetype.clear();
|
|
|
+ for(i=0;i<noplanecount;i++)
|
|
|
+ {
|
|
|
+ pswidth[i] = gw->getlanewidth(p1,xvectorrc[0].mvectorlcop.at(i).ml1,bFromstart);
|
|
|
+ strvectorlanetype.push_back(gw->getlanetype(p1,xvectorrc[0].mvectorlcop.at(i).ml1,bFromstart));
|
|
|
+ }
|
|
|
+ for(i=0;i<noplanecount;i++)
|
|
|
+ {
|
|
|
+ pewidth[i] = gw->getlanewidth(p2,xvectorrc[0].mvectorlcop.at(i).ml2,bTostart);
|
|
|
+ }
|
|
|
+
|
|
|
+ pa = new double[noplanecount];
|
|
|
+ pb = new double[noplanecount];
|
|
|
+ ppa.reset(pa);
|
|
|
+ ppb.reset(pb);
|
|
|
+
|
|
|
+ for(i=0;i<noplanecount;i++)
|
|
|
+ {
|
|
|
+ pa[i] = pswidth[i];
|
|
|
+ pb[i] = (pewidth[i] - pa[i])/xroadlen;
|
|
|
+ }
|
|
|
+
|
|
|
+ for(i=0;i<noplanecount;i++)
|
|
|
+ {
|
|
|
+ pLS1->AddLane(1,(i+1),strvectorlanetype[i],false,false);
|
|
|
+ Lane * pLL = pLS1->GetLane(pLS1->GetLaneCount() - 1);
|
|
|
+
|
|
|
+ pLL->AddWidthRecord(0,pa[i],pb[i],
|
|
|
+ 0,0);
|
|
|
+ pLL->AddRoadMarkRecord(0,"solid","standard","standard",0.15,"false");
|
|
|
+
|
|
|
+ pLS2->AddLane(1,(i+1),strvectorlanetype[i],false,false);
|
|
|
+ pLL = pLS2->GetLane(pLS2->GetLaneCount() - 1);
|
|
|
+
|
|
|
+ pLL->AddWidthRecord(0,pa[i]+pb[i]*xroadlen1 ,pb[i],
|
|
|
+ 0,0);
|
|
|
+ pLL->AddRoadMarkRecord(0,"solid","standard","standard",0.15,"false");
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|