3232#include < cmath>
3333#include < cstdlib>
3434
35+
3536namespace Uncertain {
3637
37- // ! Construction of uncertain point vai 3-vector x and its covariance matrix
38+ // ! Construction of uncertain point via 3-vector x and its covariance matrix
3839uPoint::uPoint (const Vector3d &x,
3940 const Matrix3d &Sigma_xx)
4041 : BasicEntity2D (x, Sigma_xx)
@@ -49,47 +50,57 @@ uPoint::uPoint(const Vector3d &x,
4950// ! Get axis-aligned bounding box
5051Aabb uPoint::bbox () const
5152{
52- double const uu = v (0 );
53- double const vv = v (1 );
54- double const ww = v (2 );
53+ const double uu = v (0 );
54+ const double vv = v (1 );
55+ const double ww = v (2 );
5556 Eigen::Matrix<double ,2 ,3 > JJ;
5657 JJ.col (0 ) << 1 /ww, 0 ;
5758 JJ.col (1 ) << 0 , 1 /ww;
5859 JJ.col (2 ) << -uu/(ww*ww), -vv/(ww*ww);
59- Eigen::Matrix2d Cov_xx = JJ * Cov () * JJ.transpose ();
60+ const Eigen::Matrix2d Cov_xx = JJ * Cov () * JJ.transpose ();
6061
61- double const x = v (0 ) / v (2 );
62- double const y = v (1 ) / v (2 );
62+ const double x = v (0 ) / v (2 );
63+ const double y = v (1 ) / v (2 );
6364
64- double const x_min = x - sqrt (Cov_xx (0 , 0 ));
65- double const x_max = x + sqrt (Cov_xx (0 , 0 ));
66- double const y_min = y - sqrt (Cov_xx (1 , 1 ));
67- double const y_max = y + sqrt (Cov_xx (1 , 1 ));
65+ const double x_min = x - sqrt (Cov_xx (0 , 0 ));
66+ const double x_max = x + sqrt (Cov_xx (0 , 0 ));
67+ const double y_min = y - sqrt (Cov_xx (1 , 1 ));
68+ const double y_max = y + sqrt (Cov_xx (1 , 1 ));
6869
6970 return Aabb{ x_min, x_max, y_min, y_max} ;
7071}
7172
73+
7274// ! Get Euclidean distance to uncertain straight line 'ul'
7375uDistance uPoint::distanceEuclideanTo ( const uStraightLine & ul) const
7476{
7577 const Vector3d l = ul.v ();
7678 const Vector3d x = v ();
7779 const double n = l.head (2 ).norm (); // ||l_h||
78- const double d = v ().dot (l) / (abs ( v (2 ))*n);
80+ const double d_val = v ().dot (l) / (abs ( v (2 ))*n);
81+ const double nax2 = n*fabs (x (2 ));
7982
80- Vector3d JJx;
81- Vector3d JJl;
82- JJx (0 ) = l (0 )/(abs (x (2 ))*n);
83+ /* JJx(0) = l(0)/(abs(x(2))*n);
8384 JJx(1) = l(1)/(abs(x(2))*n);
8485 JJx(2) = l(2)/(abs(x(2))*n) -x.dot(l)*sign(x(2))/( abs(x(2))*abs(x(2)) *n);
8586
8687 JJl(0) = x(0)/(abs(x(2))*n) -x.dot(l)*l(0) / (abs(x(2)) *n*n*n);
8788 JJl(1) = x(1)/(abs(x(2))*n) -x.dot(l)*l(1) / (abs(x(2)) *n*n*n);
88- JJl (2 ) = x (2 )/(abs (x (2 ))*n);
89+ JJl(2) = x(2)/(abs(x(2))*n);*/
90+
91+ Vector3d JJx;
92+ JJx (0 ) = l (0 )/nax2;
93+ JJx (1 ) = l (1 )/nax2;
94+ JJx (2 ) = (-l (0 )*x (0 ) -l (1 )*x (1 ))/( x (2 )*nax2 );
95+
96+ Vector3d JJl;
97+ JJl (0 ) = ( (-l (0 )*l (1 )*x (1 ) -l (0 )*l (2 )*x (2 ) +l (1 )*l (1 )*x (0 ) ) *fabs (x (2 ))) / ( x (2 )*x (2 )*n*n*n);
98+ JJl (1 ) = ( ( l (0 )*l (0 )*x (1 ) -l (0 )*l (1 )*x (0 ) -l (1 )*l (2 )*x (2 ) ) *fabs (x (2 ))) / ( x (2 )*x (2 )*n*n*n);
99+ JJl (2 ) = x (2 )/nax2;
89100
90- double const var_d = JJx.dot ( Cov () * JJx) + JJl.dot (ul.Cov () * JJl);
101+ const double d_var = JJx.dot ( Cov () * JJx) + JJl.dot (ul.Cov () * JJl);
91102
92- return {d,var_d };
103+ return {d_val,d_var };
93104}
94105
95106// ! Get uncertain point in homogeneous coordinates, Euclidean normalized
@@ -109,9 +120,6 @@ uPoint uPoint::euclidean() const
109120// ! Get uncertain point, transformed via 3x3 transformation matrix
110121uPoint uPoint::transformed ( const Matrix3d & TT) const
111122{
112- // uPoint ux(*this);
113- // ux.transform(TT);
114- // return ux;
115123 return {TT*v (), TT*Cov ()*TT.adjoint () };
116124}
117125
@@ -120,32 +128,30 @@ uPoint uPoint::transformed( const Matrix3d & TT) const
120128bool uPoint::isIncidentWith ( const uStraightLine & ul,
121129 const double T) const
122130{
123- double const d = v ().dot (ul.v ()); // d = x'*l
124- double const var_d = ul.v ().dot (Cov () * ul.v ()) + v ().dot ( ul.Cov () * v ()); // uncorrelated
125- Q_ASSERT ( var_d >0 . );
126- double const T_in = (d * d ) / var_d ;
131+ const double d_val = v ().dot (ul.v ()); // d = x'*l
132+ const double d_var = ul.v ().dot (Cov () * ul.v ()) + v ().dot ( ul.Cov () * v ()); // uncorrelated
133+ Q_ASSERT ( d_var >0 . );
134+ double const T_in = (d_val * d_val ) / d_var ;
127135 return (T_in < T);
128136}
129137
130138// ! Get algebraic distance of 'this' and straight line of 'ul'
131139uDistance uPoint::distanceAlgebraicTo ( const uStraightLine & ul ) const
132140{
133- double const d = sign ( v (2 ) ) * v ().dot (ul.v ());
134- Vector3d const JJx = ul.v ().adjoint ();
135- Vector3d const JJl = sign ( v (2 ) ) * v ().adjoint ();
141+ const double d_val = sign ( v (2 ) ) * v ().dot (ul.v ());
142+ const Vector3d JJx = ul.v ().adjoint ();
143+ const Vector3d JJl = sign ( v (2 ) ) * v ().adjoint ();
136144 // JJ = [l', sign(x(3))*x'];
137145
138- double const var_d = JJx.dot ( Cov () * JJx) + JJl.dot (ul.Cov () * JJl); // uncorrelated
146+ const double d_var = JJx.dot ( Cov () * JJx) + JJl.dot (ul.Cov () * JJl); // uncorrelated
139147
140- return {d, var_d };
148+ return {d_val, d_var };
141149}
142150
143151// ! Get uncertain point in homogeneous coordinates, spherically normalized
144152uPoint uPoint::sphericalNormalized () const
145153{
146- // uPoint ux = *this ;
147154 uPoint ux (*this );
148- // uPoint ux = uPoint(*this);
149155 ux.normalizeSpherical ();
150156 return ux; // Compiler invokes the copy constructor.
151157}
0 commit comments