CMS 3D CMS Logo

CircleFromThreePoints Class Reference

Computes the curvature (1/radius) and, if possible, the center of the circle passing through three points. More...

#include <RecoPixelVertexing/PixelTrackFitting/src/CircleFromThreePoints.h>

List of all members.

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


Detailed Description

Computes the curvature (1/radius) and, if possible, the center of the circle passing through three points.

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.


Member Typedef Documentation

typedef Basic2DVector<float> CircleFromThreePoints::Vector2D

Definition at line 24 of file CircleFromThreePoints.h.


Constructor & Destructor Documentation

CircleFromThreePoints::CircleFromThreePoints (  )  [inline]

dummy

Definition at line 22 of file CircleFromThreePoints.h.

00022 {}

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 }


Member Function Documentation

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 }


Member Data Documentation

Vector2D CircleFromThreePoints::theCenter [private]

Definition at line 57 of file CircleFromThreePoints.h.

Referenced by center(), and init().

float CircleFromThreePoints::theCurvature [private]

Definition at line 56 of file CircleFromThreePoints.h.

Referenced by curvature(), and init().


The documentation for this class was generated from the following files:
Generated on Tue Jun 9 18:16:19 2009 for CMSSW by  doxygen 1.5.4