|
@@ -43,6 +43,48 @@ void RoadGeometry::SetGeomType(short int geomType)
|
|
|
}
|
|
|
|
|
|
|
|
|
+double RoadGeometry::CalcHdg(double x0, double y0, double x1, double y1)
|
|
|
+{
|
|
|
+ if(x0 == x1)
|
|
|
+ {
|
|
|
+ if(y0 < y1)
|
|
|
+ {
|
|
|
+ return M_PI/2.0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ return M_PI*3.0/2.0;
|
|
|
+ }
|
|
|
+
|
|
|
+ double ratio = (y1-y0)/(x1-x0);
|
|
|
+
|
|
|
+ double hdg = atan(ratio);
|
|
|
+
|
|
|
+ if(ratio > 0)
|
|
|
+ {
|
|
|
+ if(y1 > y0)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ hdg = hdg + M_PI;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(y1 > y0)
|
|
|
+ {
|
|
|
+ hdg = hdg + M_PI;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ hdg = hdg + 2.0*M_PI;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return hdg;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* Setter for the base properties
|
|
|
*/
|
|
@@ -494,6 +536,55 @@ void GeometrySpiral::GetCoords(double s_check, double &retX, double &retY, doubl
|
|
|
GeometryPoly3::GeometryPoly3 (double s, double x, double y, double hdg, double length, double a, double b,double c, double d ): RoadGeometry(s, x, y, hdg, length)
|
|
|
{
|
|
|
SetGeomType(3); mA=a; mB=b; mC=c; mD=d;
|
|
|
+ UpdateSamplePoint();
|
|
|
+}
|
|
|
+
|
|
|
+void GeometryPoly3::UpdateSamplePoint()
|
|
|
+{
|
|
|
+ double u = 0.0;
|
|
|
+ double du = 0.1;
|
|
|
+ geosamplepoint gsp;
|
|
|
+ gsp.s = 0;
|
|
|
+ gsp.x = mA;
|
|
|
+ gsp.y = 0.0;
|
|
|
+ mvectorgeosample.push_back(gsp);
|
|
|
+ u = du;
|
|
|
+ double v;
|
|
|
+ double flen = 0.0;
|
|
|
+ double oldu,oldv;
|
|
|
+ oldu = mvectorgeosample[0].x;
|
|
|
+ oldv = mvectorgeosample[0].y;
|
|
|
+ while(flen <= mLength)
|
|
|
+ {
|
|
|
+ double fdis = 0;
|
|
|
+ v = mA + mB*u + mC*u*u + mD*u*u*u;
|
|
|
+ fdis = sqrt(pow(u- oldu,2)+pow(v-oldv,2));
|
|
|
+ oldu = u;
|
|
|
+ oldv = v;
|
|
|
+ flen = flen + fdis;
|
|
|
+
|
|
|
+ gsp.s = flen;
|
|
|
+ gsp.x = u;
|
|
|
+ gsp.y = v;
|
|
|
+ mvectorgeosample.push_back(gsp);
|
|
|
+
|
|
|
+ if(fdis < 0.05)
|
|
|
+ {
|
|
|
+ if(fdis > 0)
|
|
|
+ {
|
|
|
+ du = du * 0.1/fdis;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(fdis > 0.2)
|
|
|
+ {
|
|
|
+ du = du * 0.1/fdis;
|
|
|
+ }
|
|
|
+ u = u + du;
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ mbHaveSample = true;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -517,6 +608,7 @@ void GeometryPoly3::SetAll(double s, double x, double y, double hdg, double leng
|
|
|
mC=c;
|
|
|
mD=d;
|
|
|
ComputeVars();
|
|
|
+ UpdateSamplePoint();
|
|
|
}
|
|
|
|
|
|
//GetA to GetD, Added by Yuchuli
|
|
@@ -540,7 +632,6 @@ double GeometryPoly3::GetD()
|
|
|
return mD;
|
|
|
}
|
|
|
|
|
|
-#include "xodrfunc.h"
|
|
|
|
|
|
void GeometryPoly3::GetCoords(double s_check, double &retX, double &retY, double &retHDG)
|
|
|
{
|
|
@@ -553,6 +644,7 @@ void GeometryPoly3::GetCoords(double s_check, double &retX, double &retY, double
|
|
|
oldx = mX;
|
|
|
oldy = mY;
|
|
|
double du =0.1;
|
|
|
+ retHDG = mHdg;
|
|
|
if(currentLength<du)
|
|
|
{
|
|
|
retX = mX;
|
|
@@ -572,7 +664,7 @@ void GeometryPoly3::GetCoords(double s_check, double &retX, double &retY, double
|
|
|
oldy = y;
|
|
|
flen = flen + fdis;
|
|
|
u = u + du;
|
|
|
- retHDG = xodrfunc::CalcHdg(QPointF(oldx,oldy),QPointF(x,y));
|
|
|
+ retHDG = CalcHdg(oldx,oldy,x,y);
|
|
|
|
|
|
}
|
|
|
}
|