|
@@ -870,3 +870,148 @@ double xodrfunc::GetAcurateDis(const double x, const double y, Road *pRoad, con
|
|
|
|
|
|
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+int xodrfunc::GetLineXY(GeometryLine *pline, double soff, double &x, double &y, double &hdg)
|
|
|
+{
|
|
|
+ if(soff<0)return -1;
|
|
|
+
|
|
|
+ hdg = pline->GetHdg();
|
|
|
+ x = pline->GetX() + soff*cos(hdg);
|
|
|
+ y = pline->GetY() + soff*sin(hdg);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+Road * xodrfunc::GetRoadByID(OpenDrive * pxodr,std::string strroadid)
|
|
|
+{
|
|
|
+ Road * pRoad = 0;
|
|
|
+ int nroadcount = pxodr->GetRoadCount();
|
|
|
+ int i;
|
|
|
+ for(i=0;i<nroadcount;i++)
|
|
|
+ {
|
|
|
+ if(pxodr->GetRoad(i)->GetRoadId() == strroadid)
|
|
|
+ {
|
|
|
+ pRoad = pxodr->GetRoad(i);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return pRoad;
|
|
|
+}
|
|
|
+
|
|
|
+int xodrfunc::GetSpiralXY(GeometrySpiral *pspira, double soff, double &x, double &y, double &hdg)
|
|
|
+{
|
|
|
+ pspira->GetCoords(pspira->GetS() + soff,x,y,hdg);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int xodrfunc::GetArcXY(GeometryArc *parc, double soff, double &x, double &y, double &hdg)
|
|
|
+{
|
|
|
+ if(parc->GetCurvature() == 0)return -1;
|
|
|
+ double R = fabs(1.0/parc->GetCurvature());
|
|
|
+
|
|
|
+ //calculate arc center
|
|
|
+ double x_center = parc->GetX() + (1.0/parc->GetCurvature()) * cos(parc->GetHdg() + M_PI/2.0);
|
|
|
+ double y_center = parc->GetY() + (1.0/parc->GetCurvature()) * sin(parc->GetHdg()+ M_PI/2.0);
|
|
|
+
|
|
|
+ double arcdiff = soff/R;
|
|
|
+
|
|
|
+ if(parc->GetCurvature() > 0)
|
|
|
+ {
|
|
|
+ x = x_center + R * cos(parc->GetHdg() + arcdiff - M_PI/2.0);
|
|
|
+ y = y_center + R * sin(parc->GetHdg() + arcdiff - M_PI/2.0);
|
|
|
+ hdg = parc->GetHdg() + arcdiff;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ x = x_center + R * cos(parc->GetHdg() -arcdiff + M_PI/2.0);
|
|
|
+ y = y_center + R * sin(parc->GetHdg() -arcdiff + M_PI/2.0);
|
|
|
+ hdg = parc->GetHdg() - arcdiff;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int xodrfunc::GetParamPoly3XY(GeometryParamPoly3 *pparam3d, double soff, double &x, double &y, double &hdg)
|
|
|
+{
|
|
|
+ double xtem,ytem;
|
|
|
+ double ua,ub,uc,ud,va,vb,vc,vd;
|
|
|
+ ua = pparam3d->GetuA();ub= pparam3d->GetuB();uc= pparam3d->GetuC();ud = pparam3d->GetuD();
|
|
|
+ va = pparam3d->GetvA();vb= pparam3d->GetvB();vc= pparam3d->GetvC();vd = pparam3d->GetvD();
|
|
|
+// xtem = parc->GetuA() + parc->GetuB() * s * len + parc->GetuC() * s*s *pow(len,2) + parc->GetuD() * s*s*s *pow(len,3);
|
|
|
+// ytem = parc->GetvA() + parc->GetvB() * s* len + parc->GetvC() * s*s *pow(len,2) + parc->GetvD() * s*s*s *pow(len,3);
|
|
|
+ xtem = ua + ub * soff + uc * soff * soff + ud * soff *soff*soff ;
|
|
|
+ ytem = va + vb * soff + vc * soff*soff + vd * soff*soff*soff ;
|
|
|
+ x = xtem*cos(pparam3d->GetHdg()) - ytem * sin(pparam3d->GetHdg()) + pparam3d->GetX();
|
|
|
+ y = xtem*sin(pparam3d->GetHdg()) + ytem * cos(pparam3d->GetHdg()) + pparam3d->GetY();
|
|
|
+ if(soff<0.3)hdg = pparam3d->GetHdg();
|
|
|
+ else
|
|
|
+ {
|
|
|
+ double soff1 = soff - 0.1;
|
|
|
+ double x1,y1;
|
|
|
+ xtem = ua + ub * soff1 + uc * soff1 * soff1 + ud * soff1 *soff1*soff1 ;
|
|
|
+ ytem = va + vb * soff1 + vc * soff1*soff1 + vd * soff1*soff1*soff1 ;
|
|
|
+ x1 = xtem*cos(pparam3d->GetHdg()) - ytem * sin(pparam3d->GetHdg()) + pparam3d->GetX();
|
|
|
+ y1 = xtem*sin(pparam3d->GetHdg()) + ytem * cos(pparam3d->GetHdg()) + pparam3d->GetY();
|
|
|
+ hdg = CalcHdg(QPointF(x1,y1),QPointF(x,y));
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int xodrfunc::GetRoadXYByS(Road *pRoad, const double s, double &x, double &y, double &hdg)
|
|
|
+{
|
|
|
+ if(s<0)return -1;
|
|
|
+ if(s>(pRoad->GetRoadLength()+0.1))return -2;
|
|
|
+ if(pRoad == 0)return -3;
|
|
|
+ if(pRoad->GetGeometryBlockCount()<1)return -4;
|
|
|
+ int i;
|
|
|
+ int nroadgeosize = pRoad->GetGeometryBlockCount();
|
|
|
+ RoadGeometry * pgeosel = pRoad->GetGeometryBlock(nroadgeosize -1)->GetGeometryAt(0);
|
|
|
+ for(i=0;i<(nroadgeosize-1);i++)
|
|
|
+ {
|
|
|
+ if(s<pRoad->GetGeometryBlock(i+1)->GetGeometryAt(0)->GetS())
|
|
|
+ {
|
|
|
+
|
|
|
+ pgeosel = pRoad->GetGeometryBlock(0)->GetGeometryAt(0);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ switch (pgeosel->GetGeomType()) {
|
|
|
+ case 0:
|
|
|
+ return GetLineXY((GeometryLine *)pgeosel,(s-pgeosel->GetS()),x,y,hdg);
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ return GetSpiralXY((GeometrySpiral *)pgeosel,(s-pgeosel->GetS()),x,y,hdg);
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ return GetArcXY((GeometryArc *)pgeosel,(s-pgeosel->GetS()),x,y,hdg);
|
|
|
+
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ return GetParamPoly3XY((GeometryParamPoly3 *)pgeosel,(s-pgeosel->GetS()),x,y,hdg);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return -5;
|
|
|
+}
|
|
|
+
|
|
|
+int xodrfunc::GetRoadIndex(OpenDrive * pxodr, Road *pRoad)
|
|
|
+{
|
|
|
+ int nroadcount = pxodr->GetRoadCount();
|
|
|
+ int i;
|
|
|
+ for(i=0;i<nroadcount;i++)
|
|
|
+ {
|
|
|
+ if(pxodr->GetRoad(i) == pRoad)
|
|
|
+ {
|
|
|
+ return i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+}
|