|
@@ -1473,28 +1473,30 @@ Lane * xodrfunc::GetLaneByID(LaneSection *pLS, int nlane)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-void xodrfunc::optimizeroad(Road * pRoad,const double maxopvalue)
|
|
|
+int xodrfunc::optimizeroad(Road * pRoad,const double maxopvalue)
|
|
|
{
|
|
|
int ngeobsize = static_cast<int>(pRoad->GetGeometryBlockCount());
|
|
|
int i;
|
|
|
bool boptimize = false;
|
|
|
for(i=1;i<(ngeobsize-1);i++)
|
|
|
{
|
|
|
+ //If have big angle change, optimize center geometry(pgeo1)
|
|
|
RoadGeometry * pgeo1 = pRoad->GetGeometryBlock(i)->GetGeometryAt(0);
|
|
|
RoadGeometry * pgeo2 = pRoad->GetGeometryBlock(i+1)->GetGeometryAt(0);
|
|
|
RoadGeometry * pgeo0 = pRoad->GetGeometryBlock(i-1)->GetGeometryAt(0);
|
|
|
|
|
|
- double x,y,hdgend;
|
|
|
- pgeo0->GetCoords(pgeo0->GetS() + pgeo0->GetLength()- 0.001,x,y,hdgend);
|
|
|
-
|
|
|
- std::cout<<"i: "<<i<<" front end hdg: "<<hdgend<<" now hdg: "<<pgeo1->GetHdg()<<std::endl;
|
|
|
+// double x,y,hdgend;
|
|
|
+// pgeo0->GetCoords(pgeo0->GetS() + pgeo0->GetLength(),x,y,hdgend);
|
|
|
+ // std::cout<<"i: "<<i<<" front end hdg: "<<hdgend<<" now hdg: "<<pgeo1->GetHdg()<<std::endl;
|
|
|
|
|
|
if((pgeo1 == NULL) || (pgeo2 == NULL) || (pgeo0 == NULL))
|
|
|
{
|
|
|
+ std::cout<<" xodrfunc::optimizeroad, have pgeo0 pgeo2 pgeo0 have NULL geo."<<std::endl;
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- if((pgeo1->GetLength()<5) && (pgeo1->GetLength() > 0.1) && ((pgeo1->GetGeomType() == 0) || (pgeo1->GetGeomType() == 4)))
|
|
|
+ //If a small geo, and type is line parampoly3
|
|
|
+ if((pgeo0->GetLength()>1.0) && (pgeo1->GetLength()<5) && (pgeo1->GetLength() > 0.1) && ((pgeo1->GetGeomType() == 0) || (pgeo1->GetGeomType() == 4)))
|
|
|
{
|
|
|
double fhdgdiff = pgeo2->GetHdg() - pgeo1->GetHdg();
|
|
|
while(fhdgdiff>M_PI)fhdgdiff = fhdgdiff - 2.0*M_PI;
|
|
@@ -1515,10 +1517,11 @@ void xodrfunc::optimizeroad(Road * pRoad,const double maxopvalue)
|
|
|
{
|
|
|
|
|
|
double fobjx,fobjy;
|
|
|
+ //Back Get object optimize point
|
|
|
fobjx = pgeo2->GetX() + pgeo1->GetLength() * cos(pgeo2->GetHdg() + M_PI);
|
|
|
fobjy = pgeo2->GetY() + pgeo1->GetLength() * sin(pgeo2->GetHdg() + M_PI);
|
|
|
|
|
|
- //Git dis
|
|
|
+ //Git dis from old point to optimize point
|
|
|
double fdis = sqrt(pow(pgeo1->GetX() -fobjx,2) + pow(pgeo1->GetY() - fobjy,2));
|
|
|
qDebug("dis, %f",fdis);
|
|
|
|
|
@@ -1568,7 +1571,7 @@ void xodrfunc::optimizeroad(Road * pRoad,const double maxopvalue)
|
|
|
pvectorgeob->insert(pvectorgeob->begin()+i-1,newline);
|
|
|
}
|
|
|
|
|
|
- //CChange to new geo.
|
|
|
+ //Change to new geo.
|
|
|
pgeo0 = pRoad->GetGeometryBlock(i-1)->GetGeometryAt(0);
|
|
|
|
|
|
//Change geo1
|
|
@@ -1621,6 +1624,91 @@ void xodrfunc::optimizeroad(Road * pRoad,const double maxopvalue)
|
|
|
|
|
|
}
|
|
|
|
|
|
+ if(pgeo0->GetGeomType() == 0)
|
|
|
+ {
|
|
|
+
|
|
|
+ double fobjx,fobjy;
|
|
|
+ //Back Get object optimize point
|
|
|
+ fobjx = pgeo2->GetX() + pgeo1->GetLength() * cos(pgeo2->GetHdg() + M_PI);
|
|
|
+ fobjy = pgeo2->GetY() + pgeo1->GetLength() * sin(pgeo2->GetHdg() + M_PI);
|
|
|
+
|
|
|
+ //Git dis from old point to optimize point
|
|
|
+ double fdis = sqrt(pow(pgeo1->GetX() -fobjx,2) + pow(pgeo1->GetY() - fobjy,2));
|
|
|
+ qDebug("line dis, %f",fdis);
|
|
|
+
|
|
|
+ double fopvalue = fdis;
|
|
|
+
|
|
|
+ //If dis > maxopvalue, set dis to maxopvalue, and change first geo end point.
|
|
|
+ if(fopvalue > maxopvalue)
|
|
|
+ {
|
|
|
+ fopvalue = maxopvalue;
|
|
|
+ double fhdg = CalcHdg(QPointF(pgeo1->GetX(),pgeo1->GetY()),QPointF(fobjx,fobjy));
|
|
|
+ fobjx = pgeo1->GetX() + fopvalue * cos(fhdg);
|
|
|
+ fobjy = pgeo1->GetY() + fopvalue * sin(fhdg);
|
|
|
+ }
|
|
|
+
|
|
|
+ //Calc dis from geo0 startpoint to obj point
|
|
|
+ double flinedis = sqrt(pow(fobjx - pgeo0->GetX(),2)+ pow(fobjy - pgeo0->GetY(),2));
|
|
|
+ //Calc hdg from geo0 startpoint to obj point
|
|
|
+ double fhdglinetoline = CalcHdg(QPointF(pgeo0->GetX(),pgeo0->GetY()),QPointF(fobjx,fobjy));
|
|
|
+
|
|
|
+ pgeo0->SetHdg(fhdglinetoline);
|
|
|
+ pgeo0->SetLength(flinedis);
|
|
|
+
|
|
|
+ //geo1 hdg
|
|
|
+ double flinehdg = CalcHdg(QPointF(fobjx,fobjy),QPointF(pgeo2->GetX(),pgeo2->GetY()));
|
|
|
+
|
|
|
+
|
|
|
+ //Change geo1
|
|
|
+ if(pgeo1->GetGeomType() == 0)
|
|
|
+ {
|
|
|
+ pgeo1->SetX(fobjx);
|
|
|
+ pgeo1->SetY(fobjy);
|
|
|
+ pgeo1->SetHdg(flinehdg);
|
|
|
+ pgeo1->SetLength(sqrt(pow(pgeo2->GetX() - fobjx,2)+pow(pgeo2->GetY() - fobjy,2)));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ double startx,starty,starthdg,endx,endy,endhdg;
|
|
|
+ endx = pgeo2->GetX();endy = pgeo2->GetY();endhdg = pgeo2->GetEndHdg();
|
|
|
+ pgeo0->GetCoords(pgeo0->GetS() + pgeo0->GetLength(),startx,starty,starthdg);
|
|
|
+ std::vector<geobase> xvectorgeo = geofit::CreateBezierGeo(startx,starty,starthdg,endx,endy,endhdg);
|
|
|
+
|
|
|
+ if(xvectorgeo.size()>0)
|
|
|
+ {
|
|
|
+ if(xvectorgeo[0].mnType == 0)
|
|
|
+ {
|
|
|
+ std::vector<GeometryBlock> * pvectorgeob = pRoad->GetGeometryBlockVector();
|
|
|
+ GeometryBlock newline;
|
|
|
+ newline.AddGeometryLine(pgeo1->GetS(),xvectorgeo[0].mfX,xvectorgeo[0].mfY,xvectorgeo[0].mfHdg,xvectorgeo[0].mfLen);
|
|
|
+ pvectorgeob->erase(pvectorgeob->begin()+i);
|
|
|
+ pvectorgeob->insert(pvectorgeob->begin()+i,newline);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ std::vector<GeometryBlock> * pvectorgeob = pRoad->GetGeometryBlockVector();
|
|
|
+ GeometryBlock newpp3;
|
|
|
+ newpp3.AddGeometryParamPoly3(pgeo1->GetS(),xvectorgeo[0].mfX,xvectorgeo[0].mfY,xvectorgeo[0].mfHdg,xvectorgeo[0].mfLen,
|
|
|
+ xvectorgeo[0].mfu[0],xvectorgeo[0].mfu[1],xvectorgeo[0].mfu[2],xvectorgeo[0].mfu[3],
|
|
|
+ xvectorgeo[0].mfv[0],xvectorgeo[0].mfv[1],xvectorgeo[0].mfv[2],xvectorgeo[0].mfv[3]);
|
|
|
+ pvectorgeob->erase(pvectorgeob->begin()+i);
|
|
|
+ pvectorgeob->insert(pvectorgeob->begin()+i,newpp3);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ std::cout<<"Optimize road ,CreateBezierGeo Fail."<<std::endl;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ boptimize = true;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
|
|
|
i = i+2; //Because Optimize, so move 2 step.
|
|
|
}
|
|
@@ -1642,4 +1730,7 @@ void xodrfunc::optimizeroad(Road * pRoad,const double maxopvalue)
|
|
|
pRoad->SetRoadLength(snow);
|
|
|
}
|
|
|
|
|
|
+ if(boptimize)return 1;
|
|
|
+ return 0;
|
|
|
+
|
|
|
}
|