![]() |
![]() |
#include <RecoPixelVertexing/PixelTrackFitting/src/CircleFromThreePoints.h>
Public Types | |
typedef Basic2DVector< float > | Vector2D |
Public Member Functions | |
Vector2D | center () const |
returns the position of the center of the circle. | |
CircleFromThreePoints (const GlobalPoint &inner, const GlobalPoint &mid, const GlobalPoint &outer, double precision=1.e-7) | |
Construct from three points (see class description). | |
CircleFromThreePoints () | |
dummy | |
float | curvature () const |
Returns the curvature (1/radius), in cm^(-1). | |
Private Member Functions | |
void | init (const Vector2D &b, const Vector2D &c, const Vector2D &offset, double precision) |
Private Attributes | |
Vector2D | theCenter |
float | theCurvature |
The input points are three dimensional for convenience, but the calculation is done in the transverse (x,y) plane. No verification of the reasonableness of the z coordinate is done. If the three points lie on a line the curvature is zero and the center position is undefined. The 3 points are assumed to make sense: if the distance between two of them is very small compared to the ditance to the third the result will be numerically unstable.
Definition at line 18 of file CircleFromThreePoints.h.
typedef Basic2DVector<float> CircleFromThreePoints::Vector2D |
Definition at line 24 of file CircleFromThreePoints.h.
CircleFromThreePoints::CircleFromThreePoints | ( | ) | [inline] |
CircleFromThreePoints::CircleFromThreePoints | ( | const GlobalPoint & | inner, | |
const GlobalPoint & | mid, | |||
const GlobalPoint & | outer, | |||
double | precision = 1.e-7 | |||
) |
Construct from three points (see class description).
The order of points is not essential, but accuracy should be better if the second point lies between the other two on the circle. The optional argument "precision" specifies how accurately the straight line check has to be satisfied for setting the curvature to zero and the center position to "undefined".
Definition at line 3 of file CircleFromThreePoints.cc.
References b, c, init(), PV3DBase< T, PVType, FrameType >::x(), and PV3DBase< T, PVType, FrameType >::y().
00007 { 00008 // move to frame where inner.x() == inner.y() == 0; 00009 Vector2D b( mid.x()-inner.x(), mid.y()-inner.y()); 00010 Vector2D c( outer.x()-inner.x(), outer.y()-inner.y()); 00011 init( b, c, Vector2D( inner.x(), inner.y()), precision); 00012 }
Vector2D CircleFromThreePoints::center | ( | ) | const [inline] |
returns the position of the center of the circle.
If curvature is zero, center() throws an exception to avoid use of undefined position. If the curvature is very small the position of the center will be very inaccurate.
Definition at line 52 of file CircleFromThreePoints.h.
References theCenter.
Referenced by TrackFitter::run(), and PixelFitterByHelixProjections::run().
00052 { return theCenter; }
float CircleFromThreePoints::curvature | ( | ) | const [inline] |
Returns the curvature (1/radius), in cm^(-1).
The curvature is precomputed, this is just access method (takes no time). If curvature is zero the center is undefined (see description of presicion above).
Definition at line 44 of file CircleFromThreePoints.h.
References theCurvature.
Referenced by TrackFitter::run(), and PixelFitterByHelixProjections::run().
00044 { return theCurvature;}
void CircleFromThreePoints::init | ( | const Vector2D & | b, | |
const Vector2D & | c, | |||
const Vector2D & | offset, | |||
double | precision | |||
) | [private] |
Definition at line 14 of file CircleFromThreePoints.cc.
References b2, c2, k, Basic2DVector< T >::mag2(), funct::sqrt(), theCenter, theCurvature, Basic2DVector< T >::x(), and Basic2DVector< T >::y().
Referenced by CircleFromThreePoints().
00016 { 00017 double b2 = b.mag2(); 00018 double c2 = c.mag2(); 00019 00020 double oX(0), oY(0); 00021 bool solved = false; 00022 if (fabs(b.x()) > fabs(b.y())) { // solve for y first 00023 double k = c.x()/b.x(); 00024 double div = 2*(k*b.y() - c.y()); 00025 if (fabs(div) < precision) theCurvature = 0; // if the 3 points lie on a line 00026 else { 00027 oY = (k*b2 - c2) / div; 00028 oX = b2/(2*b.x()) - b.y()/b.x() * oY; 00029 solved = true; 00030 } 00031 } 00032 else { // solve for x first 00033 double k = c.y()/b.y(); 00034 double div = 2*(k*b.x()-c.x()); 00035 if (fabs(div) < precision) theCurvature = 0; // if the 3 points lie on a line 00036 else { 00037 oX = (k*b2 - c2) / div; 00038 oY = b2/(2*b.y()) - b.x()/b.y() * oX; 00039 solved = true; 00040 } 00041 } 00042 if (solved) { 00043 theCurvature = 1./sqrt(oX*oX + oY*oY); 00044 double xC = oX + offset.x(); 00045 double yC = oY + offset.y(); 00046 theCenter = Vector2D( xC, yC); 00047 // thePhi = acos(xC/sqrt(xC*xC + yC*yC)); 00048 00049 // if (xC<0.) thePhi = thePhi - PI; 00050 // cout << setiosflags(ios::showpoint | ios::fixed); 00051 // 00052 // cout << "CircleFromThreePoints::init curv = " << theCurvature << endl; 00053 // cout << "CircleFromThreePoints::init center prime = " << oX << " " << oY << endl; 00054 // cout << "CircleFromThreePoints::init offset = " << offset.x() << " " << offset.y() << endl; 00055 // cout << "CircleFromThreePoints::init center = " << theCenter.x()<< " " << theCenter.y() << endl; 00056 // 00057 // float d = sqrt(theCenter.x()*theCenter.x()+theCenter.y()*theCenter.y()); 00058 // cout << "CircleFromThreePoints::init dfloat = " << setw(10) << setprecision(5) << d << endl; 00059 // cout << "CircleFromThreePoints::init radius = " << 1/theCurvature << endl; 00060 } 00061 }
Vector2D CircleFromThreePoints::theCenter [private] |
float CircleFromThreePoints::theCurvature [private] |